Search in sources :

Example 1 with IdType

use of org.neo4j.internal.id.IdType in project neo4j by neo4j.

the class ApplyRecoveredTransactionsTest method applyExternalTransaction.

private void applyExternalTransaction(long transactionId, Command... commands) throws Exception {
    LockService lockService = mock(LockService.class);
    when(lockService.acquireNodeLock(anyLong(), any(LockType.class))).thenReturn(LockService.NO_LOCK);
    when(lockService.acquireRelationshipLock(anyLong(), any(LockType.class))).thenReturn(LockService.NO_LOCK);
    Map<IdType, WorkSync<IdGenerator, IdGeneratorUpdateWork>> idGeneratorWorkSyncs = new EnumMap<>(IdType.class);
    for (IdType idType : IdType.values()) {
        idGeneratorWorkSyncs.put(idType, new WorkSync<>(idGeneratorFactory.get(idType)));
    }
    NeoStoreTransactionApplierFactory applier = new NeoStoreTransactionApplierFactory(INTERNAL, neoStores, mock(CacheAccessBackDoor.class), lockService);
    CommandsToApply tx = new GroupOfCommands(transactionId, commands);
    CommandHandlerContract.apply(applier, txApplier -> {
        tx.accept(txApplier);
        return false;
    }, new GroupOfCommands(transactionId, commands));
}
Also used : CommandsToApply(org.neo4j.storageengine.api.CommandsToApply) WorkSync(org.neo4j.util.concurrent.WorkSync) LockService(org.neo4j.lock.LockService) LockType(org.neo4j.lock.LockType) EnumMap(java.util.EnumMap) IdType(org.neo4j.internal.id.IdType)

Example 2 with IdType

use of org.neo4j.internal.id.IdType in project neo4j by neo4j.

the class IdGeneratorMigrator method migrateIdFiles.

