You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by mm...@apache.org on 2020/10/30 16:26:55 UTC

[accumulo] branch main updated: Create Ample interface method for createDeleteMutation (#1757)

This is an automated email from the ASF dual-hosted git repository.

mmiller pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/main by this push:
     new d820360  Create Ample interface method for createDeleteMutation (#1757)
d820360 is described below

commit d820360b975de759b1575d68456e69c828225a85
Author: Mike Miller <mm...@apache.org>
AuthorDate: Fri Oct 30 12:26:48 2020 -0400

    Create Ample interface method for createDeleteMutation (#1757)
    
    * Drop static method in favor of method on the Ample interface for
    creating delete mutations
    * Change GarbageCollectorIT to use Ample for one of the tests
    * Reuse Ample object in loops to prevent extra object creation
    * Further improvements could be made to not have the Mutation type in Ample
---
 .../org/apache/accumulo/core/metadata/TabletFileUtil.java |  3 ++-
 .../org/apache/accumulo/core/metadata/schema/Ample.java   | 15 +++++++++++++++
 .../apache/accumulo/server/metadata/ServerAmpleImpl.java  | 11 ++++++-----
 .../apache/accumulo/server/util/MetadataTableUtil.java    | 14 ++++++++------
 .../org/apache/accumulo/master/TabletGroupWatcher.java    | 13 ++++++++-----
 .../org/apache/accumulo/master/upgrade/Upgrader9to10.java |  4 ++--
 .../accumulo/test/functional/GarbageCollectorIT.java      |  6 +++---
 7 files changed, 44 insertions(+), 22 deletions(-)

diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/TabletFileUtil.java b/core/src/main/java/org/apache/accumulo/core/metadata/TabletFileUtil.java
index 372c017..ff92ae3 100644
--- a/core/src/main/java/org/apache/accumulo/core/metadata/TabletFileUtil.java
+++ b/core/src/main/java/org/apache/accumulo/core/metadata/TabletFileUtil.java
@@ -28,7 +28,8 @@ public class TabletFileUtil {
   /**
    * Validate if string is a valid path. Return normalized string or throw exception if not valid.
    * This was added to facilitate more use of TabletFile over String but this puts the validation in
-   * one location in the case where TabletFile can't be used.
+   * one location in the case where TabletFile can't be used. The Garbage Collector is optimized to
+   * store a directory for Tablet File so a String is used.
    */
   public static String validate(String path) {
     Path p = new Path(path);
diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/schema/Ample.java b/core/src/main/java/org/apache/accumulo/core/metadata/schema/Ample.java
index 2a33e17..4703b32 100644
--- a/core/src/main/java/org/apache/accumulo/core/metadata/schema/Ample.java
+++ b/core/src/main/java/org/apache/accumulo/core/metadata/schema/Ample.java
@@ -21,6 +21,7 @@ package org.apache.accumulo.core.metadata.schema;
 import java.util.Collection;
 import java.util.Iterator;
 
+import org.apache.accumulo.core.data.Mutation;
 import org.apache.accumulo.core.data.TableId;
 import org.apache.accumulo.core.dataImpl.KeyExtent;
 import org.apache.accumulo.core.metadata.MetadataTable;
@@ -152,6 +153,20 @@ public interface Ample {
   }
 
   /**
+   * Return an encoded delete marker Mutation to delete the specified TabletFile path. A String is
+   * used for the parameter because the Garbage Collector is optimized to store a directory for
+   * Tablet File. Otherwise a {@link TabletFile} object could be used. The tabletFilePathToRemove is
+   * validated and normalized before creating the mutation.
+   *
+   * @param tabletFilePathToRemove
+   *          String full path of the TabletFile
+   * @return Mutation with encoded delete marker
+   */
+  default Mutation createDeleteMutation(String tabletFilePathToRemove) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
    * This interface allows efficiently updating multiple tablets. Unless close is called, changes
    * may not be persisted.
    */
diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/ServerAmpleImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/ServerAmpleImpl.java
index c42715e..b1d89dd 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/metadata/ServerAmpleImpl.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/ServerAmpleImpl.java
@@ -195,18 +195,19 @@ public class ServerAmpleImpl extends AmpleImpl implements Ample {
     }
   }
 
-  public static Mutation createDeleteMutation(String pathToRemove) {
-    String path = TabletFileUtil.validate(pathToRemove);
+  @Override
+  public Mutation createDeleteMutation(String tabletFilePathToRemove) {
+    String path = TabletFileUtil.validate(tabletFilePathToRemove);
     return createDelMutation(path);
   }
 
-  public static Mutation createDeleteMutation(StoredTabletFile pathToRemove) {
+  public Mutation createDeleteMutation(StoredTabletFile pathToRemove) {
     return createDelMutation(pathToRemove.getMetaUpdateDelete());
   }
 
-  private static Mutation createDelMutation(String path) {
+  private Mutation createDelMutation(String path) {
     Mutation delFlag = new Mutation(new Text(DeletesSection.encodeRow(path)));
-    delFlag.put(EMPTY_TEXT, EMPTY_TEXT, SkewedKeyValue.NAME);
+    delFlag.put(EMPTY_TEXT, EMPTY_TEXT, DeletesSection.SkewedKeyValue.NAME);
     return delFlag;
   }
 }
diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java b/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java
index e01323c..a8c6011 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java
@@ -67,6 +67,7 @@ import org.apache.accumulo.core.metadata.RootTable;
 import org.apache.accumulo.core.metadata.StoredTabletFile;
 import org.apache.accumulo.core.metadata.TabletFile;
 import org.apache.accumulo.core.metadata.TabletFileUtil;
+import org.apache.accumulo.core.metadata.schema.Ample;
 import org.apache.accumulo.core.metadata.schema.Ample.TabletMutator;
 import org.apache.accumulo.core.metadata.schema.DataFileValue;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.BlipSection;
@@ -93,7 +94,6 @@ import org.apache.accumulo.fate.FateTxId;
 import org.apache.accumulo.fate.zookeeper.ZooLock;
 import org.apache.accumulo.server.ServerContext;
 import org.apache.accumulo.server.gc.GcVolumeUtil;
-import org.apache.accumulo.server.metadata.ServerAmpleImpl;
 import org.apache.hadoop.io.Text;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -283,17 +283,18 @@ public class MetadataTableUtil {
    * datafilesToDelete are strings because they can be a TabletFile or directory
    */
   public static void addDeleteEntries(KeyExtent extent, Set<String> datafilesToDelete,
-      ServerContext context) {
+      ServerContext context, Ample ample) {
 
     // TODO could use batch writer,would need to handle failure and retry like update does -
     // ACCUMULO-1294
     for (String pathToRemove : datafilesToDelete) {
-      update(context, ServerAmpleImpl.createDeleteMutation(pathToRemove), extent);
+      update(context, ample.createDeleteMutation(pathToRemove), extent);
     }
   }
 
   public static void addDeleteEntry(ServerContext context, TableId tableId, String path) {
-    update(context, ServerAmpleImpl.createDeleteMutation(path), new KeyExtent(tableId, null, null));
+    update(context, context.getAmple().createDeleteMutation(path),
+        new KeyExtent(tableId, null, null));
   }
 
   public static void removeScanFiles(KeyExtent extent, Set<StoredTabletFile> scanFiles,
@@ -364,6 +365,7 @@ public class MetadataTableUtil {
 
       // scan metadata for our table and delete everything we find
       Mutation m = null;
+      Ample ample = context.getAmple();
       ms.setRange(new KeyExtent(tableId, null, null).toMetaRange());
 
       // insert deletes before deleting data from metadata... this makes the code fault tolerant
@@ -377,13 +379,13 @@ public class MetadataTableUtil {
 
           if (key.getColumnFamily().equals(DataFileColumnFamily.NAME)) {
             String ref = TabletFileUtil.validate(key.getColumnQualifierData().toString());
-            bw.addMutation(ServerAmpleImpl.createDeleteMutation(ref));
+            bw.addMutation(ample.createDeleteMutation(ref));
           }
 
           if (ServerColumnFamily.DIRECTORY_COLUMN.hasColumns(key)) {
             String uri =
                 GcVolumeUtil.getDeleteTabletOnAllVolumesUri(tableId, cell.getValue().toString());
-            bw.addMutation(ServerAmpleImpl.createDeleteMutation(uri));
+            bw.addMutation(ample.createDeleteMutation(uri));
           }
         }
 
diff --git a/server/manager/src/main/java/org/apache/accumulo/master/TabletGroupWatcher.java b/server/manager/src/main/java/org/apache/accumulo/master/TabletGroupWatcher.java
index c661f85..5647554 100644
--- a/server/manager/src/main/java/org/apache/accumulo/master/TabletGroupWatcher.java
+++ b/server/manager/src/main/java/org/apache/accumulo/master/TabletGroupWatcher.java
@@ -59,6 +59,7 @@ import org.apache.accumulo.core.master.thrift.TabletServerStatus;
 import org.apache.accumulo.core.metadata.MetadataTable;
 import org.apache.accumulo.core.metadata.RootTable;
 import org.apache.accumulo.core.metadata.TabletFileUtil;
+import org.apache.accumulo.core.metadata.schema.Ample;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.ChoppedColumnFamily;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.TabletsSection.CurrentLocationColumnFamily;
@@ -74,6 +75,7 @@ import org.apache.accumulo.master.Master.TabletGoalState;
 import org.apache.accumulo.master.state.MergeStats;
 import org.apache.accumulo.master.state.TableCounts;
 import org.apache.accumulo.master.state.TableStats;
+import org.apache.accumulo.server.ServerContext;
 import org.apache.accumulo.server.conf.TableConfiguration;
 import org.apache.accumulo.server.gc.GcVolumeUtil;
 import org.apache.accumulo.server.log.WalStateManager;
@@ -89,7 +91,6 @@ import org.apache.accumulo.server.master.state.TabletLocationState;
 import org.apache.accumulo.server.master.state.TabletLocationState.BadLocationStateException;
 import org.apache.accumulo.server.master.state.TabletState;
 import org.apache.accumulo.server.master.state.TabletStateStore;
-import org.apache.accumulo.server.metadata.ServerAmpleImpl;
 import org.apache.accumulo.server.tablets.TabletTime;
 import org.apache.accumulo.server.util.MetadataTableUtil;
 import org.apache.hadoop.fs.Path;
@@ -584,6 +585,8 @@ abstract class TabletGroupWatcher extends Daemon {
     }
     try {
       AccumuloClient client = master.getContext();
+      ServerContext context = master.getContext();
+      Ample ample = context.getAmple();
       Text start = extent.prevEndRow();
       if (start == null) {
         start = new Text();
@@ -603,7 +606,7 @@ abstract class TabletGroupWatcher extends Daemon {
         if (key.compareColumnFamily(DataFileColumnFamily.NAME) == 0) {
           datafiles.add(TabletFileUtil.validate(key.getColumnQualifierData().toString()));
           if (datafiles.size() > 1000) {
-            MetadataTableUtil.addDeleteEntries(extent, datafiles, master.getContext());
+            MetadataTableUtil.addDeleteEntries(extent, datafiles, context, ample);
             datafiles.clear();
           }
         } else if (ServerColumnFamily.TIME_COLUMN.hasColumns(key)) {
@@ -616,12 +619,12 @@ abstract class TabletGroupWatcher extends Daemon {
               entry.getValue().toString());
           datafiles.add(path);
           if (datafiles.size() > 1000) {
-            MetadataTableUtil.addDeleteEntries(extent, datafiles, master.getContext());
+            MetadataTableUtil.addDeleteEntries(extent, datafiles, context, ample);
             datafiles.clear();
           }
         }
       }
-      MetadataTableUtil.addDeleteEntries(extent, datafiles, master.getContext());
+      MetadataTableUtil.addDeleteEntries(extent, datafiles, context, ample);
       BatchWriter bw = client.createBatchWriter(targetSystemTable, new BatchWriterConfig());
       try {
         deleteTablets(info, deleteRange, bw, client);
@@ -700,7 +703,7 @@ abstract class TabletGroupWatcher extends Daemon {
         } else if (ServerColumnFamily.DIRECTORY_COLUMN.hasColumns(key)) {
           String uri =
               GcVolumeUtil.getDeleteTabletOnAllVolumesUri(range.tableId(), value.toString());
-          bw.addMutation(ServerAmpleImpl.createDeleteMutation(uri));
+          bw.addMutation(master.getContext().getAmple().createDeleteMutation(uri));
         }
       }
 
diff --git a/server/manager/src/main/java/org/apache/accumulo/master/upgrade/Upgrader9to10.java b/server/manager/src/main/java/org/apache/accumulo/master/upgrade/Upgrader9to10.java
index eeae1c6..f7c6d1a 100644
--- a/server/manager/src/main/java/org/apache/accumulo/master/upgrade/Upgrader9to10.java
+++ b/server/manager/src/main/java/org/apache/accumulo/master/upgrade/Upgrader9to10.java
@@ -78,7 +78,6 @@ import org.apache.accumulo.server.fs.VolumeManager;
 import org.apache.accumulo.server.gc.GcVolumeUtil;
 import org.apache.accumulo.server.master.state.TServerInstance;
 import org.apache.accumulo.server.metadata.RootGcCandidates;
-import org.apache.accumulo.server.metadata.ServerAmpleImpl;
 import org.apache.accumulo.server.metadata.TabletMutatorBase;
 import org.apache.accumulo.server.util.TablePropUtil;
 import org.apache.hadoop.fs.FileStatus;
@@ -424,6 +423,7 @@ public class Upgrader9to10 implements Upgrader {
 
     String tableName = level.metaTable();
     AccumuloClient c = ctx;
+    Ample ample = ctx.getAmple();
 
     // find all deletes
     try (BatchWriter writer = c.createBatchWriter(tableName, new BatchWriterConfig())) {
@@ -441,7 +441,7 @@ public class Upgrader9to10 implements Upgrader {
           Path absolutePath = resolveRelativeDelete(olddelete, upgradeProp);
           String updatedDel = switchToAllVolumes(absolutePath);
 
-          writer.addMutation(ServerAmpleImpl.createDeleteMutation(updatedDel));
+          writer.addMutation(ample.createDeleteMutation(updatedDel));
         }
         writer.flush();
         // if nothing thrown then we're good so mark all deleted
diff --git a/test/src/main/java/org/apache/accumulo/test/functional/GarbageCollectorIT.java b/test/src/main/java/org/apache/accumulo/test/functional/GarbageCollectorIT.java
index d78465f..588ab68 100644
--- a/test/src/main/java/org/apache/accumulo/test/functional/GarbageCollectorIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/functional/GarbageCollectorIT.java
@@ -44,6 +44,7 @@ import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Mutation;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.metadata.MetadataTable;
+import org.apache.accumulo.core.metadata.schema.Ample;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.DeletesSection;
 import org.apache.accumulo.core.metadata.schema.MetadataSchema.DeletesSection.SkewedKeyValue;
 import org.apache.accumulo.core.security.Authorizations;
@@ -60,7 +61,6 @@ import org.apache.accumulo.miniclusterImpl.MiniAccumuloClusterImpl.ProcessInfo;
 import org.apache.accumulo.miniclusterImpl.MiniAccumuloConfigImpl;
 import org.apache.accumulo.miniclusterImpl.ProcessNotFoundException;
 import org.apache.accumulo.miniclusterImpl.ProcessReference;
-import org.apache.accumulo.server.metadata.ServerAmpleImpl;
 import org.apache.accumulo.test.TestIngest;
 import org.apache.accumulo.test.VerifyIngest;
 import org.apache.accumulo.test.VerifyIngest.VerifyParams;
@@ -305,14 +305,14 @@ public class GarbageCollectorIT extends ConfigurableMacBase {
   }
 
   private void addEntries(AccumuloClient client) throws Exception {
+    Ample ample = getServerContext().getAmple();
     client.securityOperations().grantTablePermission(client.whoami(), MetadataTable.NAME,
         TablePermission.WRITE);
     try (BatchWriter bw = client.createBatchWriter(MetadataTable.NAME)) {
       for (int i = 0; i < 100000; ++i) {
         String longpath = "aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee"
             + "ffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjj";
-        Mutation delFlag =
-            ServerAmpleImpl.createDeleteMutation(String.format("file:/%020d/%s", i, longpath));
+        Mutation delFlag = ample.createDeleteMutation(String.format("file:/%020d/%s", i, longpath));
         bw.addMutation(delFlag);
       }
     }