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 <[email protected]>
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()) {