private void migrateIdFiles(DatabaseLayout directoryLayout, DatabaseLayout migrationLayout, RecordFormats oldFormat, RecordFormats newFormat, ProgressReporter progress, CursorContext cursorContext) throws IOException {
    // The store .id files needs to be migrated. At this point some of them have been sort-of-migrated, i.e. merely ported
    // to the new format, but just got the highId and nothing else. Regardless we want to do a proper migration here,
    // which not only means creating an empty id file w/ only highId. No, it also means scanning the stores and properly
    // updating its freelist so that from this point no ids will be lost, ever.
    // For every store type: if store is in migrationLayout use that, else use the one from the dbLayout because it will
    // be of the current format already. Then scan it and create the .id file in the migration layout.
    List<StoreType> storesInDbDirectory = new ArrayList<>();
    List<StoreType> storesInMigrationDirectory = new ArrayList<>();
    for (StoreType storeType : StoreType.values()) {
        // See if it exists in migration directory, otherwise it must be in the db directory
        List<StoreType> list = fileSystem.fileExists(migrationLayout.file(storeType.getDatabaseFile())) ? storesInMigrationDirectory : storesInDbDirectory;
        list.add(storeType);
    }
    progress.start(storesInDbDirectory.size() + storesInMigrationDirectory.size());
    // Rebuild the .id files from the legacy stores that haven't been upgraded, i.e. if they remained unchanged
    // Make them end up in upgrade/<store>.id so that they won't overwrite the origin .id file before the upgrade is completed
    IdGeneratorFactory rebuiltIdGeneratorsFromOldStore = new DefaultIdGeneratorFactory(fileSystem, immediate(), directoryLayout.getDatabaseName()) {

        @Override
        public IdGenerator open(PageCache pageCache, Path filename, IdType idType, LongSupplier highIdScanner, long maxId, DatabaseReadOnlyChecker readOnlyChecker, Config config, CursorContext cursorContext, ImmutableSet<OpenOption> openOptions) throws IOException {
            Path redirectedFilename = migrationLayout.databaseDirectory().resolve(filename.getFileName().toString());
            return super.open(pageCache, redirectedFilename, idType, highIdScanner, maxId, readOnlyChecker, config, cursorContext, openOptions);
        }

        @Override
        public IdGenerator create(PageCache pageCache, Path fileName, IdType idType, long highId, boolean throwIfFileExists, long maxId, DatabaseReadOnlyChecker readOnlyChecker, Config config, CursorContext cursorContext, ImmutableSet<OpenOption> openOptions) {
            throw new IllegalStateException("The store file should exist and therefore all calls should be to open, not create");
        }
    };
    startAndTriggerRebuild(directoryLayout, oldFormat, rebuiltIdGeneratorsFromOldStore, storesInDbDirectory, progress, cursorContext);
    // Build the ones from the migration directory, those stores that have been migrated
    // Before doing this we will have to create empty stores for those that are missing, otherwise some of the stores
    // that we need to open will complain because some of their "sub-stores" doesn't exist. They will be empty, it's fine...
    // and we will not read from them at all. They will just sit there and allow their parent store to be opened.
    // We'll remove them after we have built the id files
    IdGeneratorFactory rebuiltIdGeneratorsFromNewStore = new DefaultIdGeneratorFactory(fileSystem, immediate(), migrationLayout.getDatabaseName());
    Set<Path> placeHolderStoreFiles = createEmptyPlaceHolderStoreFiles(migrationLayout, newFormat);
    startAndTriggerRebuild(migrationLayout, newFormat, rebuiltIdGeneratorsFromNewStore, storesInMigrationDirectory, progress, cursorContext);
    for (Path emptyPlaceHolderStoreFile : placeHolderStoreFiles) {
        fileSystem.deleteFile(emptyPlaceHolderStoreFile);
    }
}
Also used : Path(java.nio.file.Path) Config(org.neo4j.configuration.Config) ArrayList(java.util.ArrayList) DefaultIdGeneratorFactory(org.neo4j.internal.id.DefaultIdGeneratorFactory) IdGeneratorFactory(org.neo4j.internal.id.IdGeneratorFactory) ScanOnOpenReadOnlyIdGeneratorFactory(org.neo4j.internal.id.ScanOnOpenReadOnlyIdGeneratorFactory) DefaultIdGeneratorFactory(org.neo4j.internal.id.DefaultIdGeneratorFactory) CursorContext(org.neo4j.io.pagecache.context.CursorContext) IdType(org.neo4j.internal.id.IdType) StoreType(org.neo4j.kernel.impl.store.StoreType) ImmutableSet(org.eclipse.collections.api.set.ImmutableSet) DatabaseReadOnlyChecker(org.neo4j.configuration.helpers.DatabaseReadOnlyChecker) LongSupplier(java.util.function.LongSupplier) PageCache(org.neo4j.io.pagecache.PageCache)

Example 3 with IdType

use of org.neo4j.internal.id.IdType in project neo4j by neo4j.

the class RecoveryIT method idGeneratorIsDirty.

