couchdb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jan Lehnardt <...@apache.org>
Subject Re: git commit: (COUCHDB-1305) isolate db process crashes
Date Sat, 26 Jan 2013 22:11:16 GMT

On Jan 26, 2013, at 21:52 , randall@apache.org wrote:

> Updated Branches:
>  refs/heads/master acd5f6876 -> 09d6787ef
> 
> 
> (COUCHDB-1305) isolate db process crashes
> 
> Merge of 1305-fix-isolate-db-crashes
> 
> [@davisp: I'll keep doing this nonsense until we allow merge commits!]

<3

> 
> Note that there was previously a small error where couch_sys_dbs ETS
> table was being searched for a #db record rather than the db name.
> 
> That's fixed here because I saw it. Sorry for not making it a
> separate commit.
> 
> Squashed commit of the following:
> 
> commit f9e4e8a6e426d1569fac4cd707bbd393b102147d
> Author: Randall Leeds <randall@apache.org>
> Date:   Sat Jan 26 06:28:20 2013 -0800
> 
>    don't handle case clause when death happens anyway
> 
>    Presumably the reason for the process exit is already logged by
>    the exiting process (unlike an unexpected message of another sort
>    which may not have been logged already).
> 
> commit 10a052a3eddbd7e89b553966895ee38a9ce439d4
> Author: Randall Leeds <randall@apache.org>
> Date:   Sat Jan 26 06:25:23 2013 -0800
> 
>    consolidate two similar handle_info clauses
> 
> commit 6f3feb09e347dfe0c6812fd71e3f40d15d8d1ced
> Author: Randall Leeds <randall@apache.org>
> Date:   Sat Jan 26 04:35:35 2013 -0800
> 
>    isolate db process crashes in couch_server
> 
>    closes COUCHDB-1305
> 
> 
> Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
> Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/09d6787e
> Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/09d6787e
> Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/09d6787e
> 
> Branch: refs/heads/master
> Commit: 09d6787efdd40f7dd10dbb34cf80a9d88e1af502
> Parents: acd5f68
> Author: Randall Leeds <randall@apache.org>
> Authored: Sat Jan 26 12:39:58 2013 -0800
> Committer: Randall Leeds <randall@apache.org>
> Committed: Sat Jan 26 12:51:07 2013 -0800
> 
> ----------------------------------------------------------------------
> src/couchdb/couch_server.erl |   51 ++++++++++++++++++++++++++-----------
> 1 files changed, 36 insertions(+), 15 deletions(-)
> ----------------------------------------------------------------------
> 
> 
> http://git-wip-us.apache.org/repos/asf/couchdb/blob/09d6787e/src/couchdb/couch_server.erl
> ----------------------------------------------------------------------
> diff --git a/src/couchdb/couch_server.erl b/src/couchdb/couch_server.erl
> index 6e25235..8189761 100644
> --- a/src/couchdb/couch_server.erl
> +++ b/src/couchdb/couch_server.erl
> @@ -426,27 +426,48 @@ code_change(_OldVsn, State, _Extra) ->
> 
> handle_info({'EXIT', _Pid, config_change}, Server) ->
>     {noreply, shutdown, Server};
> -handle_info({'EXIT', Pid, snappy_nif_not_loaded}, Server) ->
> +handle_info({'EXIT', Pid, Reason}, Server) ->
>     Server2 = case ets:lookup(couch_dbs_by_pid, Pid) of
>     [{Pid, Db}] ->
> -        [{Db, {opening, Pid, Froms}}] = ets:lookup(couch_dbs_by_name, Db),
> -        Msg = io_lib:format("To open the database `~s`, Apache CouchDB "
> -            "must be built with Erlang OTP R13B04 or higher.", [Db]),
> -        ?LOG_ERROR(Msg, []),
> -        lists:foreach(
> -            fun(F) -> gen_server:reply(F, {bad_otp_release, Msg}) end,
> -            Froms),
> -        true = ets:delete(couch_dbs_by_name, Db),
> -        true = ets:delete(couch_dbs_by_pid, Pid),
> -        case ets:lookup(couch_sys_dbs, Db) of
> +        DbName = Db#db.name,
> +
> +        % If the Pid is known, the name should be as well.
> +        % If not, that's an error, which is why there is no [] clause.
> +        case ets:lookup(couch_dbs_by_name, DbName) of
> +        [{_, {opening, Pid, Froms}}] ->
> +            Msg = case Reason of
> +            snappy_nif_not_loaded ->
> +                io_lib:format(
> +                    "To open the database `~s`, Apache CouchDB "
> +                    "must be built with Erlang OTP R13B04 or higher.",
> +                    [Db]
> +                );
> +            true ->
> +                io_lib:format("Error opening database ~p: ~p", [DbName, Reason])
> +            end,
> +            ?LOG_ERROR(Msg, []),
> +            lists:foreach(
> +              fun(F) -> gen_server:reply(F, {bad_otp_release, Msg}) end,
> +              Froms
> +            );
> +        [{_, {opened, Pid, LruTime}}] ->
> +            ?LOG_ERROR(
> +                "Unexpected exit of database process ~p [~p]: ~p",
> +                [Pid, DbName, Reason]
> +            ),
> +            true = ets:delete(couch_dbs_by_lru, LruTime)
> +        end,
> +
> +        true = ets:delete(couch_dbs_by_pid, DbName),
> +        true = ets:delete(couch_dbs_by_name, DbName),
> +
> +        case ets:lookup(couch_sys_dbs, DbName) of
>         [{Db, _}] ->
> -            true = ets:delete(couch_sys_dbs, Db),
> +            true = ets:delete(couch_sys_dbs, DbName),
>             Server;
>         [] ->
>             Server#server{dbs_open = Server#server.dbs_open - 1}
> -        end;
> -    _ ->
> -        Server
> +        end
>     end,
>     {noreply, Server2};
> handle_info(Error, _Server) ->
> 


Mime
View raw message