@Override public long nextId() { return delegate.nextId(); }
/** * Returns the next id for this store's {@link IdGenerator}. * * @return The next free id */ @Override public long nextId() { assertIdGeneratorInitialized(); return idGenerator.nextId(); }
@Test public void mustOverwriteExistingFileIfRequested() { IdGeneratorImpl.createGenerator( fs, idGeneratorFile(), 0, false ); IdGenerator idGenerator = new IdGeneratorImpl( fs, idGeneratorFile(), 1008, 1000, false, IdType.NODE, () -> 0L ); long[] firstFirstIds = new long[]{idGenerator.nextId(), idGenerator.nextId(), idGenerator.nextId()}; idGenerator.close(); IdGeneratorImpl.createGenerator( fs, idGeneratorFile(), 0, false ); idGenerator = new IdGeneratorImpl( fs, idGeneratorFile(), 1008, 1000, false, IdType.NODE, () -> 0L ); long[] secondFirstIds = new long[]{idGenerator.nextId(), idGenerator.nextId(), idGenerator.nextId()}; idGenerator.close(); // Basically, recreating the id file should be the same as start over with the ids. assertThat( secondFirstIds, is( firstFirstIds ) ); }
private void makeSureMagicMinusOneIsSkipped( RecordFormat format ) { deleteIdGeneratorFile(); IdGeneratorImpl.createGenerator( fs, idGeneratorFile(), 0, false ); IdGenerator idGenerator = new IdGeneratorImpl( fs, idGeneratorFile(), 1, format.getMaxId(), false, IdType.NODE, () -> 0L ); long id = (long) Math.pow( 2, 32 ) - 3; idGenerator.setHighId( id ); assertEquals( id, idGenerator.nextId() ); assertEquals( id + 1, idGenerator.nextId() ); // Here we make sure that id+2 (integer -1) is skipped assertEquals( id + 3, idGenerator.nextId() ); assertEquals( id + 4, idGenerator.nextId() ); assertEquals( id + 5, idGenerator.nextId() ); closeIdGenerator( idGenerator ); }
@Test public void testIt() { int sizePerJump = 1000; IdGeneratorFactory factory = new JumpingIdGeneratorFactory( sizePerJump ); IdGenerator generator = factory.get( IdType.NODE ); for ( int i = 0; i < sizePerJump / 2; i++ ) { assertEquals( i, generator.nextId() ); } for ( int i = 0; i < sizePerJump - 1; i++ ) { long expected = 0x100000000L - sizePerJump / 2 + i; if ( expected >= 0xFFFFFFFFL ) { expected++; } assertEquals( expected, generator.nextId() ); } for ( int i = 0; i < sizePerJump; i++ ) { assertEquals( 0x200000000L - sizePerJump / 2 + i, generator.nextId() ); } for ( int i = 0; i < sizePerJump; i++ ) { assertEquals( 0x300000000L - sizePerJump / 2 + i, generator.nextId() ); } }
@Test public void throwsWhenNextIdIsTooHigh() { long maxId = 10; IdGeneratorImpl.createGenerator( fsr.get(), file, 0, false ); IdGenerator idGenerator = new IdGeneratorImpl( fsr.get(), file, 1, maxId, false, IdType.NODE, () -> 0L ); for ( long i = 0; i <= maxId; i++ ) { idGenerator.nextId(); } expectedException.expect( IdCapacityExceededException.class ); expectedException.expectMessage( "Maximum id limit for NODE has been reached. Generated id 11 is out of " + "permitted range [0, 10]." ); idGenerator.nextId(); }
idsTaken.add( idGenerator.nextId() ); currentIdCount++;
private void makeSureIdCapacityCannotBeExceeded( RecordFormat format ) { deleteIdGeneratorFile(); IdGeneratorImpl.createGenerator( fs, idGeneratorFile(), 0, false ); long maxValue = format.getMaxId(); IdGenerator idGenerator = new IdGeneratorImpl( fs, idGeneratorFile(), 1, maxValue - 1, false, IdType.NODE, () -> 0L ); long id = maxValue - 2; idGenerator.setHighId( id ); assertEquals( id, idGenerator.nextId() ); assertEquals( id + 1, idGenerator.nextId() ); try { idGenerator.nextId(); fail( "Id capacity shouldn't be able to be exceeded for " + format ); } catch ( StoreFailureException e ) { // Good } closeIdGenerator( idGenerator ); }
assertEquals( i, idGenerator.nextId() ); assertEquals( 7L, idGenerator.nextId() ); idGenerator.freeId( 6 ); closeIdGenerator( idGenerator ); idGenerator.freeId( 2 ); idGenerator.freeId( 4 ); assertEquals( 1L, idGenerator.nextId() ); idGenerator.freeId( 1 ); assertEquals( 3L, idGenerator.nextId() ); idGenerator.freeId( 3 ); assertEquals( 5L, idGenerator.nextId() ); idGenerator.freeId( 5 ); assertEquals( 6L, idGenerator.nextId() ); idGenerator.freeId( 6 ); assertEquals( 8L, idGenerator.nextId() ); idGenerator.freeId( 8 ); assertEquals( 9L, idGenerator.nextId() ); idGenerator.freeId( 9 ); closeIdGenerator( idGenerator ); idGenerator = new IdGeneratorImpl( fs, idGeneratorFile(), 3, 1000, false, IdType.NODE, () -> 0L ); assertEquals( 6L, idGenerator.nextId() ); assertEquals( 8L, idGenerator.nextId() ); assertEquals( 9L, idGenerator.nextId() ); assertEquals( 1L, idGenerator.nextId() ); assertEquals( 3L, idGenerator.nextId() ); assertEquals( 5L, idGenerator.nextId() ); assertEquals( 2L, idGenerator.nextId() );
@Test public void shouldOnlyChangeLockedRecordsWhenUpgradingToDenseNode() { // GIVEN long nodeId = createNodeWithRelationships( DENSE_NODE_THRESHOLD ); NeoStores neoStores = flipToNeoStores(); Tracker tracker = new Tracker( neoStores ); RelationshipGroupGetter groupGetter = new RelationshipGroupGetter( neoStores.getRelationshipGroupStore() ); RelationshipCreator relationshipCreator = new RelationshipCreator( groupGetter, 5 ); // WHEN relationshipCreator.relationshipCreate( idGeneratorFactory.get( IdType.RELATIONSHIP ).nextId(), 0, nodeId, nodeId, tracker, tracker ); // THEN assertEquals( tracker.relationshipLocksAcquired.size(), tracker.changedRelationships.size() ); assertFalse( tracker.relationshipLocksAcquired.isEmpty() ); }
for ( long i = 0; i < 7; i++ ) assertEquals( i, idGenerator.nextId() ); assertEquals( 5L, idGenerator.nextId() ); assertEquals( 6L, idGenerator.nextId() ); assertEquals( 3L, idGenerator.nextId() ); closeIdGenerator( idGenerator ); idGenerator = new IdGeneratorImpl( fs, idGeneratorFile(), 30, 1000, false, IdType.NODE, () -> 0L ); assertEquals( 0L, idGenerator.nextId() ); assertEquals( 1L, idGenerator.nextId() ); assertEquals( 2L, idGenerator.nextId() ); assertEquals( 4L, idGenerator.nextId() ); closeIdGenerator( idGenerator );
for ( int i = 0; i < capacity; i++ ) idGenerator.nextId(); for ( int i = 0; i < capacity - 1; i += 2 ) long id = idGenerator.nextId(); if ( freedIds.remove( id ) == null ) for ( int i = 0; i < capacity; i++ ) idGenerator.nextId(); for ( int i = 0; i < capacity; i += 2 ) assertEquals( this, freedIds.remove( idGenerator.nextId() ) );
@Test public void testOffsetFileChannel() throws Exception { try ( JumpingFileSystemAbstraction offsetFileSystem = new JumpingFileSystemAbstraction( 10 ) ) { File fileName = new File( "target/var/neostore.nodestore.db" ); offsetFileSystem.deleteFile( fileName ); offsetFileSystem.mkdirs( fileName.getParentFile() ); IdGenerator idGenerator = new JumpingIdGeneratorFactory( 10 ).get( IdType.NODE ); try ( JumpingFileChannel channel = (JumpingFileChannel) offsetFileSystem.open( fileName, OpenMode.READ_WRITE ) ) { for ( int i = 0; i < 16; i++ ) { writeSomethingLikeNodeRecord( channel, idGenerator.nextId(), i ); } } try ( JumpingFileChannel channel = (JumpingFileChannel) offsetFileSystem.open( fileName, OpenMode.READ_WRITE ) ) { idGenerator = new JumpingIdGeneratorFactory( 10 ).get( IdType.NODE ); for ( int i = 0; i < 16; i++ ) { assertEquals( i, readSomethingLikeNodeRecord( channel, idGenerator.nextId() ) ); } } } }
/** * It should be fine to set high id to {@link IdGeneratorImpl#INTEGER_MINUS_ONE}. * It will just be never returned from {@link IdGeneratorImpl#nextId()}. */ @Test public void highIdCouldBeSetToReservedId() { IdGeneratorImpl.createGenerator( fsr.get(), file, 0, false ); IdGenerator idGenerator = new IdGeneratorImpl( fsr.get(), file, 1, Long.MAX_VALUE, false, IdType.NODE, () -> 0L ); idGenerator.setHighId( IdGeneratorImpl.INTEGER_MINUS_ONE ); assertEquals( IdGeneratorImpl.INTEGER_MINUS_ONE + 1, idGenerator.nextId() ); }
try idGenerator.nextId(); fail( "nextId after close should throw exception" ); assertEquals( 0L, idGenerator.nextId() ); assertEquals( 1L, idGenerator.nextId() ); assertEquals( 2L, idGenerator.nextId() ); closeIdGenerator( idGenerator ); try idGenerator.nextId(); fail( "nextId after close should throw exception" );
@Test public void makeSureMagicMinusOneCannotBeReturnedEvenIfFreed() { IdGeneratorImpl.createGenerator( fs, idGeneratorFile(), 0, false ); IdGenerator idGenerator = new IdGeneratorImpl( fs, idGeneratorFile(), 1, new NodeRecordFormat().getMaxId(), false, IdType.NODE, () -> 0L ); long magicMinusOne = (long) Math.pow( 2, 32 ) - 1; idGenerator.setHighId( magicMinusOne ); assertEquals( magicMinusOne + 1, idGenerator.nextId() ); idGenerator.freeId( magicMinusOne - 1 ); idGenerator.freeId( magicMinusOne ); closeIdGenerator( idGenerator ); idGenerator = new IdGeneratorImpl( fs, idGeneratorFile(), 1, new NodeRecordFormat().getMaxId(), false, IdType.NODE, () -> 0L ); assertEquals( magicMinusOne - 1, idGenerator.nextId() ); assertEquals( magicMinusOne + 2, idGenerator.nextId() ); closeIdGenerator( idGenerator ); }
recordFormat.getMaxId(), false, IdType.NODE, () -> 0L ); idGenerator.setHighId( recordFormat.getMaxId() ); long id = idGenerator.nextId(); assertEquals( recordFormat.getMaxId(), id ); idGenerator.freeId( id ); try idGenerator.nextId(); fail( "Shouldn't be able to get next ID" ); idGenerator = new IdGeneratorImpl( fs, idGeneratorFile(), 1, recordFormat.getMaxId(), false, IdType.NODE, () -> 0L ); assertEquals( recordFormat.getMaxId() + 1, idGenerator.getHighId() ); id = idGenerator.nextId(); assertEquals( recordFormat.getMaxId(), id ); try idGenerator.nextId();
@Test public void shouldReportCorrectHighId() { // given try ( IdGenerator idGenerator = createIdGenerator( 2 ) ) { assertEquals( 0, idGenerator.getHighId() ); assertEquals( -1, idGenerator.getHighestPossibleIdInUse() ); // when idGenerator.nextId(); // then assertEquals( 1, idGenerator.getHighId() ); assertEquals( 0, idGenerator.getHighestPossibleIdInUse() ); } }
@Test public void correctDefragCountWhenHaveIdsInFile() { IdGeneratorImpl.createGenerator( fsr.get(), file, 100, false ); IdGenerator idGenerator = new IdGeneratorImpl( fsr.get(), file, 100, 100, true, IdType.NODE, () -> 100L ); idGenerator.freeId( 5 ); idGenerator.close(); IdGenerator reloadedIdGenerator = new IdGeneratorImpl( fsr.get(), file, 100, 100, true, IdType.NODE, () -> 100L ); assertEquals( 1, reloadedIdGenerator.getDefragCount() ); assertEquals( 5, reloadedIdGenerator.nextId() ); assertEquals( 0, reloadedIdGenerator.getDefragCount() ); }