summaryrefslogtreecommitdiff
path: root/src/perm.erl
diff options
context:
space:
mode:
authorMagnus Ahltorp <map@kth.se>2015-01-28 17:29:58 +0100
committerLinus Nordberg <linus@nordberg.se>2015-02-27 02:29:16 +0100
commit6fdc0f0ae77d6aaefd175277fa8355089f41806a (patch)
tree244212754b2163304734529cb554fb8adeb316bf /src/perm.erl
parentd34e60f273b3fef49c80ebf866ce781333f90d79 (diff)
Perform frontend index writes in two phases
Diffstat (limited to 'src/perm.erl')
-rw-r--r--src/perm.erl26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/perm.erl b/src/perm.erl
index 9f02b55..614656a 100644
--- a/src/perm.erl
+++ b/src/perm.erl
@@ -2,7 +2,7 @@
%%% See LICENSE for licensing information.
-module(perm).
--export([ensurefile/3, readfile/2]).
+-export([ensurefile/3, ensurefile_nosync/3, readfile/2]).
-spec readfile_and_verify(string(), binary()) -> ok | differ | {error, atom()}.
readfile_and_verify(Name, Content) ->
@@ -49,13 +49,21 @@ path_for_key(Rootdir, Key) ->
-spec ensurefile(string(), binary(), binary()) -> ok | differ.
ensurefile(Rootdir, Key, Content) ->
+ ensurefile(Rootdir, Key, Content, sync).
+
+-spec ensurefile_nosync(string(), binary(), binary()) -> ok | differ.
+ensurefile_nosync(Rootdir, Key, Content) ->
+ ensurefile(Rootdir, Key, Content, nosync).
+
+ensurefile(Rootdir, Key, Content, Syncflag) ->
lager:debug("dir ~p key ~p", [Rootdir, Key]),
{Dirs, Path} = path_for_key(Rootdir, Key),
case readfile_and_verify(Path, Content) of
ok ->
lager:debug("key ~p existed, fsync", [Key]),
- util:fsync([Path, Rootdir | Dirs]),
- lager:debug("key ~p fsynced", [Key]);
+ ok = util:fsync([Path, Rootdir | Dirs]),
+ lager:debug("key ~p fsynced", [Key]),
+ ok;
differ ->
lager:debug("key ~p existed, was different", [Key]),
differ;
@@ -67,9 +75,15 @@ ensurefile(Rootdir, Key, Content) ->
NurseryName = Rootdir ++ "nursery/" ++
util:tempfilename(hex:bin_to_hexstr(Key)),
util:write_tempfile_and_rename(Path, NurseryName, Content),
- lager:debug("key ~p added, fsync", [Key]),
- util:fsync([Path, Rootdir | Dirs]),
- lager:debug("key ~p fsynced", [Key]);
+ case Syncflag of
+ sync ->
+ lager:debug("key ~p added, fsync", [Key]),
+ ok = util:fsync([Path, Rootdir | Dirs]),
+ lager:debug("key ~p fsynced", [Key]),
+ ok;
+ nosync ->
+ ok
+ end;
{error, Error} ->
util:exit_with_error(Error, readfile, "Error reading file")
end.