diff options
author | Paul J. Davis <paul.joseph.davis@gmail.com> | 2020-08-28 11:34:03 -0500 |
---|---|---|
committer | Paul J. Davis <paul.joseph.davis@gmail.com> | 2020-09-03 12:06:42 -0500 |
commit | 383f8b430a87a663a70c3c97e8812b3f2d0aae7b (patch) | |
tree | f0810a20fac02c79a4204ca5b685f3b32a534688 | |
parent | c66bb2853cb6d2d7be6d45c7db0fdb648d912e1a (diff) | |
download | couchdb-383f8b430a87a663a70c3c97e8812b3f2d0aae7b.tar.gz |
Use ebtree caching API
-rw-r--r-- | src/couch_views/src/couch_views_fdb.erl | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/src/couch_views/src/couch_views_fdb.erl b/src/couch_views/src/couch_views_fdb.erl index 31c41e184..fe52853ba 100644 --- a/src/couch_views/src/couch_views_fdb.erl +++ b/src/couch_views/src/couch_views_fdb.erl @@ -376,7 +376,8 @@ open_id_tree(TxDb, Sig) -> } = TxDb, Prefix = id_tree_prefix(DbPrefix, Sig), TreeOpts = [ - {persist_fun, fun persist_chunks/3} + {persist_fun, fun persist_chunks/3}, + {cache_fun, create_cache_fun(id_tree)} ], ebtree:open(Tx, Prefix, get_order(id_btree), TreeOpts). @@ -393,7 +394,8 @@ open_view_tree(TxDb, Sig, Lang, View) -> TreeOpts = [ {collate_fun, couch_views_util:collate_fun(View)}, {reduce_fun, make_reduce_fun(Lang, View)}, - {persist_fun, fun persist_chunks/3} + {persist_fun, fun persist_chunks/3}, + {cache_fun, create_cache_fun({view, ViewId})} ], View#mrview{ btree = ebtree:open(Tx, Prefix, get_order(view_btree), TreeOpts) @@ -465,6 +467,30 @@ persist_chunks(Tx, clear, Key) -> erlfdb:clear_range_startswith(Tx, Key). +create_cache_fun(TreeId) -> + CacheTid = case get(TreeId) of + undefined -> + Tid = ets:new(?MODULE, [protected, set]), + put(TreeId, {ebtree_cache, Tid}), + Tid; + {ebtree_cache, Tid} -> + Tid + end, + fun + (set, [Id, Node]) -> + true = ets:insert_new(CacheTid, {Id, Node}), + ok; + (clear, Id) -> + ets:delete(CacheTid, Id), + ok; + (get, Id) -> + case ets:lookup(CacheTid, Id) of + [{Id, Node}] -> Node; + [] -> undefined + end + end. + + to_map_opts(Options) -> Dir = case lists:keyfind(dir, 1, Options) of {dir, D} -> D; |