From 8c48a13e1f996b5aa49497031737dee6818dc331 Mon Sep 17 00:00:00 2001 From: Magnus Ahltorp Date: Tue, 15 Mar 2016 23:42:35 +0100 Subject: Added caching of first entry not known to be present --- src/frontend.erl | 39 +++++++++++++++++++++++++++++++++++++-- src/plop_app.erl | 1 + 2 files changed, 38 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/frontend.erl b/src/frontend.erl index 04e307c..3dbf3af 100644 --- a/src/frontend.erl +++ b/src/frontend.erl @@ -5,7 +5,7 @@ -module(frontend). %% API (URL) --export([request/4]). +-export([request/4, init_module/0]). -define(APPURL_PLOP_FRONTEND, "plop/v1/frontend"). -define(APPURL_PLOP_MERGE, "plop/v1/merge"). @@ -324,9 +324,43 @@ prefetchindices(Index, []) -> prefetchindices(_Index, PrefetchList) -> PrefetchList. +-define(FIRST_UNKNOWN_CACHE_TABLE, missingentries_first_unknown_cache). + +init_module() -> + create_first_unknown_cache_table(). + +create_first_unknown_cache_table() -> + case ets:info(?FIRST_UNKNOWN_CACHE_TABLE) of + undefined -> + ok; + _ -> + ets:delete(?FIRST_UNKNOWN_CACHE_TABLE) + end, + ets:new(?FIRST_UNKNOWN_CACHE_TABLE, [set, public, named_table]). + +first_unknown_cache() -> + case ets:lookup(?FIRST_UNKNOWN_CACHE_TABLE, first_unknown_cache) of + [{_, Size}] -> + Size; + [] -> + 0 + end. + +set_first_unknown_cache(Size) -> + CurrentSize = first_unknown_cache(), + if + Size == CurrentSize + 1 -> + true = ets:insert(?FIRST_UNKNOWN_CACHE_TABLE, {first_unknown_cache, Size}); + true -> + ok + end, + ok. + + -spec fetchmissingentries(non_neg_integer(), non_neg_integer()) -> [binary() | noentry]. fetchmissingentries(Index, MaxEntries) -> - lists:reverse(fetchmissingentries(Index, [], [], MaxEntries)). + Index2 = lists:max([first_unknown_cache(), Index]), + lists:reverse(fetchmissingentries(Index2, [], [], MaxEntries)). -spec fetchmissingentries(non_neg_integer(), [binary() | noentry], [binary()], non_neg_integer()) -> [binary() | noentry]. @@ -343,6 +377,7 @@ fetchmissingentries(Index, Acc, PrefetchList, MaxEntries) -> lager:debug("didn't find hash ~p", [Hash]), fetchmissingentries(Index + 1, [Hash | Acc], PrefetchRest, MaxEntries - 1); _ -> + set_first_unknown_cache(Index + 1), fetchmissingentries(Index + 1, Acc, PrefetchRest, MaxEntries) end end. diff --git a/src/plop_app.erl b/src/plop_app.erl index 611012a..721623c 100644 --- a/src/plop_app.erl +++ b/src/plop_app.erl @@ -11,6 +11,7 @@ start(normal, Args) -> plop:initsize(), perm:init_module(), index:init_module(), + frontend:init_module(), plop_sup:start_link(Args). stop(_State) -> -- cgit v1.1