diff options
author | Jens Baumgart <jens.baumgart@sap.com> | 2010-12-06 13:40:07 +0100 |
---|---|---|
committer | Jens Baumgart <jens.baumgart@sap.com> | 2010-12-06 13:40:07 +0100 |
commit | cbf5ff6ac7762e2b7170edae9d1563ae3869544a (patch) | |
tree | c9cd8035e76780ec588e42614a24cbe7a95d7c15 /org.eclipse.jgit | |
parent | 90fbc1db3a8b4439474e1601f2d842e29594d381 (diff) | |
download | jgit-cbf5ff6ac7762e2b7170edae9d1563ae3869544a.tar.gz jgit-cbf5ff6ac7762e2b7170edae9d1563ae3869544a.zip |
LockFile.commit: retry renaming
Currently the following can happen in LockFile.commit: deletion of the
original file succeeds but renaming fails afterwards. In this case the
original file (e.g. branch file in refs/heads) is lost.
To workaround the issue the same retry logic as for file deletion is
applied to file renaming.
Bug: 331890
Change-Id: I68620c07f2d3ab7f3279c71a91e184e8eac69832
Signed-off-by: Jens Baumgart <jens.baumgart@sap.com>
Signed-off-by: Philipp Thun <philipp.thun@sap.com>
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/storage/file/LockFile.java | 21 |
1 files changed, 20 insertions, 1 deletions
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 6199f4c450..c1fb704a51 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 class LockFile { 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 @@ public class LockFile { 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(); |