Change lock acquitision order in BGMerger_init

Obtain the merge lock before the write lock so that an already running
background merger won't abort when failing to acquire the write lock
during commit.

Release the merge lock at the very end of BGMerger_Commit. It doesn't
really matter when we release the merge lock after we acquired the
write lock in BGMerger_Prepare_Commit. I think it makes the code
clearer to release it at the very end of BGMerger_Commit.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/de14d4ca
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/de14d4ca
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/de14d4ca

Branch: refs/heads/master
Commit: de14d4ca31ab27fc1569966c1b182fa4829afd40
Parents: 4e6e5bb
Author: Nick Wellnhofer <wellnho...@aevum.de>
Authored: Fri Feb 17 18:34:31 2017 +0100
Committer: Nick Wellnhofer <wellnho...@aevum.de>
Committed: Mon Feb 20 16:26:22 2017 +0100

----------------------------------------------------------------------
 core/Lucy/Index/BackgroundMerger.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/de14d4ca/core/Lucy/Index/BackgroundMerger.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Index/BackgroundMerger.c 
b/core/Lucy/Index/BackgroundMerger.c
index 144139d..be69d90 100644
--- a/core/Lucy/Index/BackgroundMerger.c
+++ b/core/Lucy/Index/BackgroundMerger.c
@@ -88,14 +88,16 @@ BGMerger_init(BackgroundMerger *self, Obj *index, 
IndexManager *manager) {
     }
     IxManager_Set_Folder(ivars->manager, folder);
 
-    // Obtain write lock (which we'll only hold briefly), then merge lock.
-    S_obtain_write_lock(self);
-    if (!ivars->write_lock) {
+    // Obtain merge lock first so that a running background merger won't
+    // abort when failing to acquire the write lock during commit.
+    S_obtain_merge_lock(self);
+    if (!ivars->merge_lock) {
         DECREF(self);
         RETHROW(INCREF(Err_get_error()));
     }
-    S_obtain_merge_lock(self);
-    if (!ivars->merge_lock) {
+    // Obtain write lock (which we'll only hold briefly).
+    S_obtain_write_lock(self);
+    if (!ivars->write_lock) {
         DECREF(self);
         RETHROW(INCREF(Err_get_error()));
     }
@@ -512,8 +514,7 @@ BGMerger_Commit_IMP(BackgroundMerger *self) {
         DECREF(temp_snapfile);
     }
 
-    // Release the merge lock and remove the merge data file.
-    S_release_merge_lock(self);
+    // Remove the merge data file.
     IxManager_Remove_Merge_Data(ivars->manager);
 
     if (ivars->needs_commit) {
@@ -521,8 +522,9 @@ BGMerger_Commit_IMP(BackgroundMerger *self) {
         FilePurger_Purge_Snapshots(ivars->file_purger, ivars->snapshot);
     }
 
-    // Release the write lock.
+    // Release write and merge locks.
     S_release_write_lock(self);
+    S_release_merge_lock(self);
 }
 
 static void

Reply via email to