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()) {

Reply via email to