Search in sources :

Example 1 with RecordDatabaseLayout

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());
}
Also used : LoggingLogFileMonitor(org.neo4j.kernel.impl.transaction.log.LoggingLogFileMonitor) GraphDatabaseAPI(org.neo4j.kernel.internal.GraphDatabaseAPI) MutableBoolean(org.apache.commons.lang3.mutable.MutableBoolean) DefaultIdGeneratorFactory(org.neo4j.internal.id.DefaultIdGeneratorFactory) Monitors(org.neo4j.monitoring.Monitors) IdGenerator(org.neo4j.internal.id.IdGenerator) RecordDatabaseLayout(org.neo4j.io.layout.recordstorage.RecordDatabaseLayout) LogPosition(org.neo4j.kernel.impl.transaction.log.LogPosition) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) Test(org.junit.jupiter.api.Test)

Example 2 with RecordDatabaseLayout

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);
}
Also used : Config(org.neo4j.configuration.Config) RecordStorageEngine(org.neo4j.internal.recordstorage.RecordStorageEngine) MutableLongLongMap(org.eclipse.collections.api.map.primitive.MutableLongLongMap) Lifespan(org.neo4j.kernel.lifecycle.Lifespan) RecordDatabaseLayout(org.neo4j.io.layout.recordstorage.RecordDatabaseLayout) Test(org.junit.jupiter.api.Test)

Example 3 with RecordDatabaseLayout

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 };
}
Also used : CachedStoreCursors(org.neo4j.kernel.impl.store.cursor.CachedStoreCursors) LockGroup(org.neo4j.lock.LockGroup) Config(org.neo4j.configuration.Config) DefaultIdGeneratorFactory(org.neo4j.internal.id.DefaultIdGeneratorFactory) RelationshipStore(org.neo4j.kernel.impl.store.RelationshipStore) StoreFactory(org.neo4j.kernel.impl.store.StoreFactory) RecordDatabaseLayout(org.neo4j.io.layout.recordstorage.RecordDatabaseLayout) ConsistencyCheckingApplier(org.neo4j.internal.recordstorage.ConsistencyCheckingApplierFactory.ConsistencyCheckingApplier) BeforeEach(org.junit.jupiter.api.BeforeEach)

Example 4 with RecordDatabaseLayout

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);
        }
    }
}
Also used : RecordFormats(org.neo4j.kernel.impl.store.format.RecordFormats) CursorContext(org.neo4j.io.pagecache.context.CursorContext) RecordDatabaseLayout(org.neo4j.io.layout.recordstorage.RecordDatabaseLayout)

Example 5 with RecordDatabaseLayout

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;
}
Also used : Path(java.nio.file.Path) StoreType(org.neo4j.kernel.impl.store.StoreType) Sets.immutable(org.eclipse.collections.api.factory.Sets.immutable) LongSupplier(java.util.function.LongSupplier) IdGeneratorFactory(org.neo4j.internal.id.IdGeneratorFactory) ProgressReporter(org.neo4j.common.ProgressReporter) CursorContext(org.neo4j.io.pagecache.context.CursorContext) Config(org.neo4j.configuration.Config) NullLogProvider(org.neo4j.logging.NullLogProvider) DatabaseLayout(org.neo4j.io.layout.DatabaseLayout) ArrayList(java.util.ArrayList) RecordFormats(org.neo4j.kernel.impl.store.format.RecordFormats) HashSet(java.util.HashSet) DatabaseReadOnlyChecker(org.neo4j.dbms.database.readonly.DatabaseReadOnlyChecker) ScanOnOpenReadOnlyIdGeneratorFactory(org.neo4j.internal.id.ScanOnOpenReadOnlyIdGeneratorFactory) NeoStores(org.neo4j.kernel.impl.store.NeoStores) Iterables(org.neo4j.internal.helpers.collection.Iterables) IdGenerator(org.neo4j.internal.id.IdGenerator) PageCacheTracer(org.neo4j.io.pagecache.tracing.PageCacheTracer) Path(java.nio.file.Path) AbstractStoreMigrationParticipant(org.neo4j.storageengine.migration.AbstractStoreMigrationParticipant) PageCache(org.neo4j.io.pagecache.PageCache) DatabaseReadOnlyChecker.writable(org.neo4j.dbms.database.readonly.DatabaseReadOnlyChecker.writable) OpenOption(java.nio.file.OpenOption) IdSlotDistribution(org.neo4j.internal.id.IdSlotDistribution) RecordDatabaseFile(org.neo4j.io.layout.recordstorage.RecordDatabaseFile) Set(java.util.Set) RecordFormatSelector.selectForVersion(org.neo4j.kernel.impl.store.format.RecordFormatSelector.selectForVersion) GBPTREE_ID_FILES(org.neo4j.kernel.impl.store.format.RecordStorageCapability.GBPTREE_ID_FILES) IOException(java.io.IOException) MOVE(org.neo4j.kernel.impl.storemigration.FileOperation.MOVE) StoreMigratorFileOperation.fileOperation(org.neo4j.kernel.impl.storemigration.StoreMigratorFileOperation.fileOperation) IndexImporterFactory(org.neo4j.internal.batchimport.IndexImporterFactory) IdType(org.neo4j.internal.id.IdType) RecoveryCleanupWorkCollector.immediate(org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector.immediate) List(java.util.List) Stream(java.util.stream.Stream) DefaultIdGeneratorFactory(org.neo4j.internal.id.DefaultIdGeneratorFactory) StoreType(org.neo4j.kernel.impl.store.StoreType) ImmutableSet(org.eclipse.collections.api.set.ImmutableSet) RecordDatabaseLayout(org.neo4j.io.layout.recordstorage.RecordDatabaseLayout) StoreFactory(org.neo4j.kernel.impl.store.StoreFactory) FileSystemAbstraction(org.neo4j.io.fs.FileSystemAbstraction) ScanOnOpenReadOnlyIdGeneratorFactory(org.neo4j.internal.id.ScanOnOpenReadOnlyIdGeneratorFactory) HashSet(java.util.HashSet)

Aggregations

RecordDatabaseLayout (org.neo4j.io.layout.recordstorage.RecordDatabaseLayout)29 Test (org.junit.jupiter.api.Test)17 Config (org.neo4j.configuration.Config)13 DefaultIdGeneratorFactory (org.neo4j.internal.id.DefaultIdGeneratorFactory)11 FileSystemAbstraction (org.neo4j.io.fs.FileSystemAbstraction)9 StoreFactory (org.neo4j.kernel.impl.store.StoreFactory)8 ConsistencyCheckService (org.neo4j.consistency.ConsistencyCheckService)7 DefaultFileSystemAbstraction (org.neo4j.io.fs.DefaultFileSystemAbstraction)7 IOException (java.io.IOException)6 Path (java.nio.file.Path)6 ConsistencyFlags (org.neo4j.consistency.checking.full.ConsistencyFlags)6 NeoStores (org.neo4j.kernel.impl.store.NeoStores)6 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)5 ExecutionContext (org.neo4j.cli.ExecutionContext)5 CheckConsistencyCommand (org.neo4j.consistency.CheckConsistencyCommand)5 ProgressMonitorFactory (org.neo4j.internal.helpers.progress.ProgressMonitorFactory)5 RecordFormats (org.neo4j.kernel.impl.store.format.RecordFormats)4 GraphDatabaseAPI (org.neo4j.kernel.internal.GraphDatabaseAPI)4 TokenHolders (org.neo4j.token.TokenHolders)4 ArrayList (java.util.ArrayList)3