Simplify pulling out all design document ids from the cache
authorBrian Mitchell <brian@cloudant.com>
Fri, 11 Oct 2013 16:25:34 +0000 (12:25 -0400)
committerRobert Newson <rnewson@apache.org>
Tue, 29 Jul 2014 10:50:55 +0000 (11:50 +0100)
This allows the code to avoid copying the entire ets entries into
code from a separate module for both efficiency and modularity
purposes. This requires the new ets_lru match code to function.

It currently uses match which is dispatched to the gen_server.
It might be wise to make it direct since the match code does not
update access times (or if it did, we could make that a cast).

src/ddoc_cache_opener.erl

index 258b5fc..b34359f 100644 (file)
@@ -105,17 +105,7 @@ handle_cast({evict, DbName, DDocIds}, St) ->
     {noreply, St};
 
 handle_cast({do_evict, DbName}, St) ->
-    % Bit of hack to introspect the ets_lru ETS tables directly
-    % but I think this is better than having to manage our own
-    % DbName -> DDocIdList table
-    DDocIds = ets:foldl(fun(Obj, Acc) ->
-        entry = element(1, Obj), % assert this is an entry record
-        {EntryDbName, EntryDDocId} = element(2, Obj),
-        case EntryDbName == DbName of
-            true -> [EntryDDocId | Acc];
-            false -> Acc
-        end
-    end, [], ddoc_cache_lru_objects),
+    DDocIds = ets_lru:match(?CACHE, {DbName, '$1'}, '_'),
     handle_cast({do_evict, DbName, DDocIds}, St);
 
 handle_cast({do_evict, DbName, DDocIds}, St) ->