You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by ra...@apache.org on 2021/11/24 09:34:36 UTC

[ozone] branch master updated: [FSO] Allow existing/old buckets with any layout during OM startup (#2571)

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

rakeshr 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 bc6029e  [FSO] Allow existing/old buckets with any layout during OM startup (#2571)
bc6029e is described below

commit bc6029eeda12029565293047ede1723dc13c1635
Author: zhengchenyu <zh...@gmail.com>
AuthorDate: Wed Nov 24 17:34:10 2021 +0800

    [FSO] Allow existing/old buckets with any layout during OM startup (#2571)
---
 .../ozone/om/TestOMStartupWithBucketLayout.java    | 161 +++++++++++++++++++++
 .../org/apache/hadoop/ozone/om/OzoneManager.java   |  69 ---------
 2 files changed, 161 insertions(+), 69 deletions(-)

diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMStartupWithBucketLayout.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMStartupWithBucketLayout.java
new file mode 100644
index 0000000..e431760
--- /dev/null
+++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMStartupWithBucketLayout.java
@@ -0,0 +1,161 @@
+/**
+ * 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.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.ozone.MiniOzoneCluster;
+import org.apache.hadoop.ozone.TestDataUtil;
+import org.apache.hadoop.ozone.client.OzoneBucket;
+import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.Timeout;
+
+import java.util.UUID;
+
+/**
+ * Verifies OM startup with different layout.
+ */
+public class TestOMStartupWithBucketLayout {
+
+  /**
+   * Set a timeout for each test.
+   */
+  @Rule
+  public Timeout timeout = Timeout.seconds(300);
+
+  private static MiniOzoneCluster cluster;
+
+  public static void startCluster(OzoneConfiguration conf)
+      throws Exception {
+    String clusterId = UUID.randomUUID().toString();
+    String scmId = UUID.randomUUID().toString();
+    String omId = UUID.randomUUID().toString();
+    cluster = MiniOzoneCluster.newBuilder(conf).setClusterId(clusterId)
+        .setScmId(scmId).setOmId(omId).withoutDatanodes().build();
+    cluster.waitForClusterToBeReady();
+  }
+
+  public static void restartCluster()
+      throws Exception {
+    // restart om
+    cluster.stop();
+    cluster.getOzoneManager().restart();
+  }
+
+  public static void teardown() {
+    if (cluster != null) {
+      cluster.shutdown();
+    }
+  }
+
+  @Test
+  public void testRestartWithFSOLayout() throws Exception {
+    try {
+      // 1. build cluster with default bucket layout FSO
+      OzoneConfiguration conf = new OzoneConfiguration();
+      conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
+          BucketLayout.FILE_SYSTEM_OPTIMIZED.name());
+      startCluster(conf);
+
+      // 2. create bucket with FSO bucket layout and verify
+      OzoneBucket bucket1 = TestDataUtil.createVolumeAndBucket(cluster,
+          BucketLayout.FILE_SYSTEM_OPTIMIZED);
+      verifyBucketLayout(bucket1, BucketLayout.FILE_SYSTEM_OPTIMIZED);
+
+      // 3. verify OM default behavior with LEGACY
+      restartCluster();
+      OzoneBucket bucket2 = TestDataUtil.createVolumeAndBucket(cluster,
+          BucketLayout.LEGACY);
+      verifyBucketLayout(bucket2, BucketLayout.FILE_SYSTEM_OPTIMIZED);
+
+      // 4. create bucket with OBS bucket layout and verify
+      restartCluster();
+      OzoneBucket bucket3 = TestDataUtil.createVolumeAndBucket(cluster,
+          BucketLayout.OBJECT_STORE);
+      verifyBucketLayout(bucket3, BucketLayout.OBJECT_STORE);
+
+      // 5. verify all bucket
+      restartCluster();
+      verifyBucketLayout(bucket1, BucketLayout.FILE_SYSTEM_OPTIMIZED);
+      verifyBucketLayout(bucket2, BucketLayout.FILE_SYSTEM_OPTIMIZED);
+      verifyBucketLayout(bucket3, BucketLayout.OBJECT_STORE);
+
+      // 6. verify after update default bucket layout
+      conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
+          BucketLayout.OBJECT_STORE.name());
+      restartCluster();
+      verifyBucketLayout(bucket1, BucketLayout.FILE_SYSTEM_OPTIMIZED);
+      verifyBucketLayout(bucket2, BucketLayout.FILE_SYSTEM_OPTIMIZED);
+      verifyBucketLayout(bucket3, BucketLayout.OBJECT_STORE);
+    } finally {
+      teardown();
+    }
+  }
+
+  @Test
+  public void testRestartWithOBSLayout() throws Exception {
+    try {
+      // 1. build cluster with default bucket layout OBS
+      OzoneConfiguration conf = new OzoneConfiguration();
+      conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
+          BucketLayout.OBJECT_STORE.name());
+      startCluster(conf);
+
+      // 2. create bucket with FSO bucket layout and verify
+      OzoneBucket bucket1 = TestDataUtil.createVolumeAndBucket(cluster,
+          BucketLayout.FILE_SYSTEM_OPTIMIZED);
+      verifyBucketLayout(bucket1, BucketLayout.FILE_SYSTEM_OPTIMIZED);
+
+      // 3. verify OM default behavior with LEGACY
+      restartCluster();
+      OzoneBucket bucket2 = TestDataUtil.createVolumeAndBucket(cluster,
+          BucketLayout.LEGACY);
+      verifyBucketLayout(bucket2, BucketLayout.OBJECT_STORE);
+
+      // 4. create bucket with OBS bucket layout and verify
+      restartCluster();
+      OzoneBucket bucket3 = TestDataUtil.createVolumeAndBucket(cluster,
+          BucketLayout.OBJECT_STORE);
+      verifyBucketLayout(bucket3, BucketLayout.OBJECT_STORE);
+
+      // 5. verify all bucket
+      restartCluster();
+      verifyBucketLayout(bucket1, BucketLayout.FILE_SYSTEM_OPTIMIZED);
+      verifyBucketLayout(bucket2, BucketLayout.OBJECT_STORE);
+      verifyBucketLayout(bucket3, BucketLayout.OBJECT_STORE);
+
+      // 6. verify after update default bucket layout
+      conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
+          BucketLayout.FILE_SYSTEM_OPTIMIZED.name());
+      restartCluster();
+      verifyBucketLayout(bucket1, BucketLayout.FILE_SYSTEM_OPTIMIZED);
+      verifyBucketLayout(bucket2, BucketLayout.OBJECT_STORE);
+      verifyBucketLayout(bucket3, BucketLayout.OBJECT_STORE);
+    } finally {
+      teardown();
+    }
+  }
+
+  private void verifyBucketLayout(OzoneBucket bucket,
+      BucketLayout metadataLayout) {
+    Assert.assertNotNull(bucket);
+    Assert.assertEquals(metadataLayout, bucket.getBucketLayout());
+  }
+
+}
\ No newline at end of file
diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index 77bec6e..8ed1bc3 100644
--- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -85,8 +85,6 @@ import org.apache.hadoop.hdds.utils.db.BatchOperation;
 import org.apache.hadoop.hdds.utils.db.DBCheckpoint;
 import org.apache.hadoop.hdds.utils.db.DBUpdatesWrapper;
 import org.apache.hadoop.hdds.utils.db.SequenceNumberNotFoundException;
