use of org.janusgraph.graphdb.database.idassigner.IDBlockSizer in project janusgraph by JanusGraph.
the class IDAuthorityTest method testSimpleIDAcquisition.
@Test
public void testSimpleIDAcquisition() throws BackendException {
final IDBlockSizer blockSizer = new InnerIDBlockSizer();
idAuthorities[0].setIDBlockSizer(blockSizer);
int numTrials = 100;
LongSet ids = new LongHashSet((int) blockSize * numTrials);
long previous = 0;
for (int i = 0; i < numTrials; i++) {
IDBlock block = idAuthorities[0].getIDBlock(0, 0, GET_ID_BLOCK_TIMEOUT);
checkBlock(block, ids);
if (hasEmptyUid) {
if (previous != 0)
assertEquals(previous + 1, block.getId(0));
previous = block.getId(block.numIds() - 1);
}
}
}
use of org.janusgraph.graphdb.database.idassigner.IDBlockSizer in project janusgraph by JanusGraph.
the class IDPoolTest method testAllocationTimeoutAndRecovery.
@Test
public void testAllocationTimeoutAndRecovery() throws BackendException {
IMocksControl ctrl = EasyMock.createStrictControl();
final int partition = 42;
final int idNamespace = 777;
final Duration timeout = Duration.ofSeconds(1L);
final IDAuthority mockAuthority = ctrl.createMock(IDAuthority.class);
// Sleep for two seconds, then throw a BackendException
// this whole delegate could be deleted if we abstracted StandardIDPool's internal executor and stopwatches
expect(mockAuthority.getIDBlock(partition, idNamespace, timeout)).andDelegateTo(new IDAuthority() {
@Override
public IDBlock getIDBlock(int partition, int idNamespace, Duration timeout) throws BackendException {
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
fail();
}
throw new TemporaryBackendException("slow backend");
}
@Override
public List<KeyRange> getLocalIDPartition() {
throw new IllegalArgumentException();
}
@Override
public void setIDBlockSizer(IDBlockSizer sizer) {
throw new IllegalArgumentException();
}
@Override
public void close() {
throw new IllegalArgumentException();
}
@Override
public String getUniqueID() {
throw new IllegalArgumentException();
}
@Override
public boolean supportsInterruption() {
return true;
}
});
expect(mockAuthority.getIDBlock(partition, idNamespace, timeout)).andReturn(new IDBlock() {
@Override
public long numIds() {
return 2;
}
@Override
public long getId(long index) {
return 200;
}
});
expect(mockAuthority.supportsInterruption()).andStubReturn(true);
ctrl.replay();
StandardIDPool pool = new StandardIDPool(mockAuthority, partition, idNamespace, Integer.MAX_VALUE, timeout, 0.1);
try {
pool.nextID();
fail();
} catch (JanusGraphException ignored) {
}
long nextID = pool.nextID();
assertEquals(200, nextID);
ctrl.verify();
}
use of org.janusgraph.graphdb.database.idassigner.IDBlockSizer in project janusgraph by JanusGraph.
the class IDAuthorityTest method testIDExhaustion.
@Test
public void testIDExhaustion() throws BackendException {
final int chunks = 30;
final IDBlockSizer blockSizer = new IDBlockSizer() {
@Override
public long getBlockSize(int idNamespace) {
return ((1L << (idUpperBoundBitWidth - uidBitWidth)) - 1) / chunks;
}
@Override
public long getIdUpperBound(int idNamespace) {
return idUpperBound;
}
};
idAuthorities[0].setIDBlockSizer(blockSizer);
if (hasFixedUid) {
for (int i = 0; i < chunks; i++) {
idAuthorities[0].getIDBlock(0, 0, GET_ID_BLOCK_TIMEOUT);
}
try {
idAuthorities[0].getIDBlock(0, 0, GET_ID_BLOCK_TIMEOUT);
Assert.fail();
} catch (IDPoolExhaustedException ignored) {
}
} else {
for (int i = 0; i < (chunks * Math.max(1, (1 << uidBitWidth) / 10)); i++) {
idAuthorities[0].getIDBlock(0, 0, GET_ID_BLOCK_TIMEOUT);
}
try {
for (int i = 0; i < (chunks * Math.max(1, (1 << uidBitWidth) * 9 / 10)); i++) {
idAuthorities[0].getIDBlock(0, 0, GET_ID_BLOCK_TIMEOUT);
}
Assert.fail();
} catch (IDPoolExhaustedException ignored) {
}
}
}
use of org.janusgraph.graphdb.database.idassigner.IDBlockSizer in project janusgraph by JanusGraph.
the class IDAuthorityTest method testMultiIDAcquisition.
@Test
public void testMultiIDAcquisition() throws Throwable {
final int numPartitions = MAX_NUM_PARTITIONS;
final int numAcquisitionsPerThreadPartition = 100;
final IDBlockSizer blockSizer = new InnerIDBlockSizer();
for (int i = 0; i < CONCURRENCY; i++) idAuthorities[i].setIDBlockSizer(blockSizer);
final List<ConcurrentLinkedQueue<IDBlock>> ids = new ArrayList<>(numPartitions);
for (int i = 0; i < numPartitions; i++) {
ids.add(new ConcurrentLinkedQueue<>());
}
final int maxIterations = numAcquisitionsPerThreadPartition * numPartitions * 2;
final Collection<Future<?>> futures = new ArrayList<>(CONCURRENCY);
ExecutorService es = Executors.newFixedThreadPool(CONCURRENCY);
final Set<String> uniqueIds = new HashSet<>(CONCURRENCY);
for (int i = 0; i < CONCURRENCY; i++) {
final IDAuthority idAuthority = idAuthorities[i];
final IDStressor stressRunnable = new IDStressor(numAcquisitionsPerThreadPartition, numPartitions, maxIterations, idAuthority, ids);
uniqueIds.add(idAuthority.getUniqueID());
futures.add(es.submit(stressRunnable));
}
// If this fails, it's likely to be a bug in the test rather than the
// IDAuthority (the latter is technically possible, just less likely)
assertEquals(CONCURRENCY, uniqueIds.size());
for (Future<?> f : futures) {
try {
f.get();
} catch (ExecutionException e) {
throw e.getCause();
}
}
for (int i = 0; i < numPartitions; i++) {
ConcurrentLinkedQueue<IDBlock> list = ids.get(i);
assertEquals(numAcquisitionsPerThreadPartition * CONCURRENCY, list.size());
LongSet idSet = new LongHashSet((int) blockSize * list.size());
for (IDBlock block : list) checkBlock(block, idSet);
}
es.shutdownNow();
}
Aggregations