private boolean idGeneratorIsDirty(Path path, IdType idType) throws IOException {
    DefaultIdGeneratorFactory idGeneratorFactory = new DefaultIdGeneratorFactory(fileSystem, immediate(), "my db");
    try (IdGenerator idGenerator = idGeneratorFactory.open(pageCache, path, idType, () -> 0L, /*will not be used*/
    10_000, readOnly(), Config.defaults(), NULL, Sets.immutable.empty())) {
        MutableBoolean dirtyOnStartup = new MutableBoolean();
        InvocationHandler invocationHandler = (proxy, method, args) -> {
            if (method.getName().equals("dirtyOnStartup")) {
                dirtyOnStartup.setTrue();
            }
            return null;
        };
        ReporterFactory reporterFactory = new ReporterFactory(invocationHandler);
        idGenerator.consistencyCheck(reporterFactory, NULL);
        return dirtyOnStartup.booleanValue();
    }
}
Also used : LifecycleAdapter(org.neo4j.kernel.lifecycle.LifecycleAdapter) MetaDataStore.getRecord(org.neo4j.kernel.impl.store.MetaDataStore.getRecord) DatabaseReadOnlyChecker.readOnly(org.neo4j.configuration.helpers.DatabaseReadOnlyChecker.readOnly) GraphDatabaseSettings.fail_on_missing_files(org.neo4j.configuration.GraphDatabaseSettings.fail_on_missing_files) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) ReporterFactory(org.neo4j.annotations.documented.ReporterFactory) LogFilesBuilder(org.neo4j.kernel.impl.transaction.log.files.LogFilesBuilder) Config(org.neo4j.configuration.Config) DefaultPageCacheTracer(org.neo4j.io.pagecache.tracing.DefaultPageCacheTracer) InternalTransaction(org.neo4j.kernel.impl.coreapi.InternalTransaction) DatabaseLayout(org.neo4j.io.layout.DatabaseLayout) Recovery.performRecovery(org.neo4j.kernel.recovery.Recovery.performRecovery) DEFAULT_DATABASE_NAME(org.neo4j.configuration.GraphDatabaseSettings.DEFAULT_DATABASE_NAME) GraphDatabaseSettings.logical_log_rotation_threshold(org.neo4j.configuration.GraphDatabaseSettings.logical_log_rotation_threshold) LogCheckPointEvent(org.neo4j.kernel.impl.transaction.tracing.LogCheckPointEvent) Assertions.assertFalse(org.junit.jupiter.api.Assertions.assertFalse) AssertableLogProvider(org.neo4j.logging.AssertableLogProvider) Monitors(org.neo4j.monitoring.Monitors) CHECKPOINT_LOG_VERSION(org.neo4j.kernel.impl.store.MetaDataStore.Position.CHECKPOINT_LOG_VERSION) NULL(org.neo4j.io.pagecache.context.CursorContext.NULL) Transaction(org.neo4j.graphdb.Transaction) Path(java.nio.file.Path) PageCache(org.neo4j.io.pagecache.PageCache) LAST_MISSING_STORE_FILES_RECOVERY_TIMESTAMP(org.neo4j.kernel.impl.store.MetaDataStore.Position.LAST_MISSING_STORE_FILES_RECOVERY_TIMESTAMP) DEFAULT_NAME(org.neo4j.kernel.impl.transaction.log.files.TransactionLogFilesHelper.DEFAULT_NAME) LegacyTransactionLogsLocator(org.neo4j.kernel.impl.storemigration.LegacyTransactionLogsLocator) DatabaseReadOnlyChecker.writable(org.neo4j.configuration.helpers.DatabaseReadOnlyChecker.writable) CompositeDatabaseAvailabilityGuard(org.neo4j.kernel.availability.CompositeDatabaseAvailabilityGuard) RelationshipType.withName(org.neo4j.graphdb.RelationshipType.withName) Instant(java.time.Instant) ArrayUtil(org.neo4j.internal.helpers.ArrayUtil) Services(org.neo4j.service.Services) Neo4jLayoutExtension(org.neo4j.test.extension.Neo4jLayoutExtension) GraphDatabaseAPI(org.neo4j.kernel.internal.GraphDatabaseAPI) Test(org.junit.jupiter.api.Test) IdType(org.neo4j.internal.id.IdType) IndexQueryConstraints.unconstrained(org.neo4j.internal.kernel.api.IndexQueryConstraints.unconstrained) DatabaseStateService(org.neo4j.dbms.DatabaseStateService) INSTANCE(org.neo4j.memory.EmptyMemoryTracker.INSTANCE) ExtensionContext(org.neo4j.kernel.extension.context.ExtensionContext) RandomStringUtils.randomAlphanumeric(org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric) DefaultIdGeneratorFactory(org.neo4j.internal.id.DefaultIdGeneratorFactory) MetaDataStore(org.neo4j.kernel.impl.store.MetaDataStore) Assertions.assertTrue(org.junit.jupiter.api.Assertions.assertTrue) Optional(java.util.Optional) DatabaseStartAbortedException(org.neo4j.dbms.database.DatabaseStartAbortedException) RelationshipType(org.neo4j.graphdb.RelationshipType) IndexDescriptor(org.neo4j.internal.schema.IndexDescriptor) MutableBoolean(org.apache.commons.lang3.mutable.MutableBoolean) DatabaseManagementService(org.neo4j.dbms.api.DatabaseManagementService) Assertions.assertThrows(org.junit.jupiter.api.Assertions.assertThrows) LogFiles(org.neo4j.kernel.impl.transaction.log.files.LogFiles) Assertions.assertNotNull(org.junit.jupiter.api.Assertions.assertNotNull) Label(org.neo4j.graphdb.Label) Config.defaults(org.neo4j.configuration.Config.defaults) IndexReadSession(org.neo4j.internal.kernel.api.IndexReadSession) DatabaseTracer(org.neo4j.kernel.impl.transaction.tracing.DatabaseTracer) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) MINUTES(java.util.concurrent.TimeUnit.MINUTES) Node(org.neo4j.graphdb.Node) IndexType(org.neo4j.graphdb.schema.IndexType) GraphDatabaseSettings.preallocate_logical_logs(org.neo4j.configuration.GraphDatabaseSettings.preallocate_logical_logs) LogPosition(org.neo4j.kernel.impl.transaction.log.LogPosition) PropertyIndexQuery.fulltextSearch(org.neo4j.internal.kernel.api.PropertyIndexQuery.fulltextSearch) TestDatabaseManagementServiceBuilder(org.neo4j.test.TestDatabaseManagementServiceBuilder) GraphDatabaseService(org.neo4j.graphdb.GraphDatabaseService) Inject(org.neo4j.test.extension.Inject) StorageEngineFactory.defaultStorageEngine(org.neo4j.storageengine.api.StorageEngineFactory.defaultStorageEngine) Iterables(org.neo4j.internal.helpers.collection.Iterables) IdGenerator(org.neo4j.internal.id.IdGenerator) GraphDatabaseInternalSettings(org.neo4j.configuration.GraphDatabaseInternalSettings) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) EMPTY(org.neo4j.kernel.database.DatabaseTracers.EMPTY) Sets(org.eclipse.collections.api.factory.Sets) Lifecycle(org.neo4j.kernel.lifecycle.Lifecycle) NullLogProvider.nullLogProvider(org.neo4j.logging.NullLogProvider.nullLogProvider) BASE_TX_LOG_BYTE_OFFSET(org.neo4j.storageengine.api.LogVersionRepository.BASE_TX_LOG_BYTE_OFFSET) DetachedCheckpointAppender(org.neo4j.kernel.impl.transaction.log.checkpoint.DetachedCheckpointAppender) ByteUnit(org.neo4j.io.ByteUnit) LockTracer(org.neo4j.lock.LockTracer) PageCacheExtension(org.neo4j.test.extension.pagecache.PageCacheExtension) Iterables.count(org.neo4j.internal.helpers.collection.Iterables.count) RelationshipValueIndexCursor(org.neo4j.internal.kernel.api.RelationshipValueIndexCursor) ExceptionUtils.getRootCause(org.apache.commons.lang3.exception.ExceptionUtils.getRootCause) IOException(java.io.IOException) Neo4jLayout(org.neo4j.io.layout.Neo4jLayout) DatabaseTracers(org.neo4j.kernel.database.DatabaseTracers) StorageEngineFactory(org.neo4j.storageengine.api.StorageEngineFactory) RecoveryCleanupWorkCollector.immediate(org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector.immediate) DefaultFileSystemAbstraction(org.neo4j.io.fs.DefaultFileSystemAbstraction) ExtensionFactory(org.neo4j.kernel.extension.ExtensionFactory) Relationship(org.neo4j.graphdb.Relationship) String.valueOf(java.lang.String.valueOf) KernelTransaction(org.neo4j.kernel.api.KernelTransaction) Clock(java.time.Clock) InvocationHandler(java.lang.reflect.InvocationHandler) ReporterFactory(org.neo4j.annotations.documented.ReporterFactory) MutableBoolean(org.apache.commons.lang3.mutable.MutableBoolean) DefaultIdGeneratorFactory(org.neo4j.internal.id.DefaultIdGeneratorFactory) IdGenerator(org.neo4j.internal.id.IdGenerator) InvocationHandler(java.lang.reflect.InvocationHandler)

