use of com.apple.foundationdb.record.provider.foundationdb.keyspace.KeySpaceDirectory.KeyType.STRING in project fdb-record-layer by FoundationDB.
the class ExtendedDirectoryLayerTest method testDefaultCanAllocateIndependentKeysInParallel.
@Test
public void testDefaultCanAllocateIndependentKeysInParallel() {
final ScopedDirectoryLayer directoryLayer = ScopedDirectoryLayer.global(database);
Map<String, Long> mappingsFromOld = new ConcurrentHashMap<>();
Map<String, Long> mappingsFromNew = new ConcurrentHashMap<>();
List<CompletableFuture<?>> operations = new ArrayList<>();
for (int i = 0; i < 100; i++) {
String oldDirLayerKey = i + "-old-dl-key";
String newDirLayerKey = i + "-new-dl-key";
operations.add(directoryLayer.resolve(oldDirLayerKey).thenApply(value -> mappingsFromOld.put(oldDirLayerKey, value)));
operations.add(globalScope.resolve(newDirLayerKey).thenApply(value -> mappingsFromNew.put(newDirLayerKey, value)));
}
CompletableFuture.allOf(operations.toArray(new CompletableFuture<?>[0])).join();
// Implicitly checks that there are no duplicate keys or values in the two maps
BiMap<String, Long> completeMapping = ImmutableBiMap.<String, Long>builder().putAll(mappingsFromOld).putAll(mappingsFromNew).build();
for (Map.Entry<String, Long> entry : completeMapping.entrySet()) {
try (FDBRecordContext context = database.openContext()) {
assertThat("the FDB directory layer sees the mapping", directoryLayer.mustResolve(context, entry.getKey()).join(), is(entry.getValue()));
assertThat("the ScopedDirectoryLayer sees the mapping", globalScope.mustResolve(context, entry.getKey()).join(), is(entry.getValue()));
}
}
}
use of com.apple.foundationdb.record.provider.foundationdb.keyspace.KeySpaceDirectory.KeyType.STRING in project fdb-record-layer by FoundationDB.
the class ExtendedDirectoryLayerTest method testParallelAllocation.
private static void testParallelAllocation(boolean checkDirectoryLayer, FDBDatabase database, Function<String, CompletableFuture<Long>> resolveCall1, Function<String, CompletableFuture<Long>> resolveCall2, LocatableResolver resolver1, LocatableResolver resolver2) {
Map<String, Long> mappings1 = new ConcurrentHashMap<>();
Map<String, Long> mappings2 = new ConcurrentHashMap<>();
List<CompletableFuture<?>> operations = new ArrayList<>();
for (int i = 0; i < 100; i++) {
String key = "key-" + i;
operations.add(resolveCall1.apply(key).thenAccept(value -> mappings1.put(key, value)));
operations.add(resolveCall2.apply(key).thenAccept(value -> mappings2.put(key, value)));
}
CompletableFuture.allOf(operations.toArray(new CompletableFuture<?>[0])).join();
for (Map.Entry<String, Long> entry : mappings1.entrySet()) {
assertThat(String.format("the mappings for %s are identical", entry.getKey()), mappings2.get(entry.getKey()), is(entry.getValue()));
try (FDBRecordContext context = database.openContext()) {
if (checkDirectoryLayer) {
// only applies when the scope is global
final DirectoryLayer directoryLayer = DirectoryLayer.getDefault();
Long value = directoryLayer.open(context.ensureActive(), Collections.singletonList(entry.getKey())).thenApply(subspace -> Tuple.fromBytes(subspace.pack()).getLong(0)).join();
assertThat("the FDB directory layer sees the mapping", value, is(entry.getValue()));
}
assertThat(resolver1.getClass().getName() + " sees the mapping", resolver1.mustResolve(context, entry.getKey()).join(), is(entry.getValue()));
assertThat(resolver2.getClass().getName() + " sees the mapping", resolver2.mustResolve(context, entry.getKey()).join(), is(entry.getValue()));
checkMappingInReverseCache(resolver1, entry.getKey(), entry.getValue());
checkMappingInReverseCache(resolver2, entry.getKey(), entry.getValue());
}
}
}
Aggregations