use of io.pravega.segmentstore.contracts.AttributeUpdate in project pravega by pravega.
the class ContainerMetadataUpdateTransactionTests method testWithAttributes.
private void testWithAttributes(Function<Collection<AttributeUpdate>, Operation> createOperation) throws Exception {
final UUID attributeNoUpdate = UUID.randomUUID();
final UUID attributeAccumulate = UUID.randomUUID();
final UUID attributeReplace = UUID.randomUUID();
final UUID attributeReplaceIfGreater = UUID.randomUUID();
final UUID attributeReplaceIfEquals = UUID.randomUUID();
UpdateableContainerMetadata metadata = createMetadata();
val txn = createUpdateTransaction(metadata);
// Update #1.
Collection<AttributeUpdate> attributeUpdates = new ArrayList<>();
// Initial add, so it's ok.
attributeUpdates.add(new AttributeUpdate(attributeNoUpdate, AttributeUpdateType.None, 1));
attributeUpdates.add(new AttributeUpdate(attributeAccumulate, AttributeUpdateType.Accumulate, 1));
attributeUpdates.add(new AttributeUpdate(attributeReplace, AttributeUpdateType.Replace, 1));
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfGreater, AttributeUpdateType.ReplaceIfGreater, 1));
// Need to initialize to something.
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfEquals, AttributeUpdateType.Replace, 1));
val expectedValues = attributeUpdates.stream().collect(Collectors.toMap(AttributeUpdate::getAttributeId, AttributeUpdate::getValue));
Operation op = createOperation.apply(attributeUpdates);
txn.preProcessOperation(op);
txn.acceptOperation(op);
// Verify that the AttributeUpdates still have the same values (there was nothing there prior) and that the updater
// has internalized the attribute updates.
verifyAttributeUpdates("after acceptOperation (1)", txn, attributeUpdates, expectedValues);
// Update #2: update all attributes that can be updated.
attributeUpdates.clear();
// 1 + 1 = 2
attributeUpdates.add(new AttributeUpdate(attributeAccumulate, AttributeUpdateType.Accumulate, 1));
attributeUpdates.add(new AttributeUpdate(attributeReplace, AttributeUpdateType.Replace, 2));
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfGreater, AttributeUpdateType.ReplaceIfGreater, 2));
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfEquals, AttributeUpdateType.ReplaceIfEquals, 2, 1));
expectedValues.put(attributeAccumulate, 2L);
expectedValues.put(attributeReplace, 2L);
expectedValues.put(attributeReplaceIfGreater, 2L);
expectedValues.put(attributeReplaceIfEquals, 2L);
op = createOperation.apply(attributeUpdates);
txn.preProcessOperation(op);
txn.acceptOperation(op);
// This is still in the transaction, so we need to add it for comparison sake.
attributeUpdates.add(new AttributeUpdate(attributeNoUpdate, AttributeUpdateType.None, 1));
verifyAttributeUpdates("after acceptOperation (2)", txn, attributeUpdates, expectedValues);
// Update #3: after commit, verify that attributes are committed when they need to.
val previousAcceptedValues = new HashMap<UUID, Long>(expectedValues);
txn.commit(metadata);
attributeUpdates.clear();
// 2 + 1 = 3
attributeUpdates.add(new AttributeUpdate(attributeAccumulate, AttributeUpdateType.Accumulate, 1));
attributeUpdates.add(new AttributeUpdate(attributeReplace, AttributeUpdateType.Replace, 3));
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfGreater, AttributeUpdateType.ReplaceIfGreater, 3));
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfEquals, AttributeUpdateType.ReplaceIfEquals, 3, 2));
expectedValues.put(attributeAccumulate, 3L);
expectedValues.put(attributeReplace, 3L);
expectedValues.put(attributeReplaceIfGreater, 3L);
expectedValues.put(attributeReplaceIfEquals, 3L);
op = createOperation.apply(attributeUpdates);
txn.preProcessOperation(op);
txn.acceptOperation(op);
SegmentMetadataComparer.assertSameAttributes("Unexpected attributes in segment metadata after commit+acceptOperation, but prior to second commit.", previousAcceptedValues, metadata.getStreamSegmentMetadata(SEGMENT_ID));
verifyAttributeUpdates("after commit+acceptOperation", txn, attributeUpdates, expectedValues);
// Final step: commit Append #3, and verify final segment metadata.
txn.commit(metadata);
SegmentMetadataComparer.assertSameAttributes("Unexpected attributes in segment metadata after final commit.", expectedValues, metadata.getStreamSegmentMetadata(SEGMENT_ID));
}
use of io.pravega.segmentstore.contracts.AttributeUpdate in project pravega by pravega.
the class StreamSegmentAppendOperationTests method createAttributes.
static Collection<AttributeUpdate> createAttributes() {
val result = new ArrayList<AttributeUpdate>();
long currentValue = 0;
for (AttributeUpdateType ut : AttributeUpdateType.values()) {
result.add(new AttributeUpdate(UUID.randomUUID(), ut, ++currentValue, currentValue));
}
return result;
}
Aggregations