Example 4 with IdType

use of org.neo4j.internal.id.IdType in project neo4j by neo4j.

the class IdContextFactoryBuilderTest method createContextWithCustomIdGeneratorFactoryWhenProvided.

@Test
void createContextWithCustomIdGeneratorFactoryWhenProvided() throws IOException {
    IdGeneratorFactory idGeneratorFactory = mock(IdGeneratorFactory.class);
    Config config = defaults();
    IdContextFactory contextFactory = IdContextFactoryBuilder.of(fs, jobScheduler, config, PageCacheTracer.NULL).withIdGenerationFactoryProvider(any -> idGeneratorFactory).build();
    DatabaseIdContext idContext = contextFactory.createIdContext(databaseIdRepository.getByName("database").get());
    IdGeneratorFactory bufferedGeneratorFactory = idContext.getIdGeneratorFactory();
    assertThat(idContext.getIdController()).isInstanceOf(BufferedIdController.class);
    assertThat(bufferedGeneratorFactory).isInstanceOf(BufferingIdGeneratorFactory.class);
    ((BufferingIdGeneratorFactory) bufferedGeneratorFactory).initialize(() -> mock(KernelTransactionsSnapshot.class));
    Path file = testDirectory.file("a");
    IdType idType = IdType.NODE;
    LongSupplier highIdSupplier = () -> 0;
    int maxId = 100;
    idGeneratorFactory.open(pageCache, file, idType, highIdSupplier, maxId, writable(), config, NULL, immutable.empty());
    verify(idGeneratorFactory).open(pageCache, file, idType, highIdSupplier, maxId, writable(), config, NULL, immutable.empty());
}
Also used : Assertions.assertThrows(org.junit.jupiter.api.Assertions.assertThrows) Sets.immutable(org.eclipse.collections.api.factory.Sets.immutable) LongSupplier(java.util.function.LongSupplier) IdGeneratorFactory(org.neo4j.internal.id.IdGeneratorFactory) Config.defaults(org.neo4j.configuration.Config.defaults) DatabaseIdFactory.from(org.neo4j.kernel.database.DatabaseIdFactory.from) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) Config(org.neo4j.configuration.Config) DefaultPageCacheTracer(org.neo4j.io.pagecache.tracing.DefaultPageCacheTracer) Function(java.util.function.Function) BufferedIdController(org.neo4j.internal.id.BufferedIdController) TestDatabaseIdRepository(org.neo4j.kernel.database.TestDatabaseIdRepository) Inject(org.neo4j.test.extension.Inject) IdGenerator(org.neo4j.internal.id.IdGenerator) PageCacheTracer(org.neo4j.io.pagecache.tracing.PageCacheTracer) NULL(org.neo4j.io.pagecache.context.CursorContext.NULL) BufferingIdGeneratorFactory(org.neo4j.internal.id.BufferingIdGeneratorFactory) JobScheduler(org.neo4j.scheduler.JobScheduler) Path(java.nio.file.Path) DatabaseIdRepository(org.neo4j.kernel.database.DatabaseIdRepository) PageCache(org.neo4j.io.pagecache.PageCache) PageCacheExtension(org.neo4j.test.extension.pagecache.PageCacheExtension) DatabaseReadOnlyChecker.writable(org.neo4j.configuration.helpers.DatabaseReadOnlyChecker.writable) TestDirectory(org.neo4j.test.rule.TestDirectory) IOException(java.io.IOException) UUID(java.util.UUID) Assertions.assertSame(org.junit.jupiter.api.Assertions.assertSame) Mockito.verify(org.mockito.Mockito.verify) Test(org.junit.jupiter.api.Test) IdType(org.neo4j.internal.id.IdType) DefaultFileSystemAbstraction(org.neo4j.io.fs.DefaultFileSystemAbstraction) KernelTransactionsSnapshot(org.neo4j.kernel.impl.api.KernelTransactionsSnapshot) Mockito.mock(org.mockito.Mockito.mock) Path(java.nio.file.Path) Config(org.neo4j.configuration.Config) BufferingIdGeneratorFactory(org.neo4j.internal.id.BufferingIdGeneratorFactory) IdGeneratorFactory(org.neo4j.internal.id.IdGeneratorFactory) BufferingIdGeneratorFactory(org.neo4j.internal.id.BufferingIdGeneratorFactory) LongSupplier(java.util.function.LongSupplier) KernelTransactionsSnapshot(org.neo4j.kernel.impl.api.KernelTransactionsSnapshot) IdType(org.neo4j.internal.id.IdType) Test(org.junit.jupiter.api.Test)