-import org.apache.hadoop.hdds.utils.db.Table;
-import org.apache.hadoop.hdds.utils.db.TableIterator;
 import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
 import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
 import org.apache.hadoop.io.Text;
@@ -1369,8 +1367,6 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
 
     metadataManager.start(configuration);
 
-    validatesBucketLayoutMismatches();
-
     // Start Ratis services
     if (omRatisServer != null) {
       omRatisServer.start();
@@ -1460,8 +1456,6 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
 
     instantiateServices(false);
 
-    validatesBucketLayoutMismatches();
-
     startSecretManagerIfNecessary();
 
     // Set metrics and start metrics back ground thread
@@ -3788,74 +3782,11 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
     boolean omMetadataLayoutPrefix = StringUtils.equalsIgnoreCase(metaLayout,
         OZONE_OM_METADATA_LAYOUT_PREFIX);
 
-    boolean omMetadataLayoutSimple = StringUtils.equalsIgnoreCase(metaLayout,
-        OZONE_OM_METADATA_LAYOUT_DEFAULT);
-
-    if (!(omMetadataLayoutPrefix || omMetadataLayoutSimple)) {
-      StringBuilder msg = new StringBuilder();
-      msg.append("Invalid Configuration. Failed to start OM in ");
-      msg.append(metaLayout);
-      msg.append(" layout format. Supported values are either ");
-      msg.append(OZONE_OM_METADATA_LAYOUT_DEFAULT);
-      msg.append(" or ");
-      msg.append(OZONE_OM_METADATA_LAYOUT_PREFIX);
-
-      LOG.error(msg.toString());
-      throw new IllegalArgumentException(msg.toString());
-    }
-
-    if (omMetadataLayoutPrefix && !getEnableFileSystemPaths()) {
-      StringBuilder msg = new StringBuilder();
-      msg.append("Invalid Configuration. Failed to start OM in ");
-      msg.append(OZONE_OM_METADATA_LAYOUT_PREFIX);
-      msg.append(" layout format as '");
-      msg.append(OZONE_OM_ENABLE_FILESYSTEM_PATHS);
-      msg.append("' is false!");
-
-      LOG.error(msg.toString());
-      throw new IllegalArgumentException(msg.toString());
-    }
-
     String status = omMetadataLayoutPrefix ? "enabled" : "disabled";
     LOG.info("Configured {}={} and {} optimized OM FS operations",
         OZONE_OM_METADATA_LAYOUT, metaLayout, status);
   }
 
