@Override public void setHighId( long id ) { delegate.setHighId( id ); }
/** * Sets the high id, i.e. highest id in use + 1 (use this when rebuilding id generator). * * @param highId The high id to set. */ public void setHighId( long highId ) { // This method might get called during recovery, where we don't have a reliable id generator yet, // so ignore these calls and let rebuildIdGenerators() figure out the high id after recovery. IdGenerator generator = this.idGenerator; if ( generator != null ) { //noinspection SynchronizationOnLocalVariableOrMethodParameter synchronized ( generator ) { if ( highId > generator.getHighId() ) { generator.setHighId( highId ); } } } }
private void setHighId( IdType type, long highId ) { ((GraphDatabaseAPI)db).getDependencyResolver().resolveDependency( IdGeneratorFactory.class ).get( type ).setHighId( highId ); } }
@Test public void shouldNotAcceptMinusOne() { // GIVEN IdGeneratorImpl.createGenerator( fsr.get(), file, 0, false ); IdGenerator idGenerator = new IdGeneratorImpl( fsr.get(), file, 100, 100, false, IdType.NODE, () -> 0L ); expectedException.expect( NegativeIdException.class ); // WHEN idGenerator.setHighId( -1 ); }
@Test public void throwsWhenGivenHighIdIsTooHigh() { long maxId = 10; IdGeneratorImpl.createGenerator( fsr.get(), file, 0, false ); IdGenerator idGenerator = new IdGeneratorImpl( fsr.get(), file, 1, maxId, false, IdType.RELATIONSHIP_TYPE_TOKEN, () -> 0L ); expectedException.expect( IdCapacityExceededException.class ); expectedException.expectMessage( "Maximum id limit for RELATIONSHIP_TYPE_TOKEN has been reached. Generated id 11 is out of permitted range [0, 10]." ); idGenerator.setHighId( maxId + 1 ); }
/** * 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() ); }
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 ); }
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 ); }
@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 ); }
IdGenerator idGenerator = new IdGeneratorImpl( fs, idGeneratorFile(), 1, recordFormat.getMaxId(), false, IdType.NODE, () -> 0L ); idGenerator.setHighId( recordFormat.getMaxId() ); long id = idGenerator.nextId(); assertEquals( recordFormat.getMaxId(), id );
@Override public void setHighId( long id ) { delegate.setHighId( id ); }
@Override public void setHighId( long id ) { delegate.setHighId( id ); }
/** * Sets the high id, i.e. highest id in use + 1 (use this when rebuilding id generator). * * @param highId The high id to set. */ public void setHighId( long highId ) { // This method might get called during recovery, where we don't have a reliable id generator yet, // so ignore these calls and let rebuildIdGenerators() figure out the high id after recovery. IdGenerator generator = this.idGenerator; if ( generator != null ) { //noinspection SynchronizationOnLocalVariableOrMethodParameter synchronized ( generator ) { if ( highId > generator.getHighId() ) { generator.setHighId( highId ); } } } }