Example 5 with IdType

use of org.neo4j.internal.id.IdType in project neo4j by neo4j.

the class IdContextFactoryBuilderTest method useProvidedPageCacheCursorOnIdMaintenance.

@Test
void useProvidedPageCacheCursorOnIdMaintenance() throws IOException {
    PageCacheTracer cacheTracer = new DefaultPageCacheTracer();
    Config config = defaults();
    var idContextFactory = IdContextFactoryBuilder.of(fs, jobScheduler, config, cacheTracer).build();
    var idContext = idContextFactory.createIdContext(from("test", UUID.randomUUID()));
    var idGeneratorFactory = idContext.getIdGeneratorFactory();
    var idController = idContext.getIdController();
    idController.initialize(() -> () -> true);
    Path file = testDirectory.file("b");
    IdType idType = IdType.NODE;
    try (IdGenerator idGenerator = idGeneratorFactory.create(pageCache, file, idType, 1, false, 100, writable(), config, NULL, immutable.empty())) {
        idGenerator.marker(NULL).markDeleted(1);
        idGeneratorFactory.clearCache(NULL);
        assertThat(cacheTracer.pins()).isZero();
        assertThat(cacheTracer.unpins()).isZero();
        assertThat(cacheTracer.hits()).isZero();
        idController.maintenance();
        assertThat(cacheTracer.pins()).isGreaterThan(0);
        assertThat(cacheTracer.unpins()).isGreaterThan(0);
        assertThat(cacheTracer.hits()).isGreaterThan(0);
    }
}
Also used : Path(java.nio.file.Path) Config(org.neo4j.configuration.Config) DefaultPageCacheTracer(org.neo4j.io.pagecache.tracing.DefaultPageCacheTracer) PageCacheTracer(org.neo4j.io.pagecache.tracing.PageCacheTracer) IdGenerator(org.neo4j.internal.id.IdGenerator) DefaultPageCacheTracer(org.neo4j.io.pagecache.tracing.DefaultPageCacheTracer) IdType(org.neo4j.internal.id.IdType) Test(org.junit.jupiter.api.Test)

