use of io.pravega.segmentstore.server.UpdateableContainerMetadata in project pravega by pravega.
the class OperationMetadataUpdaterTests method clone.
private UpdateableContainerMetadata clone(ContainerMetadata base) {
val metadata = createBlankMetadata();
// First clone stand-alone (parent) Segments (since there may be Transactions mapped to them).
base.getAllStreamSegmentIds().stream().map(base::getStreamSegmentMetadata).filter(sm -> !sm.isTransaction()).forEach(bsm -> metadata.mapStreamSegmentId(bsm.getName(), bsm.getId()).copyFrom(bsm));
// Then clone transactions.
base.getAllStreamSegmentIds().stream().map(base::getStreamSegmentMetadata).filter(SegmentMetadata::isTransaction).forEach(bsm -> metadata.mapStreamSegmentId(bsm.getName(), bsm.getId(), bsm.getParentId()).copyFrom(bsm));
return metadata;
}
use of io.pravega.segmentstore.server.UpdateableContainerMetadata in project pravega by pravega.
the class ContainerMetadataUpdateTransactionTests method testWithBadAttributes.
private void testWithBadAttributes(Function<Collection<AttributeUpdate>, Operation> createOperation) throws Exception {
final UUID attributeNoUpdate = UUID.randomUUID();
final UUID attributeReplaceIfGreater = UUID.randomUUID();
final UUID attributeReplaceIfEquals = UUID.randomUUID();
UpdateableContainerMetadata metadata = createMetadata();
val txn = createUpdateTransaction(metadata);
// Append #1.
Collection<AttributeUpdate> attributeUpdates = new ArrayList<>();
// Initial add, so it's ok.
attributeUpdates.add(new AttributeUpdate(attributeNoUpdate, AttributeUpdateType.None, 2));
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfGreater, AttributeUpdateType.ReplaceIfGreater, 2));
// Initial Add.
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfEquals, AttributeUpdateType.Replace, 2));
val expectedValues = attributeUpdates.stream().collect(Collectors.toMap(AttributeUpdate::getAttributeId, AttributeUpdate::getValue));
Operation op = createOperation.apply(attributeUpdates);
txn.preProcessOperation(op);
txn.acceptOperation(op);
// Append #2: Try to update attribute that cannot be updated.
attributeUpdates.clear();
attributeUpdates.add(new AttributeUpdate(attributeNoUpdate, AttributeUpdateType.None, 3));
AssertExtensions.assertThrows("preProcessOperation accepted an operation that was trying to update an unmodifiable attribute.", () -> txn.preProcessOperation(createOperation.apply(attributeUpdates)), ex -> ex instanceof BadAttributeUpdateException);
// Append #3: Try to update attribute with bad value for ReplaceIfGreater attribute.
attributeUpdates.clear();
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfGreater, AttributeUpdateType.ReplaceIfGreater, 1));
AssertExtensions.assertThrows("preProcessOperation accepted an operation that was trying to update an attribute with the wrong value for ReplaceIfGreater.", () -> txn.preProcessOperation(createOperation.apply(attributeUpdates)), ex -> ex instanceof BadAttributeUpdateException);
// Append #4: Try to update attribute with bad value for ReplaceIfEquals attribute.
attributeUpdates.clear();
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfEquals, AttributeUpdateType.ReplaceIfEquals, 3, 3));
AssertExtensions.assertThrows("preProcessOperation accepted an operation that was trying to update an attribute with the wrong comparison value for ReplaceIfGreater.", () -> txn.preProcessOperation(createOperation.apply(attributeUpdates)), ex -> ex instanceof BadAttributeUpdateException);
// Reset the attribute update list to its original state so we can do the final verification.
attributeUpdates.clear();
attributeUpdates.add(new AttributeUpdate(attributeNoUpdate, AttributeUpdateType.None, 2));
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfGreater, AttributeUpdateType.ReplaceIfGreater, 2));
attributeUpdates.add(new AttributeUpdate(attributeReplaceIfEquals, AttributeUpdateType.ReplaceIfGreater, 2, 2));
verifyAttributeUpdates("after rejected operations", txn, attributeUpdates, expectedValues);
txn.commit(metadata);
SegmentMetadataComparer.assertSameAttributes("Unexpected attributes in segment metadata after commit.", expectedValues, metadata.getStreamSegmentMetadata(SEGMENT_ID));
}
use of io.pravega.segmentstore.server.UpdateableContainerMetadata in project pravega by pravega.
the class ContainerMetadataUpdateTransactionTests method testProcessMetadataCheckpointIgnored.
/**
* Tests the processMetadataOperation method with MetadataCheckpoint operations, when such checkpoints are skipped over
* because they are after other operations.
*/
@Test
public void testProcessMetadataCheckpointIgnored() throws Exception {
long newSegmentId = 897658;
String newSegmentName = "NewSegmentId";
AtomicLong seqNo = new AtomicLong();
// Create a non-empty metadata.
UpdateableContainerMetadata metadata = createMetadata();
val txn = createUpdateTransaction(metadata);
MetadataCheckpointOperation checkpointedMetadata = createMetadataCheckpoint();
processOperation(checkpointedMetadata, txn, seqNo::incrementAndGet);
// Create a blank metadata, and add an operation to the updater (which would result in mapping a new StreamSegment).
metadata = createBlankMetadata();
metadata.enterRecoveryMode();
val txn2 = createUpdateTransaction(metadata);
StreamSegmentMapOperation mapOp = createMap(newSegmentName);
mapOp.setStreamSegmentId(newSegmentId);
processOperation(mapOp, txn2, seqNo::incrementAndGet);
// Now try to process the checkpoint
processOperation(checkpointedMetadata, txn2, seqNo::incrementAndGet);
txn2.commit(metadata);
// Verify the checkpointed metadata hasn't been applied
Assert.assertNull("Newly added StreamSegment Id was not removed after applying checkpoint.", metadata.getStreamSegmentMetadata(mapOp.getStreamSegmentId()));
Assert.assertNotNull("Checkpoint seems to have not been applied.", metadata.getStreamSegmentMetadata(SEGMENT_ID));
}
use of io.pravega.segmentstore.server.UpdateableContainerMetadata in project pravega by pravega.
the class ContainerMetadataUpdateTransactionTests method testSegmentMapMax.
/**
* Tests the ability to reject new StreamSegment/Transaction map operations that would exceed the max allowed counts.
*/
@Test
public void testSegmentMapMax() throws Exception {
UpdateableContainerMetadata metadata = new MetadataBuilder(CONTAINER_ID).withMaxActiveSegmentCount(3).build();
metadata.mapStreamSegmentId("a", SEGMENT_ID);
metadata.mapStreamSegmentId("a_txn1", 123457, SEGMENT_ID);
// Non-recovery mode.
val txn1 = createUpdateTransaction(metadata);
// Map one segment, which should fill up the quota.
StreamSegmentMapOperation acceptedMap = createMap();
txn1.preProcessOperation(acceptedMap);
txn1.acceptOperation(acceptedMap);
// Verify non-recovery mode.
AssertExtensions.assertThrows("Unexpected behavior from preProcessOperation when attempting to map a StreamSegment that would exceed the active segment quota.", () -> txn1.preProcessOperation(createMap("foo")), ex -> ex instanceof TooManyActiveSegmentsException);
AssertExtensions.assertThrows("Unexpected behavior from preProcessOperation when attempting to map a StreamSegment that would exceed the active segment quota.", () -> txn1.preProcessOperation(createTransactionMap(SEGMENT_ID, "foo")), ex -> ex instanceof TooManyActiveSegmentsException);
// Verify recovery mode.
metadata.enterRecoveryMode();
val txn2 = createUpdateTransaction(metadata);
// updater.setOperationSequenceNumber(10000);
StreamSegmentMapOperation secondMap = createMap("c");
secondMap.setStreamSegmentId(1234);
txn2.preProcessOperation(secondMap);
txn2.acceptOperation(secondMap);
StreamSegmentMapOperation secondTxnMap = createTransactionMap(SEGMENT_ID, "a_txn2");
secondTxnMap.setStreamSegmentId(1235);
txn2.preProcessOperation(secondTxnMap);
txn2.acceptOperation(secondTxnMap);
txn2.commit(metadata);
metadata.exitRecoveryMode();
Assert.assertNotNull("Updater did not create metadata for new segment in recovery mode even if quota is exceeded.", metadata.getStreamSegmentMetadata(secondMap.getStreamSegmentId()));
Assert.assertNotNull("Updater did not create metadata for new transaction in recovery mode even if quota is exceeded.", metadata.getStreamSegmentMetadata(secondTxnMap.getStreamSegmentId()));
}
use of io.pravega.segmentstore.server.UpdateableContainerMetadata 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));
}
Aggregations