diff options
-rw-r--r-- | src/couchdb/couch_db_updater.erl | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/src/couchdb/couch_db_updater.erl b/src/couchdb/couch_db_updater.erl index a8ffc6cc..664b1e97 100644 --- a/src/couchdb/couch_db_updater.erl +++ b/src/couchdb/couch_db_updater.erl @@ -215,6 +215,9 @@ handle_info({update_docs, Client, GroupedDocs, NonRepDocs, MergeConflicts, [catch(ClientPid ! {retry, self()}) || ClientPid <- Clients], {noreply, Db} end; +handle_info(delayed_commit, #db{waiting_delayed_commit=nil}=Db) -> + %no outstanding delayed commits, ignore + {noreply, Db}; handle_info(delayed_commit, Db) -> case commit_data(Db) of Db -> @@ -671,23 +674,22 @@ db_to_header(Db, Header) -> security_ptr = Db#db.security_ptr, revs_limit = Db#db.revs_limit}. -commit_data(#db{fd=Fd,header=OldHeader,fsync_options=FsyncOptions}=Db, Delay) -> - Header = db_to_header(Db, OldHeader), - if OldHeader == Header -> - Db; - Delay and (Db#db.waiting_delayed_commit == nil) -> - Db#db{waiting_delayed_commit= - erlang:send_after(1000, self(), delayed_commit)}; - Delay -> +commit_data(#db{waiting_delayed_commit=nil} = Db, true) -> + Db#db{waiting_delayed_commit=erlang:send_after(1000,self(),delayed_commit)}; +commit_data(Db, true) -> + Db; +commit_data(Db, _) -> + #db{ + fd = Fd, + header = OldHeader, + fsync_options = FsyncOptions, + waiting_delayed_commit = Timer + } = Db, + if is_reference(Timer) -> erlang:cancel_timer(Timer); true -> ok end, + case db_to_header(Db, OldHeader) of + OldHeader -> Db; - true -> - if Db#db.waiting_delayed_commit /= nil -> - case erlang:cancel_timer(Db#db.waiting_delayed_commit) of - false -> receive delayed_commit -> ok after 0 -> ok end; - _ -> ok - end; - true -> ok - end, + Header -> case lists:member(before_header, FsyncOptions) of true -> ok = couch_file:sync(Fd); _ -> ok |