Aggregations

IdType (org.neo4j.internal.id.IdType)7 Path (java.nio.file.Path)5 Config (org.neo4j.configuration.Config)5 PageCache (org.neo4j.io.pagecache.PageCache)4 LongSupplier (java.util.function.LongSupplier)3 Test (org.junit.jupiter.api.Test)3 DefaultIdGeneratorFactory (org.neo4j.internal.id.DefaultIdGeneratorFactory)3 IOException (java.io.IOException)2 EnumMap (java.util.EnumMap)2 Assertions.assertThat (org.assertj.core.api.Assertions.assertThat)2 Assertions.assertThrows (org.junit.jupiter.api.Assertions.assertThrows)2 Config.defaults (org.neo4j.configuration.Config.defaults)2 DatabaseReadOnlyChecker (org.neo4j.configuration.helpers.DatabaseReadOnlyChecker)2 DatabaseReadOnlyChecker.writable (org.neo4j.configuration.helpers.DatabaseReadOnlyChecker.writable)2 IdGenerator (org.neo4j.internal.id.IdGenerator)2 IdGeneratorFactory (org.neo4j.internal.id.IdGeneratorFactory)2 DefaultPageCacheTracer (org.neo4j.io.pagecache.tracing.DefaultPageCacheTracer)2 PageCacheTracer (org.neo4j.io.pagecache.tracing.PageCacheTracer)2 String.valueOf (java.lang.String.valueOf)1 InvocationHandler (java.lang.reflect.InvocationHandler)1