use of org.neo4j.io.layout.recordstorage.RecordDatabaseLayout in project neo4j by neo4j.
the class RecoveryIT method shouldForceRecoveryEvenThoughNotSeeminglyRequired.
@Test
void shouldForceRecoveryEvenThoughNotSeeminglyRequired() throws Exception {
// given
GraphDatabaseAPI db = createDatabase();
generateSomeData(db);
RecordDatabaseLayout layout = RecordDatabaseLayout.cast(db.databaseLayout());
managementService.shutdown();
assertFalse(isRecoveryRequired(layout));
// Make an ID generator, say for the node store, dirty
DefaultIdGeneratorFactory idGeneratorFactory = new DefaultIdGeneratorFactory(fileSystem, immediate(), "my db");
try (IdGenerator idGenerator = idGeneratorFactory.open(pageCache, layout.idNodeStore(), RecordIdType.NODE, () -> 0L, /*will not be used*/
10_000, writable(), Config.defaults(), NULL, Sets.immutable.empty(), IdSlotDistribution.SINGLE_IDS)) {
// Merely opening a marker will make the backing GBPTree dirty
idGenerator.marker(NULL).close();
}
assertFalse(isRecoveryRequired(layout));
assertTrue(idGeneratorIsDirty(layout.idNodeStore(), RecordIdType.NODE));
// when
MutableBoolean recoveryRunEvenThoughNoCommitsAfterLastCheckpoint = new MutableBoolean();
RecoveryStartInformationProvider.Monitor monitor = new RecoveryStartInformationProvider.Monitor() {
@Override
public void noCommitsAfterLastCheckPoint(LogPosition logPosition) {
recoveryRunEvenThoughNoCommitsAfterLastCheckpoint.setTrue();
}
};
Monitors monitors = new Monitors();
monitors.addMonitorListener(monitor);
Recovery.performRecovery(fileSystem, pageCache, EMPTY, Config.defaults(), layout, defaultStorageEngine(), true, NullLogProvider.getInstance(), monitors, Iterables.cast(Services.loadAll(ExtensionFactory.class)), Optional.empty(), null, INSTANCE, Clock.systemUTC(), RecoveryPredicate.ALL);
// then
assertFalse(idGeneratorIsDirty(layout.idNodeStore(), RecordIdType.NODE));
assertTrue(recoveryRunEvenThoughNoCommitsAfterLastCheckpoint.booleanValue());
}
use of org.neo4j.io.layout.recordstorage.RecordDatabaseLayout in project neo4j by neo4j.
the class DegreesRebuildFromStoreTest method shouldRebuildDegreesStore.
@Test
void shouldRebuildDegreesStore() throws Exception {
// given a dataset containing mixed sparse and dense nodes with relationships in random directions,
// where some chains have been marked as having external degrees
int denseThreshold = dense_node_threshold.defaultValue();
RecordDatabaseLayout layout = RecordDatabaseLayout.ofFlat(directory.homePath());
int[] relationshipTypes;
MutableLongLongMap expectedDegrees = LongLongMaps.mutable.empty();
Config config = config(denseThreshold);
try (Lifespan life = new Lifespan()) {
RecordStorageEngine storageEngine = openStorageEngine(layout, config);
relationshipTypes = createRelationshipTypes(storageEngine);
life.add(storageEngine);
generateData(storageEngine, denseThreshold, relationshipTypes);
storageEngine.relationshipGroupDegreesStore().accept((groupId, direction, degree) -> expectedDegrees.put(combinedKeyOnGroupAndDirection(groupId, direction), degree), NULL);
assertThat(expectedDegrees.isEmpty()).isFalse();
storageEngine.flushAndForce(NULL);
}
// when
directory.getFileSystem().deleteFile(layout.relationshipGroupDegreesStore());
rebuildAndVerify(layout, config, expectedDegrees);
}
use of org.neo4j.io.layout.recordstorage.RecordDatabaseLayout in project neo4j by neo4j.
the class ConsistencyCheckingApplierTest method setUp.
@BeforeEach
void setUp() {
Config config = Config.defaults(neo4j_home, directory.homePath());
RecordDatabaseLayout layout = RecordDatabaseLayout.of(config);
neoStores = new StoreFactory(layout, config, new DefaultIdGeneratorFactory(directory.getFileSystem(), immediate(), DEFAULT_DATABASE_NAME), pageCache, directory.getFileSystem(), NullLogProvider.getInstance(), PageCacheTracer.NULL, writable()).openAllNeoStores(true);
RelationshipStore relationshipStore = neoStores.getRelationshipStore();
storeCursors = new CachedStoreCursors(neoStores, CursorContext.NULL);
checker = new ConsistencyCheckingApplier(relationshipStore, CursorContext.NULL);
BatchContext batchContext = mock(BatchContext.class);
when(batchContext.getLockGroup()).thenReturn(new LockGroup());
applier = new NeoStoreTransactionApplier(CommandVersion.AFTER, neoStores, mock(CacheAccessBackDoor.class), LockService.NO_LOCK_SERVICE, 0, batchContext, CursorContext.NULL, storeCursors);
appliers = new TransactionApplier[] { checker, applier };
}
use of org.neo4j.io.layout.recordstorage.RecordDatabaseLayout in project neo4j by neo4j.
the class IdGeneratorMigrator method migrate.
@Override
public void migrate(DatabaseLayout directoryLayoutArg, DatabaseLayout migrationLayoutArg, ProgressReporter progress, String versionToMigrateFrom, String versionToMigrateTo, IndexImporterFactory indexImporterFactory) throws IOException {
RecordDatabaseLayout directoryLayout = RecordDatabaseLayout.convert(directoryLayoutArg);
RecordDatabaseLayout migrationLayout = RecordDatabaseLayout.convert(migrationLayoutArg);
RecordFormats oldFormat = selectForVersion(versionToMigrateFrom);
RecordFormats newFormat = selectForVersion(versionToMigrateTo);
if (requiresIdFilesMigration(oldFormat, newFormat)) {
try (var cursorContext = new CursorContext(cacheTracer.createPageCursorTracer(ID_GENERATOR_MIGRATION_TAG))) {
migrateIdFiles(directoryLayout, migrationLayout, oldFormat, newFormat, progress, cursorContext);
}
}
}
use of org.neo4j.io.layout.recordstorage.RecordDatabaseLayout in project neo4j by neo4j.
the class IdGeneratorMigrator method createEmptyPlaceHolderStoreFiles.
private Set<Path> createEmptyPlaceHolderStoreFiles(RecordDatabaseLayout layout, RecordFormats format) {
Set<Path> createdStores = new HashSet<>();
StoreType[] storesToCreate = Stream.of(StoreType.values()).filter(t -> {
Path file = layout.file(t.getDatabaseFile());
boolean exists = fileSystem.fileExists(file);
if (!exists) {
createdStores.add(file);
}
return !exists;
}).toArray(StoreType[]::new);
createStoreFactory(layout, format, new ScanOnOpenReadOnlyIdGeneratorFactory()).openNeoStores(true, storesToCreate).close();
return createdStores;
}
Aggregations