This is an automated email from the ASF dual-hosted git repository. kturner pushed a commit to branch elasticity in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/elasticity by this push: new 63ff7db77a adds check for unsplittable column in conditional update (#4793) 63ff7db77a is described below commit 63ff7db77a99404396901faf043dcaff5392830c Author: Keith Turner <ktur...@apache.org> AuthorDate: Fri Aug 9 12:20:56 2024 -0400 adds check for unsplittable column in conditional update (#4793) Added a check in conditional update to see if the unsplittable column had changed. Updated the split code to use this check when setting the column. --- .../metadata/ConditionalTabletMutatorImpl.java | 10 ++++ .../manager/tableOps/split/FindSplits.java | 5 +- .../test/functional/AmpleConditionalWriterIT.java | 58 ++++++++++++++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletMutatorImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletMutatorImpl.java index 33f746c599..18739f33e1 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletMutatorImpl.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletMutatorImpl.java @@ -24,6 +24,7 @@ import static org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSec import static org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.ServerColumnFamily.OPID_COLUMN; import static org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.ServerColumnFamily.SELECTED_COLUMN; import static org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.ServerColumnFamily.TIME_COLUMN; +import static org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.SplitColumnFamily.UNSPLITTABLE_COLUMN; import static org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.SuspendLocationColumn.SUSPEND_COLUMN; import static org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.TabletColumnFamily.AVAILABILITY_COLUMN; import static org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.TabletColumnFamily.PREV_ROW_COLUMN; @@ -297,6 +298,15 @@ public class ConditionalTabletMutatorImpl extends TabletMutatorBase<Ample.Condit mutation.addCondition(c); } break; + case UNSPLITTABLE: { + Condition c = new Condition(UNSPLITTABLE_COLUMN.getColumnFamily(), + UNSPLITTABLE_COLUMN.getColumnQualifier()); + if (tabletMetadata.getUnSplittable() != null) { + c.setValue(tabletMetadata.getUnSplittable().toBase64()); + } + mutation.addCondition(c); + } + break; default: throw new UnsupportedOperationException("Column type " + type + " is not supported."); } diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java index f72d26cb05..1b790cc815 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/split/FindSplits.java @@ -19,6 +19,7 @@ package org.apache.accumulo.manager.tableOps.split; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.FILES; +import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.UNSPLITTABLE; import java.util.Optional; import java.util.SortedSet; @@ -130,7 +131,7 @@ public class FindSplits extends ManagerRepo { log.debug("Setting unsplittable metadata on tablet {}. hashCode: {}", tabletMetadata.getExtent(), unSplittableMeta); var mutator = tabletsMutator.mutateTablet(extent).requireAbsentOperation() - .requireSame(tabletMetadata, FILES).setUnSplittable(unSplittableMeta); + .requireSame(tabletMetadata, FILES, UNSPLITTABLE).setUnSplittable(unSplittableMeta); mutator.submit(tm -> unSplittableMeta.equals(tm.getUnSplittable())); // Case 2: If the unsplittable marker has already been previously set, but we do not need @@ -142,7 +143,7 @@ public class FindSplits extends ManagerRepo { log.info("Tablet {} no longer needs to split, deleting unsplittable marker.", tabletMetadata.getExtent()); var mutator = tabletsMutator.mutateTablet(extent).requireAbsentOperation() - .requireSame(tabletMetadata, FILES).deleteUnSplittable(); + .requireSame(tabletMetadata, FILES, UNSPLITTABLE).deleteUnSplittable(); mutator.submit(tm -> tm.getUnSplittable() == null); // Case 3: The table config and/or set of files changed since the tablet mgmt iterator // examined this tablet. diff --git a/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java b/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java index 7353be3cd6..ac3ce6da71 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/AmpleConditionalWriterIT.java @@ -34,6 +34,7 @@ import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.SELECTED; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.SUSPEND; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.TIME; +import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.UNSPLITTABLE; import static org.apache.accumulo.core.metadata.schema.TabletMetadata.ColumnType.USER_COMPACTION_REQUESTED; import static org.apache.accumulo.core.util.LazySingletons.GSON; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -96,6 +97,7 @@ import org.apache.accumulo.core.metadata.schema.TabletMetadataBuilder; import org.apache.accumulo.core.metadata.schema.TabletOperationId; import org.apache.accumulo.core.metadata.schema.TabletOperationType; import org.apache.accumulo.core.metadata.schema.TabletsMetadata; +import org.apache.accumulo.core.metadata.schema.UnSplittableMetadata; import org.apache.accumulo.core.metadata.schema.filters.GcWalsFilter; import org.apache.accumulo.core.metadata.schema.filters.HasCurrentFilter; import org.apache.accumulo.core.metadata.schema.filters.TabletMetadataFilter; @@ -1691,6 +1693,62 @@ public class AmpleConditionalWriterIT extends AccumuloClusterHarness { } } + @Test + public void testUnsplittable() { + try (AccumuloClient c = Accumulo.newClient().from(getClientProps()).build()) { + var context = cluster.getServerContext(); + + var ctmi = new ConditionalTabletsMutatorImpl(context); + + var tabletMeta1 = TabletMetadata.builder(e1).build(UNSPLITTABLE); + + // require the UNSPLITTABLE column to be absent when it is absent + UnSplittableMetadata usm1 = + UnSplittableMetadata.toUnSplittable(e1, 1000, 100000, 32, Set.of()); + ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, UNSPLITTABLE) + .setUnSplittable(usm1).submit(tm -> false); + var results = ctmi.process(); + assertEquals(Status.ACCEPTED, results.get(e1).getStatus()); + var tabletMeta2 = context.getAmple().readTablet(e1); + assertEquals(usm1.toBase64(), tabletMeta2.getUnSplittable().toBase64()); + + // require the UNSPLITTABLE column to be absent when it is not absent + ctmi = new ConditionalTabletsMutatorImpl(context); + ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta1, UNSPLITTABLE) + .deleteUnSplittable().submit(tm -> false); + results = ctmi.process(); + assertEquals(Status.REJECTED, results.get(e1).getStatus()); + assertEquals(usm1.toBase64(), context.getAmple().readTablet(e1).getUnSplittable().toBase64()); + + UnSplittableMetadata usm2 = + UnSplittableMetadata.toUnSplittable(e1, 1001, 100001, 33, Set.of()); + var tabletMeta3 = TabletMetadata.builder(e1).setUnSplittable(usm2).build(UNSPLITTABLE); + // require the UNSPLITTABLE column to be usm2 when it is actually usm1 + ctmi = new ConditionalTabletsMutatorImpl(context); + ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta3, UNSPLITTABLE) + .deleteUnSplittable().submit(tm -> false); + results = ctmi.process(); + assertEquals(Status.REJECTED, results.get(e1).getStatus()); + assertEquals(usm1.toBase64(), context.getAmple().readTablet(e1).getUnSplittable().toBase64()); + + // require the UNSPLITTABLE column to be usm1 when it is actually usm1 + ctmi = new ConditionalTabletsMutatorImpl(context); + ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2, UNSPLITTABLE) + .deleteUnSplittable().submit(tm -> false); + results = ctmi.process(); + assertEquals(Status.ACCEPTED, results.get(e1).getStatus()); + assertNull(context.getAmple().readTablet(e1).getUnSplittable()); + + // require the UNSPLITTABLE column to be usm1 when it is actually absent + ctmi = new ConditionalTabletsMutatorImpl(context); + ctmi.mutateTablet(e1).requireAbsentOperation().requireSame(tabletMeta2, UNSPLITTABLE) + .setUnSplittable(usm2).submit(tm -> false); + results = ctmi.process(); + assertEquals(Status.REJECTED, results.get(e1).getStatus()); + assertNull(context.getAmple().readTablet(e1).getUnSplittable()); + } + } + @Test public void testErrors() { try (AccumuloClient c = Accumulo.newClient().from(getClientProps()).build()) {