You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by bb...@apache.org on 2017/03/08 20:39:28 UTC

[4/6] couch-index commit: updated refs/heads/8409-view-cache to 5a9f05c

squash


Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch-index/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch-index/commit/ada99aa0
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch-index/tree/ada99aa0
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch-index/diff/ada99aa0

Branch: refs/heads/8409-view-cache
Commit: ada99aa0956d7d5908fe8d94a6e6d6c524563266
Parents: 78a65a3
Author: Benjamin Bastian <be...@gmail.com>
Authored: Thu Mar 2 19:12:00 2017 -0800
Committer: Benjamin Bastian <be...@gmail.com>
Committed: Thu Mar 2 19:12:00 2017 -0800

----------------------------------------------------------------------
 src/couch_index_server.erl | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-couch-index/blob/ada99aa0/src/couch_index_server.erl
----------------------------------------------------------------------
diff --git a/src/couch_index_server.erl b/src/couch_index_server.erl
index 21028a1..f191700 100644
--- a/src/couch_index_server.erl
+++ b/src/couch_index_server.erl
@@ -34,11 +34,13 @@
 
 -define(RELISTEN_DELAY, 5000).
 -define(MAX_INDEXES_OPEN, 500).
+-define(CLOSE_INTERVAL, 5000).
 
 -record(st, {
     root_dir,
     soft_max_indexes,
-    open
+    open,
+    timer
 }).
 
 start_link() ->
@@ -130,9 +132,10 @@ init([]) ->
     couch_event:link_listener(?MODULE, handle_db_event, nil, [all_dbs]),
     RootDir = couch_index_util:root_dir(),
     couch_file:init_delete_dir(RootDir),
+    {ok, Timer} = timer:send_interval(?CLOSE_INTERVAL, close_idle),
     MaxIndexes = list_to_integer(
         config:get("couchdb", "soft_max_indexes_open", integer_to_list(?MAX_INDEXES_OPEN))),
-    {ok, #st{root_dir=RootDir, soft_max_indexes=MaxIndexes, open=0}}.
+    {ok, #st{root_dir=RootDir, soft_max_indexes=MaxIndexes, open=0, timer=Timer}}.
 
 
 terminate(_Reason, _State) ->
@@ -158,19 +161,22 @@ maybe_close_idle(State) ->
 close_idle(State, '$end_of_table') ->
     State;
 
-close_idle(State, Name) ->
-    true = ets:delete(?BY_IDLE, Name),
-    case ets:lookup(?BY_SIG, Name) of
+close_idle(State, {DbName, Sig}) ->
+    true = ets:delete(?BY_IDLE, {DbName, Sig}),
+    case ets:lookup(?BY_SIG, {DbName, Sig}) of
         [{_, {Pid, _Monitor}}] ->
             couch_index:stop(Pid),
+            [{DbName, {DDocId, Sig}}] =
+                ets:match_object(?BY_DB, {DbName, {'$1', Sig}}),
+            rem_from_ets(DbName, Sig, DDocId, Pid),
             case closed(State) of
                 NewState when NewState#st.open > State#st.soft_max_indexes ->
-                    close_idle(NewState, ets:next(?BY_IDLE, Name));
+                    close_idle(NewState, ets:next(?BY_IDLE, {DbName, Sig}));
                 NewState ->
                     NewState
             end;
         [] ->
-            close_idle(State, ets:next(?BY_IDLE, Name))
+            close_idle(State, ets:next(?BY_IDLE, {DbName, Sig}))
     end.
 
 
@@ -238,6 +244,11 @@ handle_info({'EXIT', Pid, Reason}, Server) ->
         _Else ->
             {noreply, Server}
     end;
+handle_info(close_idle, State) ->
+    {ok, NewState} = maybe_close_idle(State),
+    {ok, cancel} = timer:cancel(State#st.timer),
+    {ok, Timer} = timer:send_interval(?CLOSE_INTERVAL, close_idle),
+    {noreply, NewState#st{timer=Timer}};
 handle_info(restart_config_listener, State) ->
     ok = config:listen_for_changes(?MODULE, couch_index_util:root_dir()),
     {noreply, State};