+ Files.deleteIfExists(mainState);
+ }
+ }
+
+ private static MainState rollback(Path directory, Runnable rollbackCallback) throws IOException {
+ LOGGER.warn("Database rollback initiated for " + directory);
+ rollbackCallback.run();
+ Path latest = findNewHeadStateDir(directory);
+ int latestRevision = latest != null ? safeParseInt(-1, latest) : -1;
+ // +1 because we want to return the next head version to use,
+ // not the latest existing version.
+ MainState state = new MainState( latestRevision + 1 );
+ archiveRevisionDirectories(directory, latestRevision, rollbackCallback);
+ LOGGER.warn("Database rollback completed. Restarting database from revision " + latest);
+ return state;
+ }
+
+ private byte[] toByteArray() throws IOException {
+ try (BinaryMemory rf = new BinaryMemory(4096)) {
+ Bindings.getSerializerUnchecked(Bindings.VARIANT).serialize(rf, MutableVariant.ofInstance(this));
+ return rf.toByteBuffer().array();