use existing RandomAccessFile when updating the listing file
Ingestion speed dropped drastically with the old implementation. In some situations to 7 entries per second over a 10 second period (sic!). When using the already opened RandomAccessFile the speed is back to previous values of 40k-50k entries per second on my 10 year old machine on an encrypted spinning disk.
This commit is contained in:
@@ -29,6 +29,7 @@ public class FolderStorage implements AutoCloseable {
|
|||||||
.getLogger("org.lucares.metrics.folderStorage.createListingFile");
|
.getLogger("org.lucares.metrics.folderStorage.createListingFile");
|
||||||
private final static Logger METRICS_GET_PATH_BY_OFFSET = LoggerFactory
|
private final static Logger METRICS_GET_PATH_BY_OFFSET = LoggerFactory
|
||||||
.getLogger("org.lucares.metrics.folderStorage.getPathByOffset");
|
.getLogger("org.lucares.metrics.folderStorage.getPathByOffset");
|
||||||
|
private final static Logger METRICS_INSERT = LoggerFactory.getLogger("org.lucares.metrics.folderStorage.insert");
|
||||||
|
|
||||||
private final Path storageBaseDirectory;
|
private final Path storageBaseDirectory;
|
||||||
|
|
||||||
@@ -49,7 +50,7 @@ public class FolderStorage implements AutoCloseable {
|
|||||||
this.maxFilesPerFolder = maxFilesPerFolder;
|
this.maxFilesPerFolder = maxFilesPerFolder;
|
||||||
init();
|
init();
|
||||||
initListingFileIfNotExists();
|
initListingFileIfNotExists();
|
||||||
listingFile = new RandomAccessFile(listingFilePath.toFile(), "rws");
|
listingFile = new RandomAccessFile(listingFilePath.toFile(), "rw");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -75,6 +76,7 @@ public class FolderStorage implements AutoCloseable {
|
|||||||
|
|
||||||
public ListingFileEntry insert(final String filenamePrefix, final String filenameSuffix) throws IOException {
|
public ListingFileEntry insert(final String filenamePrefix, final String filenameSuffix) throws IOException {
|
||||||
|
|
||||||
|
final long start = System.nanoTime();
|
||||||
ensureCapacity();
|
ensureCapacity();
|
||||||
|
|
||||||
String filename = filenamePrefix + "$" + filenameSuffix;
|
String filename = filenamePrefix + "$" + filenameSuffix;
|
||||||
@@ -88,6 +90,7 @@ public class FolderStorage implements AutoCloseable {
|
|||||||
filesInSecondLevel++;
|
filesInSecondLevel++;
|
||||||
|
|
||||||
final ListingFileEntry result = updateListingFile(newFile);
|
final ListingFileEntry result = updateListingFile(newFile);
|
||||||
|
METRICS_INSERT.debug("{}ms", (System.nanoTime() - start) / 1_000_000.0);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -95,16 +98,13 @@ public class FolderStorage implements AutoCloseable {
|
|||||||
private synchronized ListingFileEntry updateListingFile(final Path newFile) throws IOException {
|
private synchronized ListingFileEntry updateListingFile(final Path newFile) throws IOException {
|
||||||
final long offsetInListingFile = Files.size(listingFilePath);
|
final long offsetInListingFile = Files.size(listingFilePath);
|
||||||
// remember: all paths within storageBaseDirectory use only ascii characters
|
// remember: all paths within storageBaseDirectory use only ascii characters
|
||||||
try (Writer out = Files.newBufferedWriter(listingFilePath, StandardCharsets.US_ASCII, StandardOpenOption.CREATE,
|
|
||||||
StandardOpenOption.APPEND, StandardOpenOption.SYNC)) {
|
|
||||||
|
|
||||||
final Path relativePath = storageBaseDirectory.relativize(newFile);
|
final Path relativePath = storageBaseDirectory.relativize(newFile);
|
||||||
listingFile.seek(offsetInListingFile);
|
listingFile.seek(offsetInListingFile);
|
||||||
listingFile.write(relativePath.toString().getBytes(StandardCharsets.US_ASCII));
|
listingFile.write(relativePath.toString().getBytes(StandardCharsets.US_ASCII));
|
||||||
listingFile.write(NEWLINE);
|
listingFile.write(NEWLINE);
|
||||||
}
|
|
||||||
final String filename = newFile.getFileName().toString();
|
final String filename = newFile.getFileName().toString();
|
||||||
final Path relativePath = storageBaseDirectory.relativize(newFile);
|
|
||||||
return new ListingFileEntry(filename, offsetInListingFile, relativePath);
|
return new ListingFileEntry(filename, offsetInListingFile, relativePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,7 +141,7 @@ public class FolderStorage implements AutoCloseable {
|
|||||||
final long start = System.nanoTime();
|
final long start = System.nanoTime();
|
||||||
LOGGER.info("listing file not found -> creating a new one");
|
LOGGER.info("listing file not found -> creating a new one");
|
||||||
createNewListingFile();
|
createNewListingFile();
|
||||||
METRICS_CREATE_LISTING_FILE.info(((System.nanoTime() - start) / 1_000_000.0) + "ms");
|
METRICS_CREATE_LISTING_FILE.debug("{}ms", (System.nanoTime() - start) / 1_000_000.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,7 +180,7 @@ public class FolderStorage implements AutoCloseable {
|
|||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
throw new RuntimeIOException(e);
|
throw new RuntimeIOException(e);
|
||||||
} finally {
|
} finally {
|
||||||
METRICS_GET_PATH_BY_OFFSET.debug(((System.nanoTime() - start) / 1_000_000.0) + "ms");
|
METRICS_GET_PATH_BY_OFFSET.debug("{}ms", (System.nanoTime() - start) / 1_000_000.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user