]> source.dussan.org Git - jgit.git/commitdiff
Avoid setup and saving FileStoreAttributes compete for ~/.gitconfig lock 22/147522/5
authorMatthias Sohn <matthias.sohn@sap.com>
Sun, 11 Aug 2019 00:43:02 +0000 (02:43 +0200)
committerMatthias Sohn <matthias.sohn@sap.com>
Fri, 16 Aug 2019 14:51:45 +0000 (16:51 +0200)
FS determines FileStore attributes in a background thread and tries to
save the results to the global git configuration. This competed with
LocalDiskRepositoryTestCase#setup trying to save changes to the same
file requiring the same lock. This frequently led to one of the threads
failing to acquire the lock.

Fix this by first initiating determination of FileStore attributes which
then uses a MockSystemReader not using a userConfig stored to disk which
avoids this race for the lock.

Change-Id: I30fcd96bc15100f8ef9b2a9eb3320bb5ace97c67
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java

index cce83c00b233acd92b814ff18a8d2ee1eea055da..f8f0c18cba0e000b3bba087e3fa2d0721ead4bd4 100644 (file)
@@ -130,6 +130,13 @@ public abstract class LocalDiskRepositoryTestCase {
 
                mockSystemReader = new MockSystemReader();
                SystemReader.setInstance(mockSystemReader);
+
+               // Measure timer resolution before the test to avoid time critical tests
+               // are affected by time needed for measurement.
+               // The MockSystemReader must be configured first since we need to use
+               // the same one here
+               FS.getFileStoreAttributes(tmp.toPath().getParent());
+
                mockSystemReader.userGitConfig = new FileBasedConfig(new File(tmp,
                                "usergitconfig"), FS.DETECTED);
                // We have to set autoDetach to false for tests, because tests expect to be able
@@ -140,12 +147,6 @@ public abstract class LocalDiskRepositoryTestCase {
                mockSystemReader.userGitConfig.save();
                ceilTestDirectories(getCeilings());
 
-               // Measure timer resolution before the test to avoid time critical tests
-               // are affected by time needed for measurement.
-               // The MockSystemReader must be configured first since we need to use
-               // the same one here
-               FS.getFileStoreAttributes(tmp.toPath().getParent());
-
                author = new PersonIdent("J. Author", "jauthor@example.com");
                committer = new PersonIdent("J. Committer", "jcommitter@example.com");