From 6fdc0f0ae77d6aaefd175277fa8355089f41806a Mon Sep 17 00:00:00 2001 From: Magnus Ahltorp Date: Wed, 28 Jan 2015 17:29:58 +0100 Subject: Perform frontend index writes in two phases --- src/db.erl | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'src/db.erl') diff --git a/src/db.erl b/src/db.erl index d2e0814..0541678 100644 --- a/src/db.erl +++ b/src/db.erl @@ -6,10 +6,11 @@ %% API. -export([start_link/0, stop/0]). --export([add/2, add_entryhash/2, add_index/2, set_treesize/1, size/0]). +-export([add/2, add_entryhash/2, add_index_nosync/2, set_treesize/1, size/0]). -export([get_by_index/1, get_by_indices/3, get_by_leaf_hash/1]). -export([get_by_entry_hash/1, entry_for_leafhash/1, leafhash_for_index/1]). -export([leafhash_for_indices/2, indexsize/0]). +-export([indexforhash_sync/2, index_sync/0]). %% gen_server callbacks. -export([init/1, handle_call/3, terminate/2, handle_cast/2, handle_info/2, code_change/3]). @@ -48,9 +49,9 @@ add_entryhash(LeafHash, EntryHash) -> ok = perm:ensurefile(entryhash_root_path(), EntryHash, LeafHash), ok. --spec add_index(binary(), non_neg_integer()) -> ok. -add_index(LeafHash, Index) -> - call(?MODULE, {add_index, {LeafHash, Index}}). +-spec add_index_nosync(binary(), non_neg_integer()) -> ok. +add_index_nosync(LeafHash, Index) -> + call(?MODULE, {add_index_nosync, {LeafHash, Index}}). -spec set_treesize(non_neg_integer()) -> ok. set_treesize(Size) -> @@ -177,8 +178,18 @@ get_by_indices_helper(Start, End) -> handle_call(stop, _From, State) -> {stop, normal, stopped, State}; -handle_call({add_index, {LeafHash, Index}}, _From, State) -> - ok = perm:ensurefile(indexforhash_root_path(), - LeafHash, integer_to_binary(Index)), +handle_call({add_index_nosync, {LeafHash, Index}}, _From, State) -> + ok = perm:ensurefile_nosync(indexforhash_root_path(), + LeafHash, integer_to_binary(Index)), ok = index:add(index_path(), Index, LeafHash), {reply, ok, State}. + +indexforhash_sync(LeafHash, Index) -> + ok = perm:ensurefile(indexforhash_root_path(), + LeafHash, integer_to_binary(Index)), + ok. + +index_sync() -> + Basepath = index_path(), + ok = util:fsync([Basepath, filename:dirname(Basepath)]), + ok. -- cgit v1.1