From c184b5ce24ac9996cabac5e3d0b56ed338188a2f Mon Sep 17 00:00:00 2001 From: Siyao Meng <50227127+smengcl@users.noreply.github.com> Date: Mon, 8 Nov 2021 04:34:19 -0800 Subject: [PATCH 1/8] HDDS-5891. OFS mkdir -p does not work as expected for bucket creation when volume exists due to volume create ACL check --- .../apache/hadoop/ozone/om/BucketManagerImpl.java | 13 ++++++++++--- .../fs/ozone/BasicRootedOzoneClientAdapterImpl.java | 8 ++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java index 9bffde953853..218fc0a1c868 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java @@ -45,6 +45,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_NOT_FOUND; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.INTERNAL_ERROR; +import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_NOT_FOUND; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; @@ -127,7 +128,7 @@ public void createBucket(OmBucketInfo bucketInfo) throws IOException { if (volumeArgs == null) { LOG.debug("volume: {} not found ", volumeName); throw new OMException("Volume doesn't exist", - OMException.ResultCodes.VOLUME_NOT_FOUND); + VOLUME_NOT_FOUND); } //Check if bucket already exists if (metadataManager.getBucketTable().get(bucketKey) != null) { @@ -250,8 +251,14 @@ public OmBucketInfo getBucketInfo(String volumeName, String bucketName) if (value == null) { LOG.debug("bucket: {} not found in volume: {}.", bucketName, volumeName); - throw new OMException("Bucket not found", - BUCKET_NOT_FOUND); + // Check volume existence, because we need to throw VOLUME_NOT_FOUND + // if the parent volume doesn't exist. + if (metadataManager.getVolumeTable().get(volumeName) == null) { + throw new OMException("Volume not found when getting bucket info", + VOLUME_NOT_FOUND); + } else { + throw new OMException("Bucket not found", BUCKET_NOT_FOUND); + } } return value; } catch (IOException ex) { diff --git a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java index 1f8f25eca650..a7cfcbf8633d 100644 --- a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java +++ b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java @@ -229,7 +229,7 @@ private OzoneBucket getBucket(String volumeStr, String bucketStr, // when ACL is disabled. Both exceptions need to be handled. switch (ex.getResult()) { case VOLUME_NOT_FOUND: - case BUCKET_NOT_FOUND: + // Create the volume first when the volume doesn't exist try { objectStore.createVolume(volumeStr); } catch (OMException newVolEx) { @@ -238,7 +238,11 @@ private OzoneBucket getBucket(String volumeStr, String bucketStr, throw newVolEx; } } - + // No break here. Proceed to create the bucket + case BUCKET_NOT_FOUND: + // When BUCKET_NOT_FOUND is thrown, we expect the parent volume + // exists, so that we don't call create volume and incur + // unnecessary ACL checks which could lead to unwanted behavior. OzoneVolume volume = proxy.getVolumeDetails(volumeStr); // Create the bucket try { From 12288657182666276ac00d54f00f7c4864dc938f Mon Sep 17 00:00:00 2001 From: Siyao Meng <50227127+smengcl@users.noreply.github.com> Date: Tue, 9 Nov 2021 18:28:47 -0800 Subject: [PATCH 2/8] Fix dbVolumeKey; Improve comments. --- .../apache/hadoop/ozone/om/BucketManagerImpl.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java index 218fc0a1c868..068c62903341 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java @@ -237,6 +237,12 @@ private void commitBucketInfoToDB(OmBucketInfo omBucketInfo) * * @param volumeName - Name of the Volume. * @param bucketName - Name of the Bucket. + * @return OmBucketInfo + * @throws IOException The exception thrown could be: + * 1. OMException VOLUME_NOT_FOUND when the parent volume doesn't exist. + * 2. OMException BUCKET_NOT_FOUND when the parent volume exists, but bucket + * doesn't. + * 3. Other exceptions, e.g. IOException thrown from getBucketTable().get(). */ @Override public OmBucketInfo getBucketInfo(String volumeName, String bucketName) @@ -251,12 +257,14 @@ public OmBucketInfo getBucketInfo(String volumeName, String bucketName) if (value == null) { LOG.debug("bucket: {} not found in volume: {}.", bucketName, volumeName); - // Check volume existence, because we need to throw VOLUME_NOT_FOUND - // if the parent volume doesn't exist. - if (metadataManager.getVolumeTable().get(volumeName) == null) { + // Check parent volume existence + final String dbVolumeKey = metadataManager.getVolumeKey(volumeName); + if (metadataManager.getVolumeTable().get(dbVolumeKey) == null) { + // Parent volume doesn't exist, throw VOLUME_NOT_FOUND throw new OMException("Volume not found when getting bucket info", VOLUME_NOT_FOUND); } else { + // Parent volume exists, throw BUCKET_NOT_FOUND throw new OMException("Bucket not found", BUCKET_NOT_FOUND); } } From 6143a5ee3cda61e19ff43a4b69ca6e9f904c3909 Mon Sep 17 00:00:00 2001 From: Siyao Meng <50227127+smengcl@users.noreply.github.com> Date: Wed, 10 Nov 2021 10:27:02 -0800 Subject: [PATCH 3/8] Add exception checks to testGetBucketInfo. Note: This test class is ignored for now. But if @Ignore is removed, the new check will pass. --- .../ozone/om/TestBucketManagerImpl.java | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestBucketManagerImpl.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestBucketManagerImpl.java index e2cc4ceb72dc..60b971a7cdc7 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestBucketManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestBucketManagerImpl.java @@ -192,23 +192,51 @@ public void testGetBucketInfoForInvalidBucket() throws Exception { @Test public void testGetBucketInfo() throws Exception { + final String volumeName = "sampleVol"; + final String bucketName = "bucketOne"; OmMetadataManagerImpl metaMgr = createSampleVol(); BucketManager bucketManager = new BucketManagerImpl(metaMgr); + // Check exception thrown when volume does not exist + try { + bucketManager.getBucketInfo(volumeName, bucketName); + Assert.fail("Should have thrown OMException"); + } catch (OMException omEx) { + Assert.assertEquals("getBucketInfo() should have thrown " + + "VOLUME_NOT_FOUND as the parent volume is not created!", + ResultCodes.VOLUME_NOT_FOUND, omEx.getResult()); + } OmBucketInfo bucketInfo = OmBucketInfo.newBuilder() - .setVolumeName("sampleVol") - .setBucketName("bucketOne") + .setVolumeName(volumeName) + .setBucketName(bucketName) .setStorageType(StorageType.DISK) .setIsVersionEnabled(false) .build(); + // Note: the helper method createBucket() in this scope won't create the + // parent volume DB entry. In order to verify getBucketInfo's behavior, we + // need to create the volume entry in DB manually. + OmVolumeArgs args = OmVolumeArgs.newBuilder() + .setVolume(volumeName) + .setAdminName("bilbo") + .setOwnerName("bilbo") + .build(); + TestOMRequestUtils.addVolumeToOM(metaMgr, args); + // Create bucket createBucket(metaMgr, bucketInfo); - OmBucketInfo result = bucketManager.getBucketInfo( - "sampleVol", "bucketOne"); - Assert.assertEquals("sampleVol", result.getVolumeName()); - Assert.assertEquals("bucketOne", result.getBucketName()); - Assert.assertEquals(StorageType.DISK, - result.getStorageType()); - Assert.assertEquals(false, result.getIsVersionEnabled()); + // Check exception thrown when bucket does not exist + try { + bucketManager.getBucketInfo(volumeName, "bucketNotExist"); + Assert.fail("Should have thrown OMException"); + } catch (OMException omEx) { + Assert.assertEquals("getBucketInfo() should have thrown " + + "BUCKET_NOT_FOUND as the parent volume exists but bucket " + + "doesn't!", ResultCodes.BUCKET_NOT_FOUND, omEx.getResult()); + } + OmBucketInfo result = bucketManager.getBucketInfo(volumeName, bucketName); + Assert.assertEquals(volumeName, result.getVolumeName()); + Assert.assertEquals(bucketName, result.getBucketName()); + Assert.assertEquals(StorageType.DISK, result.getStorageType()); + Assert.assertFalse(result.getIsVersionEnabled()); metaMgr.getStore().close(); } From a90f1cd8c0a7565c8e9d2e40a478b40fc67e4bab Mon Sep 17 00:00:00 2001 From: Siyao Meng <50227127+smengcl@users.noreply.github.com> Date: Wed, 10 Nov 2021 15:07:42 -0800 Subject: [PATCH 4/8] Add integration test for regular user creating bucket with OFS mkdir. --- .../fs/ozone/TestRootedOzoneFileSystem.java | 78 ++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java index a5c1c8156927..877e6fb90229 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java @@ -71,6 +71,7 @@ import java.io.FileNotFoundException; import java.io.IOException; +import java.security.PrivilegedExceptionAction; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -161,6 +162,12 @@ public static Path getBucketPath() { private static String rootPath; private static BucketLayout bucketLayout; + private static final String USER1 = "regularuser1"; + private static final UserGroupInformation UGI_USER1 = UserGroupInformation + .createUserForTesting(USER1, new String[] {"usergroup"}); + // Non-privileged OFS instance + private static RootedOzoneFileSystem userOfs; + @BeforeClass public static void init() throws Exception { conf = new OzoneConfiguration(); @@ -178,6 +185,11 @@ public static void init() throws Exception { enabledFileSystemPaths); } conf.setBoolean(OzoneConfigKeys.OZONE_ACL_ENABLED, enableAcl); + // Set ACL authorizer class to OzoneNativeAuthorizer. The default + // OzoneAccessAuthorizer always returns true for all ACL checks which + // doesn't work for the test. + conf.set(OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS, + OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS_NATIVE); cluster = MiniOzoneCluster.newBuilder(conf) .setNumDatanodes(3) .build(); @@ -206,6 +218,10 @@ public static void init() throws Exception { trash = new Trash(conf); ofs = (RootedOzoneFileSystem) fs; adapter = (BasicRootedOzoneClientAdapterImpl) ofs.getAdapter(); + + userOfs = UGI_USER1.doAs( + (PrivilegedExceptionAction)() + -> (RootedOzoneFileSystem) FileSystem.get(conf)); } @AfterClass @@ -870,7 +886,7 @@ public void testListStatusRootAndVolumeContinuation() throws IOException { * OFS: Test /tmp mount behavior. */ @Test - public void testTempMount() throws Exception { + public void testTempMount() throws IOException { // Prep // Use ClientProtocol to pass in volume ACL, ObjectStore won't do it ClientProtocol proxy = objectStore.getClientProxy(); @@ -1513,4 +1529,64 @@ public void testRenameDestinationParentDoesntExist() throws Exception { } } + @Test + public void testNonPrivilegedUserMkdirCreateBucket() throws IOException { + // This test is only meaningful when ACL is enabled + if (!enableAcl) { + LOG.info("Skipping this test as ACL is not enabled"); + return; + } + + // This unit test does the correct check. However, the parameterized + // test is not initialized correctly since HDDS-4998 (or HDDS-4040). + + // The cluster is started with enableAcl = false, but across different set + // of test parameters, the OM is not restarted. So OM is actually stuck with + // enableAcl = false. That's why ACL checks are skipped in the tests. + // OM should be restarted when enableAcl is changed. + + // For now, in order to properly run this specific test, on line 147, + // explicitly assign: + // private static boolean enableAcl = true; + // When unset, it defaults to false due to Java primitive defaults. + + // TODO: Fix the parameterized test to properly initialize the cluster. + // When the parameterized test is initialized correctly, the line + // below can be uncommented. +// Assert.assertTrue(cluster.getOzoneManager().getAclsEnabled()); + + final String volume = "volume-for-test-get-bucket"; + // Create a volume as admin + // Create volume "tmp" with world access. allow non-admin to create buckets + ClientProtocol proxy = objectStore.getClientProxy(); + + // Get default acl rights for user + OzoneAclConfig aclConfig = conf.getObject(OzoneAclConfig.class); + ACLType userRights = aclConfig.getUserDefaultRights(); + // Construct ACL for world access + OzoneAcl aclWorldAccess = new OzoneAcl(ACLIdentityType.WORLD, "", + userRights, ACCESS); + // Construct VolumeArgs, set ACL to world access + VolumeArgs volumeArgs = new VolumeArgs.Builder() + .setAcls(Collections.singletonList(aclWorldAccess)) + .build(); + proxy.createVolume(volume, volumeArgs); + + // Create a bucket as non-admin, should succeed + final String bucket = "test-bucket-1"; + try { + final Path myBucketPath = new Path(volume, bucket); + // Have to prepend the root to bucket path here. + // Otherwise, FS will automatically prepend user home directory path + // which is not we want here. + Assert.assertTrue(userOfs.mkdirs(new Path("/", myBucketPath))); + } catch (IOException e) { + Assert.fail("Should not have thrown exception when creating bucket as" + + " a regular user here"); + } + + // Clean up + proxy.deleteBucket(volume, bucket); + proxy.deleteVolume(volume); + } } From 4147df14bb940b4de0e2eb656e50653028920af8 Mon Sep 17 00:00:00 2001 From: Siyao Meng <50227127+smengcl@users.noreply.github.com> Date: Wed, 10 Nov 2021 16:40:23 -0800 Subject: [PATCH 5/8] Improve info message. --- .../apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java index 877e6fb90229..5ffa6b8f1557 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java @@ -195,7 +195,7 @@ public static void init() throws Exception { .build(); cluster.waitForClusterToBeReady(); objectStore = cluster.getClient().getObjectStore(); - + // create a volume and a bucket to be used by RootedOzoneFileSystem (OFS) OzoneBucket bucket = TestDataUtil.createVolumeAndBucket(cluster, bucketLayout); @@ -1533,7 +1533,8 @@ public void testRenameDestinationParentDoesntExist() throws Exception { public void testNonPrivilegedUserMkdirCreateBucket() throws IOException { // This test is only meaningful when ACL is enabled if (!enableAcl) { - LOG.info("Skipping this test as ACL is not enabled"); + LOG.info("ACL is not enabled. Skipping this test as it requires ACL to " + + " be enabled to be meaningful."); return; } From e502c3493f9c3f1ffc226a9c06c1c2232f6e349d Mon Sep 17 00:00:00 2001 From: Siyao Meng <50227127+smengcl@users.noreply.github.com> Date: Sat, 13 Nov 2021 17:03:50 -0800 Subject: [PATCH 6/8] Enable TestBucketManagerImpl class but ignore all failing tests. --- .../apache/hadoop/ozone/om/TestBucketManagerImpl.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestBucketManagerImpl.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestBucketManagerImpl.java index 60b971a7cdc7..ae263b6c3bd9 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestBucketManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestBucketManagerImpl.java @@ -45,7 +45,6 @@ * Tests BucketManagerImpl, mocks OMMetadataManager for testing. */ @RunWith(MockitoJUnitRunner.class) -@Ignore("Bucket Manager does not use cache, Disable it for now.") public class TestBucketManagerImpl { @Rule public ExpectedException thrown = ExpectedException.none(); @@ -102,6 +101,7 @@ public void testCreateBucketWithoutVolume() throws Exception { } @Test + @Ignore("Bucket Manager does not use cache, Disable it for now.") public void testCreateBucket() throws Exception { OmMetadataManagerImpl metaMgr = createSampleVol(); @@ -136,6 +136,7 @@ public void testCreateBucket() throws Exception { @Test + @Ignore("Bucket Manager does not use cache, Disable it for now.") public void testCreateEncryptedBucket() throws Exception { OmMetadataManagerImpl metaMgr = createSampleVol(); @@ -151,6 +152,7 @@ public void testCreateEncryptedBucket() throws Exception { } @Test + @Ignore("Bucket Manager does not use cache, Disable it for now.") public void testCreateAlreadyExistingBucket() throws Exception { thrown.expectMessage("Bucket already exist"); OmMetadataManagerImpl metaMgr = createSampleVol(); @@ -173,6 +175,7 @@ public void testCreateAlreadyExistingBucket() throws Exception { } @Test + @Ignore("Bucket Manager does not use cache, Disable it for now.") public void testGetBucketInfoForInvalidBucket() throws Exception { thrown.expectMessage("Bucket not found"); OmMetadataManagerImpl metaMgr = createSampleVol(); @@ -246,6 +249,7 @@ private void createBucket(OMMetadataManager metadataManager, } @Test + @Ignore("Bucket Manager does not use cache, Disable it for now.") public void testSetBucketPropertyChangeStorageType() throws Exception { OmMetadataManagerImpl metaMgr = createSampleVol(); @@ -274,6 +278,7 @@ public void testSetBucketPropertyChangeStorageType() throws Exception { } @Test + @Ignore("Bucket Manager does not use cache, Disable it for now.") public void testSetBucketPropertyChangeVersioning() throws Exception { OmMetadataManagerImpl metaMgr = createSampleVol(); @@ -300,6 +305,7 @@ public void testSetBucketPropertyChangeVersioning() throws Exception { } @Test + @Ignore("Bucket Manager does not use cache, Disable it for now.") public void testDeleteBucket() throws Exception { thrown.expectMessage("Bucket not found"); OmMetadataManagerImpl metaMgr = createSampleVol(); @@ -334,6 +340,7 @@ public void testDeleteBucket() throws Exception { } @Test + @Ignore("Bucket Manager does not use cache, Disable it for now.") public void testDeleteNonEmptyBucket() throws Exception { thrown.expectMessage("Bucket is not empty"); OmMetadataManagerImpl metaMgr = createSampleVol(); From 97fad54b460b51c6c8d376a77c32aa04823aa020 Mon Sep 17 00:00:00 2001 From: Siyao Meng <50227127+smengcl@users.noreply.github.com> Date: Sat, 13 Nov 2021 17:06:47 -0800 Subject: [PATCH 7/8] Use Assume.assumeTrue --- .../hadoop/fs/ozone/TestRootedOzoneFileSystem.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java index 5ffa6b8f1557..329870f15630 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java @@ -38,12 +38,12 @@ import org.apache.hadoop.ozone.OzoneConfigKeys; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.TestDataUtil; +import org.apache.hadoop.ozone.client.BucketArgs; import org.apache.hadoop.ozone.client.ObjectStore; import org.apache.hadoop.ozone.client.OzoneBucket; import org.apache.hadoop.ozone.client.OzoneKeyDetails; import org.apache.hadoop.ozone.client.OzoneVolume; import org.apache.hadoop.ozone.client.VolumeArgs; -import org.apache.hadoop.ozone.client.BucketArgs; import org.apache.hadoop.ozone.client.protocol.ClientProtocol; import org.apache.hadoop.ozone.om.OMConfigKeys; import org.apache.hadoop.ozone.om.OMMetrics; @@ -59,6 +59,7 @@ import org.apache.ozone.test.LambdaTestUtils; import org.junit.AfterClass; import org.junit.Assert; +import org.junit.Assume; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Rule; @@ -1532,11 +1533,8 @@ public void testRenameDestinationParentDoesntExist() throws Exception { @Test public void testNonPrivilegedUserMkdirCreateBucket() throws IOException { // This test is only meaningful when ACL is enabled - if (!enableAcl) { - LOG.info("ACL is not enabled. Skipping this test as it requires ACL to " + - " be enabled to be meaningful."); - return; - } + Assume.assumeTrue("ACL is not enabled. Skipping this test as it requires " + + "ACL to be enabled to be meaningful.", enableAcl); // This unit test does the correct check. However, the parameterized // test is not initialized correctly since HDDS-4998 (or HDDS-4040). From 811fcffee3cc0075e7fa437eb83aa26bbf443d01 Mon Sep 17 00:00:00 2001 From: Siyao Meng <50227127+smengcl@users.noreply.github.com> Date: Mon, 15 Nov 2021 11:10:29 -0800 Subject: [PATCH 8/8] Retrigger CI Change-Id: Ic38e582cc96c859087b98baad2467af37ba7bdbe