summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J. Davis <paul.joseph.davis@gmail.com>2018-09-19 10:45:40 -0500
committerPaul J. Davis <paul.joseph.davis@gmail.com>2018-09-19 10:45:40 -0500
commit04eed00269ca8979ba0245ca2a00977bdfee6905 (patch)
treed26bc5740069aae9f872c3fdd13e7edf2f9fb0ef
parentd9d5ef2bd3f029a9c976102780944d4183641b81 (diff)
downloadcouchdb-04eed00269ca8979ba0245ca2a00977bdfee6905.tar.gz
Only update our stats once per close operation
This minimizes the number of times we have to update the lru_skip stat by just accumulatig the total and adding all skips at once when the close operation is finished.
-rw-r--r--src/couch/src/couch_server.erl57
1 files changed, 29 insertions, 28 deletions
diff --git a/src/couch/src/couch_server.erl b/src/couch/src/couch_server.erl
index 3d5eace70..65339fc66 100644
--- a/src/couch/src/couch_server.erl
+++ b/src/couch/src/couch_server.erl
@@ -356,32 +356,38 @@ maybe_close_lru_db(#server{lru=Lru}=Server) ->
end.
-close_lru(Lru) ->
- NewestDbName = couch_lru:peek_newest(Lru),
- close_lru(NewestDbName, Lru).
+close_lru(Lru0) ->
+ NewestDbName = couch_lru:peek_newest(Lru0),
+ case close_lru(NewestDbName, Lru0, 0) of
+ {Status, Lru1, 0} ->
+ {Status, Lru1};
+ {Status, Lru1, Skipped} ->
+ StatName = [couchdb, couch_server, lru_skip],
+ couch_stats:increment_counter(StatName, Skipped),
+ {Status, Lru1}
+ end.
-close_lru(NewestDbName, Lru) ->
- case couch_lru:pop(Lru) of
- {undefined, NewLru} ->
- {false, NewLru};
- {DbName, NewLru} ->
+close_lru(NewestDbName, Lru0, Skipped0) ->
+ case couch_lru:pop(Lru0) of
+ {undefined, Lru1} ->
+ {false, Lru1};
+ {DbName, Lru1} ->
case close_lru_int(DbName) of
- true ->
- {true, NewLru};
- false ->
- case DbName == NewestDbName of
- true ->
- {false, NewLru};
- false ->
- close_lru(NewestDbName, couch_lru:push(DbName, NewLru))
- end;
- skip ->
+ closed ->
+ {true, Lru1, Skipped0};
+ Continue ->
+ {Lru2, Skipped1} = case Continue of
+ skipped ->
+ {couch_lru:push(DbName, Lru1), Skipped0 + 1};
+ ignored ->
+ {Lru1, Skipped0}
+ end,
case DbName == NewestDbName of
true ->
- {false, NewLru};
+ {false, Lru2, Skipped1};
false ->
- close_lru(NewestDbName, NewLru)
+ close_lru(NewestDbName, Lru2, Skipped1)
end
end
end.
@@ -396,19 +402,14 @@ close_lru_int(DbName) ->
true = ets:delete(couch_dbs, DbName),
true = ets:delete(couch_dbs_pid_to_name, Pid),
exit(Pid, kill),
- true;
+ closed;
false ->
ElemSpec = {#entry.lock, unlocked},
true = ets:update_element(couch_dbs, DbName, ElemSpec),
- couch_stats:increment_counter([
- couchdb,
- couch_server,
- lru_skip
- ]),
- false
+ skipped
end;
false ->
- skip
+ ignored
end.