public long getFreeIdCount() { return freeIdKeeper.getCount(); }
@Override public String toString() { return "IdContainer{" + "file=" + file + ", fs=" + fs + ", fileChannel=" + fileChannel + ", defragCount=" + freeIdKeeper.getCount() + ", grabSize=" + grabSize + ", aggressiveReuse=" + aggressiveReuse + ", closed=" + closed + '}'; }
@Test public void freeingAnIdShouldReturnThatIdAndUpdateTheCountWhenAggressiveModeIsSet() throws Exception { // Given FreeIdKeeper keeper = getFreeIdKeeperAggressive(); // when keeper.freeId( 13 ); // then assertEquals( 1, keeper.getCount() ); // when long result = keeper.getId(); // then assertEquals( 13, result ); assertEquals( 0, keeper.getCount() ); }
@Test public void shouldReadBackManyPersistedIdBatchesWhenAggressiveModeIsSet() throws Exception { // given StoreChannel channel = getStoreChannel(); int batchSize = 10; FreeIdKeeper keeper = getFreeIdKeeperAggressive( channel, batchSize ); Set<Long> freeIds = new HashSet<>(); // when // we store enough ids to cause overflow to file, in two batches for ( long i = 0; i < batchSize * 2; i++ ) { keeper.freeId( i ); freeIds.add( i ); } // then // they should be returned assertEquals( freeIds.size(), keeper.getCount() ); for ( int i = batchSize * 2 - 1; i >= 0; i-- ) { assertTrue( freeIds.remove( keeper.getId() ) ); } }
@Test public void newlyConstructedInstanceShouldReportProperDefaultValues() throws Exception { // Given FreeIdKeeper keeper = getFreeIdKeeperAggressive(); // then assertEquals( NO_RESULT, keeper.getId() ); assertEquals( 0, keeper.getCount() ); }
@Test public void allocateEmptyBatchWhenNoIdsAreAvailable() throws IOException { FreeIdKeeper freeIdKeeper = getFreeIdKeeperAggressive(); long[] ids = freeIdKeeper.getIds( 1024 ); assertSame( PrimitiveLongCollections.EMPTY_LONG_ARRAY, ids ); assertEquals( 0, freeIdKeeper.getCount() ); }
@Test public void allocateBatchWhenHaveLessIdsInMemoryButHaveOnDiskMore() throws IOException { FreeIdKeeper freeIdKeeper = getFreeIdKeeperAggressive( 4 ); for ( long id = 1L; id < 11L; id++ ) { freeIdKeeper.freeId( id ); } long[] ids = freeIdKeeper.getIds( 7 ); assertArrayEquals( new long[]{9L, 10L, 5L, 6L, 7L, 8L, 1L}, ids ); assertEquals( 3, freeIdKeeper.getCount() ); }
@Test public void allocateBatchWhenHaveMoreIdsInMemory() throws IOException { FreeIdKeeper freeIdKeeper = getFreeIdKeeperAggressive(); for ( long id = 1L; id < 7L; id++ ) { freeIdKeeper.freeId( id ); } long[] ids = freeIdKeeper.getIds( 5 ); assertArrayEquals( new long[]{1L, 2L, 3L, 4L, 5L}, ids); assertEquals( 1, freeIdKeeper.getCount() ); }
@Test public void allocateBatchWhenHaveLessIdsInMemory() throws IOException { FreeIdKeeper freeIdKeeper = getFreeIdKeeperAggressive(); for ( long id = 1L; id < 4L; id++ ) { freeIdKeeper.freeId( id ); } long[] ids = freeIdKeeper.getIds( 5 ); assertArrayEquals( new long[]{1L, 2L, 3L}, ids ); assertEquals( 0, freeIdKeeper.getCount() ); }
@Test public void allocateBatchWhenHaveLessIdsInMemoryAndOnDisk() throws IOException { FreeIdKeeper freeIdKeeper = getFreeIdKeeperAggressive( 4 ); for ( long id = 1L; id < 10L; id++ ) { freeIdKeeper.freeId( id ); } long[] ids = freeIdKeeper.getIds( 15 ); assertArrayEquals( new long[]{9L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L}, ids ); assertEquals( 0, freeIdKeeper.getCount() ); }
@Test public void persistedIdsShouldStillBeCounted() throws Exception { // given StoreChannel channel = getStoreChannel(); int batchSize = 10; FreeIdKeeper keeper = new FreeIdKeeper( channel, batchSize, true ); // when // we store enough ids to cause overflow to file for ( int i = 0; i < batchSize; i++ ) { keeper.freeId( i ); } // and then some more int extraIds = 3; for ( int i = batchSize; i < batchSize + extraIds; i++ ) { keeper.freeId( i ); } // then // the count should be returned correctly assertEquals( batchSize + extraIds, keeper.getCount() ); }
@Override public String toString() { return "IdContainer{" + "file=" + file + ", fs=" + fs + ", fileChannel=" + fileChannel + ", defragCount=" + freeIdKeeper.getCount() + ", grabSize=" + grabSize + ", aggressiveReuse=" + aggressiveReuse + ", closed=" + closed + '}'; }
public long getFreeIdCount() { return freeIdKeeper.getCount(); }