You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2016/10/17 21:36:01 UTC

[9/9] couch commit: updated refs/heads/HACK-benchmark-COUCHDB-3191-improve-couch-lru-performance to 4c4cebc

HACK: For performance benchmarking only

This is just cause its easier for us to run benchmarks repeatedly while
we can change the config between runs. Otherwise we'd have to create two
releases and swap back and forth between them. Dynamic dispatch may have
a bit of a cost here but theoretically it should be a constant cost
between the two implementations.


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

Branch: refs/heads/HACK-benchmark-COUCHDB-3191-improve-couch-lru-performance
Commit: 4c4cebc008915951a3638419be39fda95723a568
Parents: 3a04035
Author: Paul J. Davis <pa...@gmail.com>
Authored: Mon Oct 17 16:22:01 2016 -0500
Committer: Paul J. Davis <pa...@gmail.com>
Committed: Mon Oct 17 16:22:01 2016 -0500

----------------------------------------------------------------------
 src/couch_server.erl | 74 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 57 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/4c4cebc0/src/couch_server.erl
----------------------------------------------------------------------
diff --git a/src/couch_server.erl b/src/couch_server.erl
index b1273e1..b012478 100644
--- a/src/couch_server.erl
+++ b/src/couch_server.erl
@@ -36,7 +36,8 @@
     dbs_open=0,
     start_time="",
     update_lru_on_read=true,
-    lru = couch_lru:new()
+    lru,
+    lru_mod = couch_lru
     }).
 
 dev_start() ->
@@ -191,10 +192,18 @@ init([]) ->
     ets:new(couch_dbs, [set, protected, named_table, {keypos, #db.name}]),
     ets:new(couch_dbs_pid_to_name, [set, protected, named_table]),
     process_flag(trap_exit, true),
+    LruMod = case config:get("couchdb", "lru_mod", "couch_lru") of
+        "couch_lru2" ->
+            couch_lru2;
+        _ ->
+            couch_lru
+    end,
     {ok, #server{root_dir=RootDir,
                 max_dbs_open=MaxDbsOpen,
                 update_lru_on_read=UpdateLruOnRead,
-                start_time=couch_util:rfc1123_date()}}.
+                start_time=couch_util:rfc1123_date(),
+                lru = LruMod:new(),
+                lru_mod = LruMod}}.
 
 terminate(Reason, Srv) ->
     couch_log:error("couch_server terminating with ~p, state ~2048p",
@@ -281,9 +290,9 @@ make_room(Server, Options) ->
 maybe_close_lru_db(#server{dbs_open=NumOpen, max_dbs_open=MaxOpen}=Server)
         when NumOpen < MaxOpen ->
     {ok, Server};
-maybe_close_lru_db(#server{lru=Lru}=Server) ->
+maybe_close_lru_db(Server) ->
     try
-        {ok, db_closed(Server#server{lru = couch_lru:close(Lru)}, [])}
+        {ok, db_closed(lru_close(Server)), [])}
     catch error:all_dbs_active ->
         {error, all_dbs_active}
     end.
@@ -319,9 +328,9 @@ open_async(Server, From, DbName, Filepath, Options) ->
     true = ets:insert(couch_dbs_pid_to_name, {Opener, DbName}),
     db_opened(Server, Options).
 
-handle_call(close_lru, _From, #server{lru=Lru} = Server) ->
+handle_call(close_lru, _From, #server{} = Server) ->
     try
-        {reply, ok, db_closed(Server#server{lru = couch_lru:close(Lru)}, [])}
+        {reply, ok, db_closed(Server, [])}
     catch error:all_dbs_active ->
         {reply, {error, all_dbs_active}, Server}
     end;
@@ -357,13 +366,12 @@ handle_call({open_result, T0, DbName, {ok, Db}}, {FromPid, _Tag}, Server) ->
     end,
     true = ets:insert(couch_dbs, Db),
     true = ets:insert(couch_dbs_pid_to_name, {Db#db.main_pid, DbName}),
-    Lru = case couch_db:is_system_db(Db) of
+    case couch_db:is_system_db(Db) of
         false ->
-            couch_lru:insert(DbName, Server#server.lru);
+            {reply, ok, lru_insert(Server, DbName)};
         true ->
-            Server#server.lru
-    end,
-    {reply, ok, Server#server{lru = Lru}};
+            {reply, ok, Server}
+    end;
 handle_call({open_result, T0, DbName, {error, eexist}}, From, Server) ->
     handle_call({open_result, T0, DbName, file_exists}, From, Server);
 handle_call({open_result, _T0, DbName, Error}, {FromPid, _Tag}, Server) ->
@@ -486,11 +494,10 @@ handle_call({db_updated, #db{}=Db}, _From, Server0) ->
     Server = try ets:lookup_element(couch_dbs, DbName, #db.instance_start_time) of
         StartTime ->
             true = ets:insert(couch_dbs, Db),
-            Lru = case couch_db:is_system_db(Db) of
-                false -> couch_lru:update(DbName, Server0#server.lru);
-                true -> Server0#server.lru
-            end,
-            Server0#server{lru = Lru};
+            case couch_db:is_system_db(Db) of
+                false -> lru_update(Server0, DbName);
+                true -> Server0
+            end;
         _ ->
             Server0
     catch _:_ ->
@@ -499,7 +506,7 @@ handle_call({db_updated, #db{}=Db}, _From, Server0) ->
     {reply, ok, Server}.
 
 handle_cast({update_lru, DbName}, #server{lru = Lru, update_lru_on_read=true} = Server) ->
-    {noreply, Server#server{lru = couch_lru:update(DbName, Lru)}};
+    {noreply, lru_update(Server, DbName)};
 handle_cast({update_lru, _DbName}, Server) ->
     {noreply, Server};
 handle_cast(Msg, Server) ->
@@ -550,6 +557,39 @@ db_closed(Server, Options) ->
         true -> Server
     end.
 
+
+lru_insert(Server, DbName) ->
+    #server{
+        lru = Lru,
+        lru_mod = LruMod
+    } = Server,
+    NewLru = LruMod:insert(DbName, Lru),
+    Server#server{
+        lru = NewLru
+    }.
+
+
+lru_update(Server, DbName) ->
+    #server{
+        lru = Lru,
+        lru_mod = LruMod
+    } = Server,
+    NewLru = LruMod:update(DbName, Lru),
+    Server#server{
+        lru = NewLru
+    }.
+
+
+lru_close(Server) ->
+    #server{
+        lru = Lru,
+        lru_mod = LruMod
+    } = Server,
+    NewLru = LruMod:close(Lru),
+    Server#server{
+        lru = NewLru
+    }.
+
 -ifdef(TEST).
 -include_lib("eunit/include/eunit.hrl").