You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ra...@apache.org on 2013/01/26 13:38:03 UTC
git commit: isolate db process crashes in couch_server
Updated Branches:
refs/heads/1305-fix-isolate-db-crashes [created] 6f3feb09e
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/6f3feb09
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/6f3feb09
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/6f3feb09
Branch: refs/heads/1305-fix-isolate-db-crashes
Commit: 6f3feb09e347dfe0c6812fd71e3f40d15d8d1ced
Parents: 67e75c2
Author: Randall Leeds <ra...@apache.org>
Authored: Sat Jan 26 04:35:35 2013 -0800
Committer: Randall Leeds <ra...@apache.org>
Committed: Sat Jan 26 04:35:35 2013 -0800
----------------------------------------------------------------------
src/couchdb/couch_server.erl | 22 ++++++++++++++++++++++
1 files changed, 22 insertions(+), 0 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb/blob/6f3feb09/src/couchdb/couch_server.erl
----------------------------------------------------------------------
diff --git a/src/couchdb/couch_server.erl b/src/couchdb/couch_server.erl
index 6e25235..c9ffeab 100644
--- a/src/couchdb/couch_server.erl
+++ b/src/couchdb/couch_server.erl
@@ -449,6 +449,28 @@ handle_info({'EXIT', Pid, snappy_nif_not_loaded}, Server) ->
Server
end,
{noreply, Server2};
+handle_info({'EXIT', Pid, Reason}=Error, Server) ->
+ case ets:lookup(couch_dbs_by_pid, Pid) of
+ [{Pid, Db}] ->
+ DbName = Db#db.name,
+ ?LOG_ERROR(
+ "Unexpected exit of database process ~p [~p], restarting: ~p",
+ [Pid, DbName, Reason]
+ ),
+ % If the Pid is known, the name should be as well.
+ % If not, that's an error we'll let crash out on this case statement.
+ case ets:lookup(couch_dbs_by_name, DbName) of
+ [{_, {opening, Pid, _Froms}}] ->
+ ok;
+ [{_, {opened, Pid, LruTime}}] ->
+ true = ets:delete(couch_dbs_by_lru, LruTime)
+ end,
+ true = ets:delete(couch_dbs_by_name, DbName),
+ true = ets:delete(couch_dbs_by_pid, DbName);
+ true ->
+ ?LOG_ERROR("Unexpected message, restarting couch_server: ~p", [Error])
+ end,
+ {noreply, Server};
handle_info(Error, _Server) ->
?LOG_ERROR("Unexpected message, restarting couch_server: ~p", [Error]),
exit(kill).