Browse Source

HDFS-6344. Maximum limit on the size of an xattr. Contributed by Yi Liu.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-2006@1593895 13f79535-47bb-0310-9956-ffa450edef68
Uma Maheswara Rao G 11 years ago
parent
commit
bc2939b144

+ 2 - 0
hadoop-hdfs-project/hadoop-hdfs/CHANGES-HDFS-2006.txt

@@ -27,6 +27,8 @@ HDFS-2006 (Unreleased)
 
     HDFS-6314. Test cases for XAttrs. (Yi Liu via umamahesh)
 
+    HDFS-6344. Maximum limit on the size of an xattr. (Yi Liu via umamahesh)
+
   OPTIMIZATIONS
 
     HDFS-6346. Optimize OP_SET_XATTRS by persisting single Xattr entry per setXattr/removeXattr api call

+ 4 - 0
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java

@@ -196,6 +196,10 @@ public class DFSConfigKeys extends CommonConfigurationKeys {
   public static final boolean DFS_NAMENODE_XATTRS_ENABLED_DEFAULT = true;
   public static final String  DFS_NAMENODE_INODE_XATTRS_MAX_LIMIT_KEY = "dfs.namenode.inode.xattrs.max-limit";
   public static final int     DFS_NAMENODE_INODE_XATTRS_MAX_LIMIT_DEFAULT = 32;
+  public static final String  DFS_NAMENODE_XATTR_NAME_MAX_LENGTH_KEY = "dfs.namenode.xattr.name.max-length";
+  public static final int     DFS_NAMENODE_XATTR_NAME_MAX_LENGTH_DEFAULT = 64;
+  public static final String  DFS_NAMENODE_XATTR_VALUE_MAX_LENGTH_KEY = "dfs.namenode.xattr.value.max-length";
+  public static final int     DFS_NAMENODE_XATTR_VALUE_MAX_LENGTH_DEFAULT = 16384;
   public static final String  DFS_ADMIN = "dfs.cluster.administrators";
   public static final String  DFS_SERVER_HTTPS_KEYSTORE_RESOURCE_KEY = "dfs.https.server.keystore.resource";
   public static final String  DFS_SERVER_HTTPS_KEYSTORE_RESOURCE_DEFAULT = "ssl-server.xml";

+ 17 - 0
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java

@@ -7744,6 +7744,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
   private void setXAttrInt(String src, XAttr xAttr, EnumSet<XAttrSetFlag> flag,
       boolean logRetryCache) throws IOException {
     nnConf.checkXAttrsConfigFlag();
+    checkXAttrSize(xAttr);
     HdfsFileStatus resultingStat = null;
     FSPermissionChecker pc = getPermissionChecker();
     XAttrPermissionFilter.checkPermissionForApi(pc, xAttr);
@@ -7766,6 +7767,22 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
     logAuditEvent(true, "setXAttr", src, null, resultingStat);
   }
   
+  private void checkXAttrSize(XAttr xAttr) {
+    if (xAttr.getName().length() > nnConf.xattrNameMaxLength) {
+      throw new HadoopIllegalArgumentException(
+          "XAttr name is too long, maximum length = "
+              + nnConf.xattrNameMaxLength + ", but now the length = "
+              + xAttr.getName().length());
+    }
+    if (xAttr.getValue() != null
+        && xAttr.getValue().length > nnConf.xattrValueMaxLength) {
+      throw new HadoopIllegalArgumentException(
+          "XAttr value is too long, maximum length = "
+              + nnConf.xattrValueMaxLength + ", but now the length = "
+              + xAttr.getValue().length);
+    }
+  }
+  
   List<XAttr> getXAttrs(String src, List<XAttr> xAttrs) throws IOException {
     nnConf.checkXAttrsConfigFlag();
     FSPermissionChecker pc = getPermissionChecker();

+ 12 - 2
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNConf.java

@@ -41,6 +41,9 @@ final class NNConf {
    * XAttr-related operations.
    */
   private final boolean xattrsEnabled;
+  
+  final int xattrNameMaxLength;
+  final int xattrValueMaxLength;
 
   /**
    * Creates a new NNConf from configuration.
@@ -51,9 +54,16 @@ final class NNConf {
     aclsEnabled = conf.getBoolean(DFSConfigKeys.DFS_NAMENODE_ACLS_ENABLED_KEY,
       DFSConfigKeys.DFS_NAMENODE_ACLS_ENABLED_DEFAULT);
     LogFactory.getLog(NNConf.class).info("ACLs enabled? " + aclsEnabled);
-    xattrsEnabled = conf.getBoolean(DFSConfigKeys.DFS_NAMENODE_XATTRS_ENABLED_KEY, 
-      DFSConfigKeys.DFS_NAMENODE_XATTRS_ENABLED_DEFAULT);
+    xattrsEnabled = conf.getBoolean(
+        DFSConfigKeys.DFS_NAMENODE_XATTRS_ENABLED_KEY,
+        DFSConfigKeys.DFS_NAMENODE_XATTRS_ENABLED_DEFAULT);
     LogFactory.getLog(NNConf.class).info("XAttrs enabled? " + xattrsEnabled);
+    xattrNameMaxLength = conf.getInt(
+        DFSConfigKeys.DFS_NAMENODE_XATTR_NAME_MAX_LENGTH_KEY, 
+        DFSConfigKeys.DFS_NAMENODE_XATTR_NAME_MAX_LENGTH_DEFAULT);
+    xattrValueMaxLength = conf.getInt(
+        DFSConfigKeys.DFS_NAMENODE_XATTR_VALUE_MAX_LENGTH_KEY, 
+        DFSConfigKeys.DFS_NAMENODE_XATTR_VALUE_MAX_LENGTH_DEFAULT);
   }
 
   /**

+ 17 - 0
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/FSXAttrBaseTest.java

@@ -195,6 +195,8 @@ public class FSXAttrBaseTest {
    * 2. Set xattr with illegal name.
    * 3. Set xattr without XAttrSetFlag.
    * 4. Set xattr and total number exceeds max limit.
+   * 5. Set xattr and name is too long.
+   * 6. Set xattr and value is too long.
    */
   @Test
   public void testSetXAttr() throws Exception {
@@ -263,6 +265,21 @@ public class FSXAttrBaseTest {
     fs.removeXAttr(path, name1);
     fs.removeXAttr(path, name2);
     fs.removeXAttr(path, name3);
+    
+    // Name length exceeds max limit
+    String longName = "user.abcdefg123456789000";
+    try {
+      fs.setXAttr(path, longName, value1);
+      Assert.fail("Setting xattr should fail if name is too long.");
+    } catch (IOException e) {
+    }
+    // Value length exceeds max limit
+    byte[] longValue = new byte[40];
+    try {
+      fs.setXAttr(path, name1, longValue);
+      Assert.fail("Setting xattr should fail if value is too long.");
+    } catch (IOException e) {
+    }
   }
   
   /**

+ 2 - 0
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFileContextXAttr.java

@@ -42,6 +42,8 @@ public class TestFileContextXAttr extends FSXAttrBaseTest  {
     conf = new Configuration();
     conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_XATTRS_ENABLED_KEY, true);
     conf.setInt(DFSConfigKeys.DFS_NAMENODE_INODE_XATTRS_MAX_LIMIT_KEY, 3);
+    conf.setInt(DFSConfigKeys.DFS_NAMENODE_XATTR_NAME_MAX_LENGTH_KEY, 16);
+    conf.setInt(DFSConfigKeys.DFS_NAMENODE_XATTR_VALUE_MAX_LENGTH_KEY, 32);
     initCluster(true);
   }
 

+ 2 - 0
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeXAttr.java

@@ -44,6 +44,8 @@ public class TestNameNodeXAttr extends FSXAttrBaseTest {
     conf = new Configuration();
     conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_XATTRS_ENABLED_KEY, true);
     conf.setInt(DFSConfigKeys.DFS_NAMENODE_INODE_XATTRS_MAX_LIMIT_KEY, 3);
+    conf.setInt(DFSConfigKeys.DFS_NAMENODE_XATTR_NAME_MAX_LENGTH_KEY, 16);
+    conf.setInt(DFSConfigKeys.DFS_NAMENODE_XATTR_VALUE_MAX_LENGTH_KEY, 32);
     initCluster(true);
   }