use of org.neo4j.internal.id.IdGeneratorFactory 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.IdGeneratorFactory in project neo4j by neo4j.
the class BigStoreIT method setHighId.
private void setHighId(IdType type, long highId) {
IdGeneratorFactory idGeneratorFactory = ((GraphDatabaseAPI) db).getDependencyResolver().resolveDependency(IdGeneratorFactory.class);
IdGenerator idGenerator = idGeneratorFactory.get(type);
idGenerator.setHighId(highId);
idGenerator.markHighestWrittenAtHighId();
}
use of org.neo4j.internal.id.IdGeneratorFactory in project neo4j by neo4j.
the class NeoStoresTest method newStoreFactory.
private static StoreFactory newStoreFactory(DatabaseLayout databaseLayout, PageCache pageCache, FileSystemAbstraction fs) {
RecordFormats recordFormats = RecordFormatSelector.defaultFormat();
Config config = Config.defaults();
IdGeneratorFactory idGeneratorFactory = new DefaultIdGeneratorFactory(fs, immediate(), databaseLayout.getDatabaseName());
return new StoreFactory(databaseLayout, config, idGeneratorFactory, pageCache, fs, recordFormats, LOG_PROVIDER, PageCacheTracer.NULL, writable(), immutable.empty());
}
use of org.neo4j.internal.id.IdGeneratorFactory in project neo4j by neo4j.
the class DatabaseFileListingTest method shouldCloseIndexSnapshots.
@Test
void shouldCloseIndexSnapshots() throws Exception {
// Given
IndexingService indexingService = mock(IndexingService.class);
DatabaseLayout databaseLayout = mock(DatabaseLayout.class);
when(databaseLayout.metadataStore()).thenReturn(mock(Path.class));
LogFiles logFiles = mock(LogFiles.class);
filesInStoreDirAre(databaseLayout, STANDARD_STORE_DIR_FILES, STANDARD_STORE_DIR_DIRECTORIES);
StorageEngine storageEngine = mock(StorageEngine.class);
IdGeneratorFactory idGeneratorFactory = mock(IdGeneratorFactory.class);
DatabaseFileListing fileListing = new DatabaseFileListing(databaseLayout, logFiles, indexingService, storageEngine, idGeneratorFactory);
ResourceIterator<Path> indexSnapshot = indexFilesAre(indexingService, new String[] { "schema/index/my.index" });
ResourceIterator<StoreFileMetadata> result = fileListing.builder().excludeLogFiles().build();
// When
result.close();
// Then
verify(indexSnapshot).close();
}
use of org.neo4j.internal.id.IdGeneratorFactory 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());
}
Aggregations