public void testCapacityGrowth() throws Exception {
StatsLog.logger.info(">>> testCapacityGrowth");
// Create DynamicDataStore 1
File storeDir = getHomeDirectory();
DynamicDataStore dynStore1 = getDynamicDataStore(storeDir, 0, 32);
StatsLog.logger.info("create dynStore1");
StatsLog.logger.info("level=" + dynStore1.getLevel() +
" split=" + dynStore1.getSplit() +
" capacity=" + dynStore1.capacity() +
" loadFactor=" + dynStore1.getLoadFactor());
int keyStart;
int keyCount;
int unitCapacity = dynStore1.getUnitCapacity();
keyStart = 0;
keyCount = unitCapacity;
write(keyStart, keyCount, dynStore1);
StatsLog.logger.info("update keyStart=" + keyStart + " keyCount=" + keyCount);
StatsLog.logger.info("level=" + dynStore1.getLevel() +
" split=" + dynStore1.getSplit() +
" capacity=" + dynStore1.capacity() +
" loadFactor=" + dynStore1.getLoadFactor());
if ((unitCapacity * 2) != dynStore1.capacity())
throw new RuntimeException("capacity expected: " + (unitCapacity * 2));
keyStart += keyCount;
write(keyStart, keyCount, dynStore1);
StatsLog.logger.info("update keyStart=" + keyStart + " keyCount=" + keyCount);
StatsLog.logger.info("level=" + dynStore1.getLevel() +
" split=" + dynStore1.getSplit() +
" capacity=" + dynStore1.capacity() +
" loadFactor=" + dynStore1.getLoadFactor());
if ((unitCapacity * 3) != dynStore1.capacity())
throw new RuntimeException("capacity expected: " + (unitCapacity * 3));
keyStart += keyCount;
write(keyStart, keyCount, dynStore1);
StatsLog.logger.info("update keyStart=" + keyStart + " keyCount=" + keyCount);
StatsLog.logger.info("level=" + dynStore1.getLevel() +
" split=" + dynStore1.getSplit() +
" capacity=" + dynStore1.capacity() +
" loadFactor=" + dynStore1.getLoadFactor());
if ((unitCapacity * 4) != dynStore1.capacity())
throw new RuntimeException("capacity expected: " + (unitCapacity * 4));
keyStart += keyCount;
write(keyStart, keyCount, dynStore1);
StatsLog.logger.info("update keyStart=" + keyStart + " keyCount=" + keyCount);
StatsLog.logger.info("level=" + dynStore1.getLevel() +
" split=" + dynStore1.getSplit() +
" capacity=" + dynStore1.capacity() +
" loadFactor=" + dynStore1.getLoadFactor());
if ((unitCapacity * 5) != dynStore1.capacity())
throw new RuntimeException("capacity expected: " + (unitCapacity * 5));
keyStart += keyCount;
write(keyStart, keyCount, dynStore1);
StatsLog.logger.info("update keyStart=" + keyStart + " keyCount=" + keyCount);
StatsLog.logger.info("level=" + dynStore1.getLevel() +
" split=" + dynStore1.getSplit() +
" capacity=" + dynStore1.capacity() +
" loadFactor=" + dynStore1.getLoadFactor());
if ((unitCapacity * 6) != dynStore1.capacity())
throw new RuntimeException("capacity expected: " + (unitCapacity * 6));
dynStore1.rehash();
StatsLog.logger.info("rehash()");
StatsLog.logger.info("level=" + dynStore1.getLevel() +
" split=" + dynStore1.getSplit() +
" capacity=" + dynStore1.capacity() +
" loadFactor=" + dynStore1.getLoadFactor());
if(dynStore1.getLevel() != 3)
throw new RuntimeException("level expected: " + 3);
if(dynStore1.getSplit() != 0)
throw new RuntimeException("split expected: " + 0);
if(dynStore1.getLevelCapacity() != dynStore1.capacity())
throw new RuntimeException("capacity expected: " + dynStore1.getLevelCapacity());
keyStart = 0;
keyCount = unitCapacity * 16;
write(keyStart, keyCount, dynStore1);
StatsLog.logger.info("update keyStart=" + keyStart + " keyCount=" + keyCount);
StatsLog.logger.info("level=" + dynStore1.getLevel() +
" split=" + dynStore1.getSplit() +
" capacity=" + dynStore1.capacity() +
" loadFactor=" + dynStore1.getLoadFactor());
if ((unitCapacity * 18) != dynStore1.capacity())
throw new RuntimeException("capacity expected: " + (unitCapacity * 18));
keyStart = 0;
keyCount = unitCapacity * 8;
write(keyStart, keyCount, dynStore1);
StatsLog.logger.info("update keyStart=" + keyStart + " keyCount=" + keyCount);
StatsLog.logger.info("level=" + dynStore1.getLevel() +
" split=" + dynStore1.getSplit() +
" capacity=" + dynStore1.capacity() +
" loadFactor=" + dynStore1.getLoadFactor());
if ((unitCapacity * 26) != dynStore1.capacity())
throw new RuntimeException("capacity expected: " + (unitCapacity * 26));
dynStore1.rehash();
StatsLog.logger.info("rehash()");
StatsLog.logger.info("level=" + dynStore1.getLevel() +
" split=" + dynStore1.getSplit() +
" capacity=" + dynStore1.capacity() +
" loadFactor=" + dynStore1.getLoadFactor());
if(dynStore1.getLevel() != 5)
throw new RuntimeException("level expected: " + 5);
if(dynStore1.getSplit() != 0)
throw new RuntimeException("split expected: " + 0);
if ((dynStore1.getLevelCapacity()) != dynStore1.capacity())
throw new RuntimeException("capacity expected: " + dynStore1.getLevelCapacity());
// Bring loadFactor up to 75%
keyStart = unitCapacity << 5;
keyCount = (int)(dynStore1.capacity() * 0.75);
write(keyStart, keyCount, dynStore1);
StatsLog.logger.info("update keyStart=" + keyStart + " keyCount=" + keyCount);
StatsLog.logger.info("level=" + dynStore1.getLevel() +
" split=" + dynStore1.getSplit() +
" capacity=" + dynStore1.capacity() +
" loadFactor=" + dynStore1.getLoadFactor());
if ((unitCapacity << 5) != dynStore1.capacity())
throw new RuntimeException("capacity expected: " + (unitCapacity << 5));
dynStore1.sync();
int capacity1 = dynStore1.capacity();
// Create DynamicDataStore 2
DynamicDataStore dynStore2 = getDynamicDataStore(storeDir, 0, 32);
StatsLog.logger.info("create dynStore2");
StatsLog.logger.info("level=" + dynStore2.getLevel() +
" split=" + dynStore2.getSplit() +
" capacity=" + dynStore2.capacity() +
" loadFactor=" + dynStore2.getLoadFactor());
int capacity2 = dynStore2.capacity();
// Check capacity
if (capacity1 != capacity2)
throw new RuntimeException("DynamicDataStore 1 and 2 have different capacities: " + capacity1 + ":" + capacity2);