Don't hide I/O errors behind LockErr Only return a LockErr if there's lock contention, not on unrelated I/O errors.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/e06cdbf6 Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/e06cdbf6 Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/e06cdbf6 Branch: refs/heads/master Commit: e06cdbf63d3036c3a33e5265444d827065539e92 Parents: 38a33ba Author: Nick Wellnhofer <wellnho...@aevum.de> Authored: Fri Feb 17 20:26:13 2017 +0100 Committer: Nick Wellnhofer <wellnho...@aevum.de> Committed: Mon Feb 20 16:26:22 2017 +0100 ---------------------------------------------------------------------- core/Lucy/Store/Lock.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/e06cdbf6/core/Lucy/Store/Lock.c ---------------------------------------------------------------------- diff --git a/core/Lucy/Store/Lock.c b/core/Lucy/Store/Lock.c index 0879640..90a6aa0 100644 --- a/core/Lucy/Store/Lock.c +++ b/core/Lucy/Store/Lock.c @@ -263,16 +263,14 @@ S_request(LockFileLockIVARS *ivars, String *lock_path) { String *lock_dir_name = SSTR_WRAP_C("locks"); if (!Folder_Exists(ivars->folder, lock_dir_name)) { if (!Folder_MkDir(ivars->folder, lock_dir_name)) { - Err *mkdir_err = (Err*)CERTIFY(Err_get_error(), ERR); - LockErr *err = LockErr_new(Str_newf("Can't create 'locks' directory: %o", - Err_Get_Mess(mkdir_err))); + Err *err = (Err*)INCREF(Err_get_error()); // Maybe our attempt failed because another process succeeded. if (Folder_Find_Folder(ivars->folder, lock_dir_name)) { DECREF(err); } else { // Nope, everything failed, so bail out. - Err_set_error((Err*)err); + Err_set_error(err); return false; } } @@ -302,25 +300,23 @@ S_request(LockFileLockIVARS *ivars, String *lock_path) { context.outstream = outstream; context.json = json; Err *json_error = Err_trap(S_write_lockfile_json, &context); - bool wrote_json = !json_error; DECREF(outstream); DECREF(json); - if (wrote_json) { + if (json_error) { + Err_set_error(json_error); + } + else { success = Folder_Hard_Link(ivars->folder, ivars->link_path, lock_path); if (!success) { + // TODO: Only return a LockErr if errno == EEXIST, otherwise + // return a normal Err. Err *hard_link_err = (Err*)CERTIFY(Err_get_error(), ERR); - Err_set_error((Err*)LockErr_new(Str_newf("Failed to obtain lock at '%o': %o", - lock_path, - Err_Get_Mess(hard_link_err)))); + String *msg = Str_newf("Failed to obtain lock at '%o': %o", + lock_path, Err_Get_Mess(hard_link_err)); + Err_set_error((Err*)LockErr_new(msg)); } } - else { - Err_set_error((Err*)LockErr_new(Str_newf("Failed to obtain lock at '%o': %o", - lock_path, - Err_Get_Mess(json_error)))); - DECREF(json_error); - } // Verify that our temporary file got zapped. bool deletion_failed = !Folder_Delete(ivars->folder, ivars->link_path);