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));
}
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);
}
}
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();
}
}
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());
}
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);
}
}
Aggregations