@Override public long getNumberOfNodeIdsInUse() { return idGeneratorFactory.get( IdType.NODE ).getNumberOfIdsInUse(); }
/** * Opens the {@link IdGenerator} used by this store. * <p> * Note: This method may be called both while the store has the store file mapped in the * page cache, and while the store file is not mapped. Implementers must therefore * map their own temporary PagedFile for the store file, and do their file IO through that, * if they need to access the data in the store file. */ void openIdGenerator() { idGenerator = idGeneratorFactory.open( idFile, getIdType(), this::scanForHighId, recordFormat.getMaxId() ); }
private void createIdGenerator( File fileName ) { idGeneratorFactory.create( fileName, 0, false ); }
@Override public long getNumberOfRelationshipTypeIdsInUse() { return idGeneratorFactory.get( IdType.RELATIONSHIP_TYPE_TOKEN ).getNumberOfIdsInUse(); } }
@Before public void setUpMocks() throws IOException { when( idGeneratorFactory.open( any( File.class ), eq( idType ), any( LongSupplier.class ), anyLong() ) ) .thenReturn( idGenerator ); when( pageFile.pageSize() ).thenReturn( PAGE_SIZE ); when( pageFile.io( anyLong(), anyInt() ) ).thenReturn( pageCursor ); when( pageCache.map( eq( storeFile ), anyInt() ) ).thenReturn( pageFile ); }
@Override public void create( File filename, long highId, boolean throwIfFileExists ) { delegate.create( filename, highId, throwIfFileExists ); }
@Override public long properties() { return idGeneratorFactory.get( PROPERTY ).getNumberOfIdsInUse(); }
@Override public IdGenerator open( File filename, int grabSize, IdType idType, LongSupplier highId, long maxId ) { assert boundaries != null : "Factory needs to be initialized before usage"; IdGenerator generator = delegate.open( filename, grabSize, idType, highId, maxId ); IdTypeConfiguration typeConfiguration = getIdTypeConfiguration(idType); if ( typeConfiguration.allowAggressiveReuse() ) { BufferingIdGenerator bufferingGenerator = new BufferingIdGenerator( generator ); bufferingGenerator.initialize( boundaries, safeThreshold ); overriddenIdGenerators[idType.ordinal()] = bufferingGenerator; generator = bufferingGenerator; } return generator; }
private void flushIdFiles( NeoStores neoStores, StoreType[] storeTypes ) { for ( StoreType type : storeTypes ) { if ( type.isRecordStore() ) { RecordStore<AbstractBaseRecord> recordStore = neoStores.getRecordStore( type ); Optional<File> idFile = databaseLayout.idFile( type.getDatabaseFile() ); idFile.ifPresent( f -> idGeneratorFactory.create( f, recordStore.getHighId(), false ) ); } } } }
@Override public long getNumberOfRelationshipIdsInUse() { return idGeneratorFactory.get( IdType.RELATIONSHIP ).getNumberOfIdsInUse(); }
@Test void createContextWithCustomIdGeneratorFactoryWhenProvided() { IdGeneratorFactory idGeneratorFactory = mock( IdGeneratorFactory.class ); IdContextFactory contextFactory = IdContextFactoryBuilder.of( fs, jobScheduler ).withIdGenerationFactoryProvider( any -> idGeneratorFactory ).build(); DatabaseIdContext idContext = contextFactory.createIdContext( "database" ); IdGeneratorFactory bufferedGeneratorFactory = idContext.getIdGeneratorFactory(); assertThat( idContext.getIdController(), instanceOf( BufferedIdController.class ) ); assertThat( bufferedGeneratorFactory, instanceOf( BufferingIdGeneratorFactory.class ) ); ((BufferingIdGeneratorFactory)bufferedGeneratorFactory).initialize( () -> mock( KernelTransactionsSnapshot.class ) ); File file = testDirectory.file( "a" ); IdType idType = IdType.NODE; LongSupplier highIdSupplier = () -> 0; int maxId = 100; idGeneratorFactory.open( file, idType, highIdSupplier, maxId ); verify( idGeneratorFactory ).open( file, idType, highIdSupplier, maxId ); }
protected void initialiseNewStoreFile( PagedFile file ) throws IOException { if ( getNumberOfReservedLowIds() > 0 ) { try ( PageCursor pageCursor = file.io( 0, PF_SHARED_WRITE_LOCK ) ) { if ( pageCursor.next() ) { pageCursor.setOffset( 0 ); createHeaderRecord( pageCursor ); if ( pageCursor.checkAndClearBoundsFlag() ) { throw new UnderlyingStorageException( "Out of page bounds when writing header; page size too small: " + pageCache.pageSize() + " bytes." ); } } } } // Determine record size right after writing the header since some stores // use it when initializing their stores to write some records. recordSize = determineRecordSize(); idGeneratorFactory.create( idFile, getNumberOfReservedLowIds(), false ); }
@Override public long getNumberOfPropertyIdsInUse() { return idGeneratorFactory.get( IdType.PROPERTY ).getNumberOfIdsInUse(); }
@Test void createCommunityBufferedContextByDefault() { IdContextFactory idContextFactory = IdContextFactoryBuilder.of( fs, jobScheduler ).build(); DatabaseIdContext idContext = idContextFactory.createIdContext( "database" ); IdGeneratorFactory idGeneratorFactory = idContext.getIdGeneratorFactory(); assertThat( idContext.getIdController(), instanceOf( BufferedIdController.class ) ); assertThat( idGeneratorFactory, instanceOf( BufferingIdGeneratorFactory.class ) ); ((BufferingIdGeneratorFactory)idGeneratorFactory).initialize( () -> mock( KernelTransactionsSnapshot.class ) ); idGeneratorFactory.open( testDirectory.file( "a"), IdType.NODE, () -> 0, 100 ).close(); idGeneratorFactory.open( testDirectory.file( "b"), IdType.PROPERTY, () -> 0, 100 ).close(); BufferingIdGeneratorFactory bufferedFactory = (BufferingIdGeneratorFactory) idGeneratorFactory; assertThat( bufferedFactory.get( IdType.NODE ), instanceOf( IdGeneratorImpl.class ) ); assertThat( bufferedFactory.get( IdType.PROPERTY ), not( instanceOf( IdGeneratorImpl.class ) ) ); }
@Test public void logModuleSetUpError() { Config config = Config.defaults(); IdGeneratorFactory idGeneratorFactory = mock( IdGeneratorFactory.class ); Throwable openStoresError = new RuntimeException( "Can't set up modules" ); doThrow( openStoresError ).when( idGeneratorFactory ).create( any( File.class ), anyLong(), anyBoolean() ); CommunityIdTypeConfigurationProvider idTypeConfigurationProvider = new CommunityIdTypeConfigurationProvider(); AssertableLogProvider logProvider = new AssertableLogProvider(); SimpleLogService logService = new SimpleLogService( logProvider, logProvider ); PageCache pageCache = pageCacheRule.getPageCache( fs.get() ); Dependencies dependencies = new Dependencies(); dependencies.satisfyDependencies( idGeneratorFactory, idTypeConfigurationProvider, config, logService ); NeoStoreDataSource dataSource = dsRule.getDataSource( dir.databaseLayout(), fs.get(), pageCache, dependencies ); try { dataSource.start(); fail( "Exception expected" ); } catch ( Exception e ) { assertEquals( openStoresError, e ); } logProvider.assertAtLeastOnce( inLog( NeoStoreDataSource.class ).warn( equalTo( "Exception occurred while setting up store modules. Attempting to close things down." ), equalTo( openStoresError ) ) ); }
@Override public IdGenerator get( IdType idType ) { IdGenerator generator = overriddenIdGenerators[idType.ordinal()]; return generator != null ? generator : delegate.get( idType ); }
@Override public IdGenerator open( File filename, IdType idType, LongSupplier highId, long maxId ) { FreeIdFilteredIdGenerator freeIdFilteredIdGenerator = new FreeIdFilteredIdGenerator( delegate.open( filename, idType, highId, maxId ), freeIdCondition ); delegatedGenerator.put( idType, freeIdFilteredIdGenerator ); return freeIdFilteredIdGenerator; }
@Override public void create( File filename, long highId, boolean throwIfFileExists ) { delegate.create( filename, highId, throwIfFileExists ); }
@Override public long nodes() { return idGeneratorFactory.get( NODE ).getNumberOfIdsInUse(); }
@Override public IdGenerator open( File filename, int grabSize, IdType idType, LongSupplier highId, long maxId ) { FreeIdFilteredIdGenerator freeIdFilteredIdGenerator = new FreeIdFilteredIdGenerator( delegate.open( filename, grabSize, idType, highId, maxId ), freeIdCondition ); delegatedGenerator.put( idType, freeIdFilteredIdGenerator ); return freeIdFilteredIdGenerator; }