diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/LockFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/LockFile.java index 6199f4c45..c1fb704a5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/LockFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/LockFile.java @@ -397,7 +397,7 @@ public boolean commit() { if (lck.renameTo(ref)) return true; if (!ref.exists() || deleteRef()) - if (lck.renameTo(ref)) + if (renameLock()) return true; unlock(); return false; @@ -422,6 +422,25 @@ private boolean deleteRef() { return false; } + private boolean renameLock() { + if (!fs.retryFailedLockFileCommit()) + return lck.renameTo(ref); + + // File renaming fails on windows if another thread is + // concurrently reading the same file. So try a few times. + // + for (int attempts = 0; attempts < 10; attempts++) { + if (lck.renameTo(ref)) + return true; + try { + Thread.sleep(100); + } catch (InterruptedException e) { + return false; + } + } + return false; + } + private void saveStatInformation() { if (needStatInformation) commitLastModified = lck.lastModified();