You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by ed...@apache.org on 2021/07/07 18:11:04 UTC

[accumulo] branch main updated: Refactor common table property validation to reduce duplication (#2186)

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

edcoleman 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 df7e49e  Refactor common table property validation to reduce duplication (#2186)
df7e49e is described below

commit df7e49e771683f73d228ca02af0c40f475ac90e0
Author: EdColeman <de...@etcoleman.com>
AuthorDate: Wed Jul 7 14:10:56 2021 -0400

    Refactor common table property validation to reduce duplication (#2186)
    
    * Refactor common table property validation to reduce duplication
    
    - Move duplcated code for table property validation to one place
    - Minor check-style fixes.
    - fix possible nulll pointer warning (FateServiceHandler)
---
 .../org/apache/accumulo/core/conf/Property.java    | 44 +++++++++++++---------
 .../accumulo/server/util/NamespacePropUtil.java    |  8 +---
 .../apache/accumulo/server/util/TablePropUtil.java |  8 +---
 .../accumulo/manager/FateServiceHandler.java       |  8 ++--
 4 files changed, 33 insertions(+), 35 deletions(-)

diff --git a/core/src/main/java/org/apache/accumulo/core/conf/Property.java b/core/src/main/java/org/apache/accumulo/core/conf/Property.java
index 74f22a5..3093990 100644
--- a/core/src/main/java/org/apache/accumulo/core/conf/Property.java
+++ b/core/src/main/java/org/apache/accumulo/core/conf/Property.java
@@ -1171,15 +1171,15 @@ public enum Property {
       "This property is deprecated since 2.0.0, use tserver.scan.executors.meta.threads instead. "
           + "The maximum number of concurrent metadata read ahead that will execute.");
 
-  private String key;
-  private String defaultValue;
-  private String description;
+  private final String key;
+  private final String defaultValue;
+  private final String description;
   private boolean annotationsComputed = false;
   private boolean isSensitive;
   private boolean isDeprecated;
   private boolean isExperimental;
   private Property replacedBy = null;
-  private PropertyType type;
+  private final PropertyType type;
 
   Property(String name, String defaultValue, PropertyType type, String description) {
     this.key = name;
@@ -1352,10 +1352,10 @@ public enum Property {
     return false;
   }
 
-  private static HashSet<String> validTableProperties = null;
-  private static HashSet<String> validProperties = null;
-  private static HashSet<String> validPrefixes = null;
-  private static HashMap<String,Property> propertiesByKey = null;
+  private static final HashSet<String> validTableProperties = new HashSet<>();
+  private static final HashSet<String> validProperties = new HashSet<>();
+  private static final HashSet<String> validPrefixes = new HashSet<>();
+  private static final HashMap<String,Property> propertiesByKey = new HashMap<>();
 
   private static boolean isKeyValidlyPrefixed(String key) {
     for (String prefix : validPrefixes) {
@@ -1368,6 +1368,22 @@ public enum Property {
   }
 
   /**
+   * Checks if the given property and value are valid. A property is valid if the property key is
+   * valid see {@link #isValidTablePropertyKey} and that the value is a valid format for the type
+   * see {@link PropertyType#isValidFormat}.
+   *
+   * @param key
+   *          property key
+   * @param value
+   *          property value
+   * @return true if key is valid (recognized, or has a recognized prefix)
+   */
+  public static boolean isTablePropertyValid(final String key, final String value) {
+    Property p = getPropertyByKey(key);
+    return (p == null || p.getType().isValidFormat(value)) && isValidTablePropertyKey(key);
+  }
+
+  /**
    * Checks if the given property key is valid. A valid property key is either equal to the key of
    * some defined property or has a prefix matching some prefix defined in this class.
    *
@@ -1528,21 +1544,15 @@ public enum Property {
     // Precomputing information here avoids :
     // * Computing it each time a method is called
     // * Using synch to compute the first time a method is called
-    propertiesByKey = new HashMap<>();
-    validPrefixes = new HashSet<>();
-    validProperties = new HashSet<>();
-
     for (Property p : Property.values()) {
+      propertiesByKey.put(p.getKey(), p);
       if (p.getType().equals(PropertyType.PREFIX)) {
         validPrefixes.add(p.getKey());
       } else {
         validProperties.add(p.getKey());
       }
-      propertiesByKey.put(p.getKey(), p);
-    }
-
-    validTableProperties = new HashSet<>();
-    for (Property p : Property.values()) {
+      // exclude prefix types (prevents setting a prefix type like table.custom or
+      // table.constraint, directly, since they aren't valid properties on their own)
       if (!p.getType().equals(PropertyType.PREFIX)
           && p.getKey().startsWith(Property.TABLE_PREFIX.getKey())) {
         validTableProperties.add(p.getKey());
diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/NamespacePropUtil.java b/server/base/src/main/java/org/apache/accumulo/server/util/NamespacePropUtil.java
index 94cc565..bb809c6 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/NamespacePropUtil.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/NamespacePropUtil.java
@@ -32,7 +32,7 @@ import org.apache.zookeeper.KeeperException;
 public class NamespacePropUtil {
   public static boolean setNamespaceProperty(ServerContext context, NamespaceId namespaceId,
       String property, String value) throws KeeperException, InterruptedException {
-    if (!isPropertyValid(property, value))
+    if (!Property.isTablePropertyValid(property, value))
       return false;
 
     ZooReaderWriter zoo = context.getZooReaderWriter();
@@ -49,12 +49,6 @@ public class NamespacePropUtil {
     return true;
   }
 
-  public static boolean isPropertyValid(String property, String value) {
-    Property p = Property.getPropertyByKey(property);
-    return (p == null || p.getType().isValidFormat(value))
-        && Property.isValidTablePropertyKey(property);
-  }
-
   public static void removeNamespaceProperty(ServerContext context, NamespaceId namespaceId,
       String property) throws InterruptedException, KeeperException {
     String zPath = getPath(context, namespaceId) + "/" + property;
diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/TablePropUtil.java b/server/base/src/main/java/org/apache/accumulo/server/util/TablePropUtil.java
index 90e1b97..8980c6b 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/TablePropUtil.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/TablePropUtil.java
@@ -39,7 +39,7 @@ public class TablePropUtil {
 
   public static boolean setTableProperty(ZooReaderWriter zoo, String zkRoot, TableId tableId,
       String property, String value) throws KeeperException, InterruptedException {
-    if (!isPropertyValid(property, value))
+    if (!Property.isTablePropertyValid(property, value))
       return false;
 
     // create the zk node for per-table properties for this table if it doesn't already exist
@@ -53,12 +53,6 @@ public class TablePropUtil {
     return true;
   }
 
-  public static boolean isPropertyValid(String property, String value) {
-    Property p = Property.getPropertyByKey(property);
-    return (p == null || p.getType().isValidFormat(value))
-        && Property.isValidTablePropertyKey(property);
-  }
-
   public static void removeTableProperty(ServerContext context, TableId tableId, String property)
       throws InterruptedException, KeeperException {
     String zPath = getTablePath(context.getZooKeeperRoot(), tableId) + "/" + property;
diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java b/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java
index 0be11ad..a657b90 100644
--- a/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java
+++ b/server/manager/src/main/java/org/apache/accumulo/manager/FateServiceHandler.java
@@ -57,6 +57,7 @@ import org.apache.accumulo.core.clientImpl.thrift.TableOperation;
 import org.apache.accumulo.core.clientImpl.thrift.TableOperationExceptionType;
 import org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException;
 import org.apache.accumulo.core.clientImpl.thrift.ThriftTableOperationException;
+import org.apache.accumulo.core.conf.Property;
 import org.apache.accumulo.core.data.NamespaceId;
 import org.apache.accumulo.core.data.TableId;
 import org.apache.accumulo.core.manager.thrift.FateOperation;
@@ -85,7 +86,6 @@ import org.apache.accumulo.manager.tableOps.tableExport.ExportTable;
 import org.apache.accumulo.manager.tableOps.tableImport.ImportTable;
 import org.apache.accumulo.server.client.ClientServiceHandler;
 import org.apache.accumulo.server.manager.state.MergeInfo;
-import org.apache.accumulo.server.util.TablePropUtil;
 import org.apache.hadoop.fs.FSDataOutputStream;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
@@ -286,7 +286,7 @@ class FateServiceHandler implements FateService.Iface {
             continue;
           }
 
-          if (!TablePropUtil.isPropertyValid(entry.getKey(), entry.getValue())) {
+          if (!Property.isTablePropertyValid(entry.getKey(), entry.getValue())) {
             throw new ThriftTableOperationException(null, tableName, tableOp,
                 TableOperationExceptionType.OTHER,
                 "Property or value not valid " + entry.getKey() + "=" + entry.getValue());
@@ -694,8 +694,8 @@ class FateServiceHandler implements FateService.Iface {
       // Information provided by a client should generate a user-level exception, not a system-level
       // warning.
       log.debug(why);
-      throw new ThriftTableOperationException(tableId.canonical(), null, op,
-          TableOperationExceptionType.INVALID_NAME, why);
+      throw new ThriftTableOperationException((tableId == null ? "null" : tableId.canonical()),
+          null, op, TableOperationExceptionType.INVALID_NAME, why);
     }
   }