in src/main/java/org/apache/accumulo/testing/gcs/Generator.java [102:194]
private Queue<Mutator> createSimpleWork() {
long groupId = nextGroupId++;
int bucket = rand.nextInt(maxBuckets);
ArrayDeque<Mutator> work = new ArrayDeque<>();
List<Item> newItems = new ArrayList<>();
int numItems = rand.nextInt(10) + 1;
for (int i = 0; i < numItems; i++) {
newItems.add(new Item(clientId, groupId, nextItemId++));
}
// copy because lambda will execute later
List<Item> itemsToAdd = new ArrayList<>(newItems);
work.add(p -> {
for (Item item : itemsToAdd) {
p.save(item, ItemState.NEW);
}
p.flush();
});
List<ItemRef> referencedItems = new ArrayList<>();
while (!newItems.isEmpty() || !referencedItems.isEmpty()) {
if (newItems.isEmpty()) {
int size = referencedItems.size();
List<ItemRef> subList = referencedItems.subList(rand.nextInt(size), size);
List<ItemRef> refsToDelete = new ArrayList<>(subList);
subList.clear();
work.add(p -> {
for (ItemRef ir : refsToDelete) {
p.save(new Candidate(ir.clientId, ir.groupId, ir.itemId));
}
p.flush();
});
work.add(p -> {
p.delete(refsToDelete);
p.flush();
});
} else if (referencedItems.isEmpty()) {
int size = newItems.size();
List<Item> subList = newItems.subList(rand.nextInt(size), size);
List<Item> itemsToRef = new ArrayList<>(subList);
subList.clear();
List<ItemRef> refsToAdd = new ArrayList<>();
itemsToRef.forEach(item -> refsToAdd.add(new ItemRef(bucket, item)));
referencedItems.addAll(refsToAdd);
work.add(p -> {
p.save(refsToAdd);
p.flush();
});
work.add(p -> {
for (Item item : itemsToRef) {
p.save(item, ItemState.REFERENCED);
}
p.flush();
});
} else {
int size = referencedItems.size();
List<ItemRef> subList = referencedItems.subList(rand.nextInt(size), size);
List<ItemRef> refsToDelete = new ArrayList<>(subList);
subList.clear();
Item itemToRef = newItems.remove(newItems.size() - 1);
referencedItems.add(new ItemRef(bucket, itemToRef));
work.add(p -> {
for (ItemRef ir : refsToDelete) {
p.save(new Candidate(ir.clientId, ir.groupId, ir.itemId));
}
p.flush();
});
work.add(p -> {
p.replace(refsToDelete, new ItemRef(bucket, itemToRef));
p.flush();
});
work.add(p -> {
p.save(itemToRef, ItemState.REFERENCED);
p.flush();
});
}
}
return work;
}