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
This commit is contained in:
Christian Halstrick 2019-06-04 18:03:26 +02:00 committed by Matthias Sohn
parent b5c594216b
commit b2ee9cfbc3
1 changed files with 16 additions and 8 deletions

View File

@ -349,7 +349,8 @@ public static String slashify(String str) {
* 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 static String slashify(String str) {
*/
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);
}