Browse Source

Enhance fsTick() to use filesystem timer resolution

RepositoryTestCase.fsTick() was was waiting 64, 128, 256, ... milliseconds
until it detected that the filesystem timer has ticked. Make use of
the filesystemtimer resolution information in FS to sleep a fraction
of the filesystem timer resolution. That raises probability to wake up
shortly after the filesystem timer has ticked.

Change-Id: Ibcc38576e42ece13b2fd4423a29c459eed167a69
stable-5.1
Christian Halstrick 5 years ago committed by Matthias Sohn
parent
commit
b2ee9cfbc3
  1. 24
      org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java

24
org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java

@ -349,7 +349,8 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase {
* younger modification timestamp than the modification timestamp of the
* given file. This is done by touching a temporary file, reading the
* lastmodified attribute and, if needed, sleeping. After sleeping this loop
* starts again until the filesystem timer has advanced enough.
* starts again until the filesystem timer has advanced enough. The
* temporary file will be created as a sibling of lastFile.
*
* @param lastFile
* the file on which we want to wait until the filesystem timer
@ -362,18 +363,25 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase {
*/
public static long fsTick(File lastFile) throws InterruptedException,
IOException {
long sleepTime = 64;
File tmp;
FS fs = FS.DETECTED;
if (lastFile != null && !fs.exists(lastFile))
throw new FileNotFoundException(lastFile.getPath());
File tmp = File.createTempFile("FileTreeIteratorWithTimeControl", null);
if (lastFile == null) {
lastFile = tmp = File
.createTempFile("fsTickTmpFile", null);
} else {
if (!fs.exists(lastFile)) {
throw new FileNotFoundException(lastFile.getPath());
}
tmp = File.createTempFile("fsTickTmpFile", null,
lastFile.getParentFile());
}
long res = FS.getFsTimerResolution(tmp.toPath()).toMillis();
long sleepTime = res / 10;
try {
long startTime = (lastFile == null) ? fs.lastModified(tmp) : fs
.lastModified(lastFile);
long startTime = fs.lastModified(lastFile);
long actTime = fs.lastModified(tmp);
while (actTime <= startTime) {
Thread.sleep(sleepTime);
sleepTime *= 2;
FileUtils.touch(tmp.toPath());
actTime = fs.lastModified(tmp);
}

Loading…
Cancel
Save