diff options
author | Paul J. Davis <paul.joseph.davis@gmail.com> | 2018-09-19 10:45:40 -0500 |
---|---|---|
committer | Paul J. Davis <paul.joseph.davis@gmail.com> | 2018-09-19 10:45:40 -0500 |
commit | 04eed00269ca8979ba0245ca2a00977bdfee6905 (patch) | |
tree | d26bc5740069aae9f872c3fdd13e7edf2f9fb0ef | |
parent | d9d5ef2bd3f029a9c976102780944d4183641b81 (diff) | |
download | couchdb-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.erl | 57 |
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. |