-  private void validatesBucketLayoutMismatches() throws IOException {
-    String clusterLevelMetaLayout = getOMMetadataLayout();
-
-    TableIterator<String, ? extends Table.KeyValue<String, OmBucketInfo>>
-        iterator = metadataManager.getBucketTable().iterator();
-
-    while (iterator.hasNext()) {
-      Map<String, String> bucketMeta = iterator.next().getValue().getMetadata();
-      verifyBucketMetaLayout(clusterLevelMetaLayout, bucketMeta);
-    }
-  }
-
-  private void verifyBucketMetaLayout(String clusterLevelMetaLayout,
-      Map<String, String> bucketMetadata) throws IOException {
-    String bucketMetaLayout = bucketMetadata.get(OZONE_OM_METADATA_LAYOUT);
-    if (StringUtils.isBlank(bucketMetaLayout)) {
-      // Defaulting to SIMPLE
-      bucketMetaLayout = OZONE_OM_METADATA_LAYOUT_DEFAULT;
-    }
-    boolean supportedMetadataLayout =
-        StringUtils.equalsIgnoreCase(clusterLevelMetaLayout, bucketMetaLayout);
-
-    if (!supportedMetadataLayout) {
-      StringBuilder msg = new StringBuilder();
-      msg.append("Failed to start OM in ");
-      msg.append(clusterLevelMetaLayout);
-      msg.append(" layout format as existing bucket has a different layout ");
-      msg.append(bucketMetaLayout);
-      msg.append(" metadata format");
-
-      LOG.error(msg.toString());
-      throw new IOException(msg.toString());
-    }
-  }
-
   private BucketLayout getBucketLayout() {
     return BucketLayout.DEFAULT;
   }

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org