This is an automated email from the ASF dual-hosted git repository.
msingh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 35c9ba0ec4 HDDS-6838. [FSO] Sets OM default to LEGACY for an older
client's bucket create request (#3487)
35c9ba0ec4 is described below
commit 35c9ba0ec4ab70bba583f7cf6c934ea8d2b5ae1a
Author: Rakesh Radhakrishnan <[email protected]>
AuthorDate: Wed Jun 8 07:35:12 2022 +0530
HDDS-6838. [FSO] Sets OM default to LEGACY for an older client's bucket
create request (#3487)
---
.../ozone/om/TestBucketLayoutWithOlderClient.java | 126 +++++++++++++++++++++
.../om/request/bucket/OMBucketCreateRequest.java | 46 ++++++--
2 files changed, 163 insertions(+), 9 deletions(-)
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestBucketLayoutWithOlderClient.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestBucketLayoutWithOlderClient.java
new file mode 100644
index 0000000000..4c7a33e81e
--- /dev/null
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestBucketLayoutWithOlderClient.java
@@ -0,0 +1,126 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
under
+ * the License.
+ */
+package org.apache.hadoop.ozone.om;
+
+import org.apache.hadoop.ozone.MiniOzoneCluster;
+import org.apache.hadoop.ozone.ClientVersion;
+import org.apache.hadoop.ozone.TestDataUtil;
+import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.ozone.client.OzoneBucket;
+import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
+import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
+import org.junit.Assert;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.Timeout;
+
+import java.io.IOException;
+import java.util.UUID;
+
+/**
+ * Tests to verify bucket ops with older version client.
+ */
+public class TestBucketLayoutWithOlderClient {
+
+ private static MiniOzoneCluster cluster = null;
+ private static OzoneConfiguration conf;
+ private static String clusterId;
+ private static String scmId;
+ private static String omId;
+
+ @Rule
+ public Timeout timeout = new Timeout(1200000);
+
+ /**
+ * Create a MiniDFSCluster for testing.
+ * <p>
+ *
+ * @throws IOException
+ */
+ @BeforeClass
+ public static void init() throws Exception {
+ conf = new OzoneConfiguration();
+ clusterId = UUID.randomUUID().toString();
+ scmId = UUID.randomUUID().toString();
+ omId = UUID.randomUUID().toString();
+ conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
+ BucketLayout.OBJECT_STORE.name());
+ cluster = MiniOzoneCluster.newBuilder(conf).setClusterId(clusterId)
+ .setScmId(scmId).setOmId(omId).build();
+ cluster.waitForClusterToBeReady();
+ }
+
+ @Test
+ public void testCreateBucketWithOlderClient() throws Exception {
+ // create a volume and a bucket without bucket layout argument
+ OzoneBucket bucket = TestDataUtil.createVolumeAndBucket(cluster, null);
+ String volumeName = bucket.getVolumeName();
+ // OM defaulted bucket layout
+ Assert.assertEquals(BucketLayout.OBJECT_STORE, bucket.getBucketLayout());
+
+ // Sets bucket layout explicitly.
+ OzoneBucket fsobucket = TestDataUtil
+ .createVolumeAndBucket(cluster, BucketLayout.FILE_SYSTEM_OPTIMIZED);
+ Assert.assertEquals(BucketLayout.FILE_SYSTEM_OPTIMIZED,
+ fsobucket.getBucketLayout());
+
+ // Create bucket request by an older client.
+ // Here sets ClientVersion.DEFAULT_VERSION
+ String buckName = "buck-1-legacy-" + UUID.randomUUID();
+ OzoneManager.setTestSecureOmFlag(true);
+ OzoneManagerProtocolProtos.OMRequest createBucketReq =
+ OzoneManagerProtocolProtos.OMRequest
+ .newBuilder()
+ .setCmdType(OzoneManagerProtocolProtos.Type.CreateBucket)
+ .setVersion(ClientVersion.DEFAULT_VERSION.toProtoValue())
+ .setClientId(UUID.randomUUID().toString())
+ .setCreateBucketRequest(
+ OzoneManagerProtocolProtos.CreateBucketRequest.newBuilder()
+ .setBucketInfo(
+ OzoneManagerProtocolProtos.BucketInfo.newBuilder()
+ .setVolumeName(volumeName).setBucketName(buckName)
+ .setIsVersionEnabled(false).setStorageType(
+ OzoneManagerProtocolProtos.StorageTypeProto.DISK)
+ .build())
+ .build()).build();
+
+ OzoneManagerProtocolProtos.OMResponse
+ omResponse = cluster.getOzoneManager().getOmServerProtocol()
+ .submitRequest(null, createBucketReq);
+
+ Assert.assertEquals(omResponse.getStatus(),
+ OzoneManagerProtocolProtos.Status.OK);
+
+ OmBucketInfo bucketInfo =
+ cluster.getOzoneManager().getBucketInfo(volumeName, buckName);
+ Assert.assertNotNull(bucketInfo);
+ Assert.assertEquals(BucketLayout.LEGACY, bucketInfo.getBucketLayout());
+ }
+
+ /**
+ * Shutdown MiniDFSCluster.
+ */
+ @AfterClass
+ public static void shutdown() {
+ if (cluster != null) {
+ cluster.shutdown();
+ }
+ }
+}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java
index 320957ad95..88bfda3e59 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java
@@ -25,6 +25,7 @@ import
org.apache.hadoop.crypto.key.KeyProviderCryptoExtension;
import org.apache.hadoop.fs.CommonConfigurationKeys;
import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
+import org.apache.hadoop.ozone.ClientVersion;
import org.apache.hadoop.ozone.OmUtils;
import org.apache.hadoop.ozone.OzoneAcl;
import org.apache.hadoop.ozone.OzoneConsts;
@@ -154,16 +155,14 @@ public class OMBucketCreateRequest extends
OMClientRequest {
// bucketInfo.hasBucketLayout() would be true when user sets bucket layout.
// Now, OM will create bucket with the user specified bucket layout.
- // When the value is not specified by the user, OM will use the
- // "ozone.default.bucket.layout" configured value.
+ // When the value is not specified by the user, OM will use
+ // "ozone.default.bucket.layout" configured value for the newer ozone
+ // client and LEGACY for an older ozone client.
if (!bucketInfo.hasBucketLayout()) {
- // Bucket Layout argument was not passed during bucket creation.
- String omDefaultBucketLayout = ozoneManager.getOMDefaultBucketLayout();
- BucketLayout defaultType =
BucketLayout.fromString(omDefaultBucketLayout);
- omBucketInfo = OmBucketInfo.getFromProtobuf(bucketInfo, defaultType);
- LOG.debug("Bucket Layout not present for volume/bucket = {}/{}, "
- + "initialising with default bucket layout" + ": {}", volumeName,
- bucketName, omDefaultBucketLayout);
+ BucketLayout defaultBucketLayout =
+ getDefaultBucketLayout(ozoneManager, volumeName, bucketName);
+ omBucketInfo =
+ OmBucketInfo.getFromProtobuf(bucketInfo, defaultBucketLayout);
} else {
omBucketInfo = OmBucketInfo.getFromProtobuf(bucketInfo);
}
@@ -270,6 +269,35 @@ public class OMBucketCreateRequest extends OMClientRequest
{
}
}
+ private BucketLayout getDefaultBucketLayout(OzoneManager ozoneManager,
+ String volumeName, String bucketName) {
+
+ if (getOmRequest().getVersion() <
+ ClientVersion.BUCKET_LAYOUT_SUPPORT.toProtoValue()) {
+
+ // Older client will default bucket layout to LEGACY to
+ // make its operations backward compatible.
+ LOG.info("Bucket Layout not present for volume/bucket = {}/{}, "
+ + "initialising with default bucket layout" +
+ ": {} as client is an older version: {}", volumeName,
+ bucketName, BucketLayout.LEGACY, getOmRequest().getVersion());
+ return BucketLayout.LEGACY;
+ } else {
+ // Newer client will default to the configured value.
+ String omDefaultBucketLayout = ozoneManager.getOMDefaultBucketLayout();
+ BucketLayout defaultBuckLayout =
+ BucketLayout.fromString(omDefaultBucketLayout);
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Bucket Layout not present for volume/bucket = {}/{}, "
+ + "initialising with default bucket layout" + ": {}",
+ volumeName, bucketName, omDefaultBucketLayout);
+ }
+
+ return defaultBuckLayout;
+ }
+ }
+
/**
* Add default acls for bucket. These acls are inherited from volume
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]