rename_tmp_log(): limit the number of remote_empty_directories() attempts
authorMichael Haggerty <mhagger@alum.mit.edu>
Sat, 18 Jan 2014 22:49:00 +0000 (23:49 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 21 Jan 2014 21:47:24 +0000 (13:47 -0800)
This doesn't seem to be a likely error, but we've got the counter
anyway, so we might as well use it for an added bit of safety.

Please note that the first call to rename() is optimistic, and it is
normal for it to fail if there is a directory in the way. So bump the
total number of allowed attempts to 4, to be sure that we can still
have at least 3 retries in the case of a race.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c
diff --git a/refs.c b/refs.c
index bbcdc88e418efd8b681fd59d0fe0ad9fefd8a34e..fd644f0f416fac0374b0e0f9dbc5d158ad6b7240 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -2530,7 +2530,7 @@ int delete_ref(const char *refname, const unsigned char *sha1, int delopt)
 
 static int rename_tmp_log(const char *newrefname)
 {
-       int attempts_remaining = 3;
+       int attempts_remaining = 4;
 
  retry:
        if (safe_create_leading_directories(git_path("logs/%s", newrefname))) {
@@ -2539,7 +2539,7 @@ static int rename_tmp_log(const char *newrefname)
        }
 
        if (rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", newrefname))) {
-               if (errno==EISDIR || errno==ENOTDIR) {
+               if ((errno==EISDIR || errno==ENOTDIR) && --attempts_remaining > 0) {
                        /*
                         * rename(a, b) when b is an existing
                         * directory ought to result in ISDIR, but