use of io.pravega.segmentstore.contracts.AttributeUpdate in project pravega by pravega.
the class MetadataStoreTestBase method testCreateTransientSegment.
/**
* Tests the ability of the MetadataStore to create a new Transient Segment.
*/
@Test
public void testCreateTransientSegment() {
final int transientSegmentCount = 50;
@Cleanup TestContext context = createTestContext();
// Create some Segments and verify they are properly created and registered.
for (int i = 0; i < transientSegmentCount; i++) {
String transientSegmentName = getTransientName(i);
Collection<AttributeUpdate> segmentAttributes = Set.of(new AttributeUpdate(Attributes.EVENT_COUNT, AttributeUpdateType.None, 0));
context.getMetadataStore().createSegment(transientSegmentName, SegmentType.TRANSIENT_SEGMENT, segmentAttributes, TIMEOUT);
assertTransientSegmentCreated(transientSegmentName, context);
}
}
use of io.pravega.segmentstore.contracts.AttributeUpdate in project pravega by pravega.
the class MetadataStoreTestBase method testCreateSegmentValidateAttributeIdLength.
/**
* Verifies that {@link MetadataStore#createSegment} validates the {@link Attributes#ATTRIBUTE_ID_LENGTH} value, if
* passed as an argument.
*/
@Test
public void testCreateSegmentValidateAttributeIdLength() {
@Cleanup TestContext context = createTestContext();
// Try to create a segment with invalid values.
val s1 = getName(0);
AssertExtensions.assertSuppliedFutureThrows("ATTRIBUTE_ID_LENGTH was accepted as negative.", () -> context.getMetadataStore().createSegment(s1, SegmentType.STREAM_SEGMENT, AttributeUpdateCollection.from(new AttributeUpdate(Attributes.ATTRIBUTE_ID_LENGTH, AttributeUpdateType.None, -1L)), TIMEOUT), ex -> ex instanceof IllegalArgumentException);
AssertExtensions.assertSuppliedFutureThrows("ATTRIBUTE_ID_LENGTH was accepted with too high value.", () -> context.getMetadataStore().createSegment(s1, SegmentType.STREAM_SEGMENT, AttributeUpdateCollection.from(new AttributeUpdate(Attributes.ATTRIBUTE_ID_LENGTH, AttributeUpdateType.None, AttributeId.MAX_LENGTH + 1)), TIMEOUT), ex -> ex instanceof IllegalArgumentException);
// Create a segment with valid values.
val validAttributes = AttributeUpdateCollection.from(new AttributeUpdate(Attributes.ATTRIBUTE_ID_LENGTH, AttributeUpdateType.None, AttributeId.MAX_LENGTH / 2));
context.getMetadataStore().createSegment(s1, SegmentType.STREAM_SEGMENT, validAttributes, TIMEOUT).join();
assertSegmentCreated(s1, SegmentType.STREAM_SEGMENT, validAttributes, context);
// Now verify that it also works if the attribute is not set.
val noAttributes = new AttributeUpdateCollection();
val s2 = getName(1);
context.getMetadataStore().createSegment(s2, SegmentType.STREAM_SEGMENT, noAttributes, TIMEOUT).join();
assertSegmentCreated(s2, SegmentType.STREAM_SEGMENT, noAttributes, context);
}
use of io.pravega.segmentstore.contracts.AttributeUpdate in project pravega by pravega.
the class MetadataStoreTestBase method createAttributeUpdates.
private Collection<AttributeUpdate> createAttributeUpdates(int count) {
Collection<AttributeUpdate> result = new ArrayList<>(count);
for (int i = 0; i < count; i++) {
boolean isCore = i % 2 == 0;
AttributeId id = isCore ? AttributeId.uuid(Attributes.CORE_ATTRIBUTE_ID_PREFIX, i + 10000) : AttributeId.randomUUID();
AttributeUpdateType ut = AttributeUpdateType.values()[i % AttributeUpdateType.values().length];
result.add(new AttributeUpdate(id, ut, i, i));
}
return result;
}
use of io.pravega.segmentstore.contracts.AttributeUpdate in project pravega by pravega.
the class ContainerMetadataUpdateTransactionTests method testUpdateAttributesImmutable.
/**
* Tests the ability of the ContainerMetadataUpdateTransaction to reject UpdateAttributeOperations that attempt to
* modify immutable Attributes
*/
@Test
public void testUpdateAttributesImmutable() {
final AttributeId immutableAttribute = Attributes.ATTRIBUTE_SEGMENT_TYPE;
Assert.assertTrue(Attributes.isUnmodifiable(immutableAttribute));
UpdateableContainerMetadata metadata = createMetadata();
val txn = createUpdateTransaction(metadata);
val coreUpdate = new UpdateAttributesOperation(SEGMENT_ID, AttributeUpdateCollection.from(new AttributeUpdate(immutableAttribute, AttributeUpdateType.Replace, 1L)));
AssertExtensions.assertThrows("Immutable attribute update succeeded.", () -> txn.preProcessOperation(coreUpdate), ex -> ex instanceof MetadataUpdateException);
}
use of io.pravega.segmentstore.contracts.AttributeUpdate in project pravega by pravega.
the class ContainerMetadataUpdateTransactionTests method testWithAttributes.
private void testWithAttributes(Function<AttributeUpdateCollection, Operation> createOperation) throws Exception {
final AttributeId attributeNoUpdate = AttributeId.randomUUID();
final AttributeId attributeAccumulate = AttributeId.randomUUID();
final AttributeId attributeReplace = AttributeId.randomUUID();
final AttributeId attributeReplaceIfGreater = AttributeId.randomUUID();
final AttributeId attributeReplaceIfEquals = AttributeId.randomUUID();
UpdateableContainerMetadata metadata = createMetadata();
val txn = createUpdateTransaction(metadata);
// Update #1.
AttributeUpdateCollection attributeUpdates = new AttributeUpdateCollection();
// 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));
expectedValues.put(Attributes.ATTRIBUTE_SEGMENT_TYPE, DEFAULT_TYPE.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<>(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