This is an automated email from the ASF dual-hosted git repository.
avijayan pushed a commit to branch HDDS-3698-upgrade
in repository https://gitbox.apache.org/repos/asf/hadoop-ozone.git
The following commit(s) were added to refs/heads/HDDS-3698-upgrade by this push:
new 86c4c9b HDDS-4143. Implement a factory for OM Requests that returns
an instance based on layout version. (#1405)
86c4c9b is described below
commit 86c4c9b628e266706f80aedc09ed520723cf283c
Author: avijayanhwx <[email protected]>
AuthorDate: Tue Sep 15 10:40:24 2020 -0700
HDDS-4143. Implement a factory for OM Requests that returns an instance
based on layout version. (#1405)
---
.../upgrade/LayoutVersionInstanceFactory.java | 247 +++++++++++++++++++++
.../hadoop/ozone/upgrade/VersionFactoryKey.java | 70 ++++++
.../upgrade/TestLayoutVersionInstanceFactory.java | 191 ++++++++++++++++
.../src/main/proto/OmClientProtocol.proto | 5 +
hadoop-ozone/ozone-manager/pom.xml | 1 -
.../org/apache/hadoop/ozone/om/OzoneManager.java | 11 +-
.../om/ratis/utils/OzoneManagerRatisUtils.java | 186 ++++++----------
.../hadoop/ozone/om/request/OMClientRequest.java | 8 +-
.../om/request/bucket/OMBucketCreateRequest.java | 5 +
.../om/request/bucket/OMBucketDeleteRequest.java | 5 +
.../request/bucket/OMBucketSetPropertyRequest.java | 5 +
.../request/bucket/acl/OMBucketAddAclRequest.java | 6 +
.../bucket/acl/OMBucketRemoveAclRequest.java | 7 +
.../request/bucket/acl/OMBucketSetAclRequest.java | 7 +
.../om/request/file/OMDirectoryCreateRequest.java | 5 +
.../ozone/om/request/file/OMFileCreateRequest.java | 11 +-
.../om/request/key/OMAllocateBlockRequest.java | 5 +
.../ozone/om/request/key/OMECKeyCreateRequest.java | 54 +++++
.../ozone/om/request/key/OMKeyCommitRequest.java | 5 +
.../ozone/om/request/key/OMKeyCreateRequest.java | 4 +
.../ozone/om/request/key/OMKeyDeleteRequest.java | 5 +
.../ozone/om/request/key/OMKeyPurgeRequest.java | 6 +
.../ozone/om/request/key/OMKeyRenameRequest.java | 5 +
.../ozone/om/request/key/OMKeysDeleteRequest.java | 5 +
.../ozone/om/request/key/OMKeysRenameRequest.java | 5 +
.../om/request/key/OMTrashRecoverRequest.java | 4 +
.../om/request/key/acl/OMKeyAddAclRequest.java | 7 +
.../om/request/key/acl/OMKeyRemoveAclRequest.java | 7 +
.../om/request/key/acl/OMKeySetAclRequest.java | 7 +
.../key/acl/prefix/OMPrefixAddAclRequest.java | 7 +
.../key/acl/prefix/OMPrefixRemoveAclRequest.java | 7 +
.../key/acl/prefix/OMPrefixSetAclRequest.java | 7 +
.../S3InitiateMultipartUploadRequest.java | 5 +
.../multipart/S3MultipartUploadAbortRequest.java | 5 +
.../S3MultipartUploadCommitPartRequest.java | 4 +
.../S3MultipartUploadCompleteRequest.java | 6 +
.../om/request/s3/security/S3GetSecretRequest.java | 5 +
.../security/OMCancelDelegationTokenRequest.java | 7 +-
.../security/OMGetDelegationTokenRequest.java | 7 +-
.../security/OMRenewDelegationTokenRequest.java | 6 +
.../upgrade/OMFinalizeUpgradeProgressRequest.java | 6 +
.../request/upgrade/OMFinalizeUpgradeRequest.java | 9 +-
.../om/request/volume/OMVolumeCreateRequest.java | 5 +
.../om/request/volume/OMVolumeDeleteRequest.java | 6 +
.../om/request/volume/OMVolumeSetOwnerRequest.java | 5 +
.../om/request/volume/OMVolumeSetQuotaRequest.java | 5 +-
.../request/volume/acl/OMVolumeAddAclRequest.java | 7 +
.../volume/acl/OMVolumeRemoveAclRequest.java | 7 +
.../request/volume/acl/OMVolumeSetAclRequest.java | 7 +
...FeatureAPI.java => BelongsToLayoutVersion.java} | 14 +-
...eAPI.java => DisallowedUntilLayoutVersion.java} | 8 +-
.../hadoop/ozone/om/upgrade/OMLayoutFeature.java | 63 ++++++
.../ozone/om/upgrade/OMLayoutFeatureAspect.java | 20 +-
.../ozone/om/upgrade/OMLayoutFeatureCatalog.java | 93 --------
...outFeatureAPI.java => OMLayoutFeatureUtil.java} | 36 ++-
.../ozone/om/upgrade/OMLayoutVersionManager.java | 92 --------
.../om/upgrade/OMLayoutVersionManagerImpl.java | 177 +++++++++++++++
...FeatureAPI.java => OmLayoutVersionManager.java} | 16 +-
...OzoneManagerProtocolServerSideTranslatorPB.java | 9 +-
.../protocolPB/OzoneManagerRequestHandler.java | 12 +-
.../ozone/om/request/bucket/TestBucketRequest.java | 5 +
.../ozone/om/request/key/TestOMKeyRequest.java | 5 +
.../om/request/volume/TestOMVolumeRequest.java | 9 +-
.../om/upgrade/TestOMLayoutFeatureAspect.java | 4 +-
.../ozone/om/upgrade/TestOMVersionManager.java | 49 +++-
.../TestOmVersionManagerRequestFactory.java | 122 ++++++++++
hadoop-ozone/s3gateway/pom.xml | 5 +
67 files changed, 1378 insertions(+), 373 deletions(-)
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/LayoutVersionInstanceFactory.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/LayoutVersionInstanceFactory.java
new file mode 100644
index 0000000..96463e0
--- /dev/null
+++
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/LayoutVersionInstanceFactory.java
@@ -0,0 +1,247 @@
+/**
+ * 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.upgrade;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.stream.Collectors.toList;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.PriorityQueue;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+
+/**
+ * Generic factory which stores different instances of Type 'T' sharded by
+ * a key & version. A single key can be associated with different versions
+ * of 'T'.
+ *
+ * Why does this class exist?
+ * A typical use case during upgrade is to have multiple versions of a class
+ * / method / object and chose them based on current layout
+ * version at runtime. Before finalizing, an older version is typically
+ * needed, and after finalize, a newer version is needed. This class serves
+ * this purpose in a generic way.
+ *
+ * For example, we can create a Factory to create multiple versions of
+ * OMRequests sharded by Request Type & Layout Version Supported.
+ */
+public class LayoutVersionInstanceFactory<T> {
+
+ private static final Logger LOG =
+ LoggerFactory.getLogger(LayoutVersionInstanceFactory.class);
+
+ /**
+ * The factory will maintain ALL instances > MLV and 1 instance <= MLV in a
+ * priority queue (ordered by version). By doing that it guarantees O(1)
+ * lookup at all times, since we always would lookup the first element (top
+ * of the PQ).
+ * Multiple entries will be there ONLY during pre-finalized state.
+ * On finalization, we will be removing the entry one by one until we reach
+ * a single entry. On a regular component instance (finalized), there will
+ * be a single request version associated with a request always.
+ */
+ private final Map<String, PriorityQueue<VersionedInstance<T>>> instances =
+ new HashMap<>();
+
+ /**
+ * Register an instance with a given factory key (key + version).
+ * For safety reasons we dont allow (1) re-registering, (2) registering an
+ * instance with version > SLV.
+ *
+ * @param lvm LayoutVersionManager
+ * @param key VersionFactoryKey key to associate with instance.
+ * @param instance instance to register.
+ */
+ public boolean register(LayoutVersionManager lvm, VersionFactoryKey key,
+ T instance) {
+ // If version is not passed in, go defensive and set the highest possible
+ // version (SLV).
+ int version = key.getVersion() == null ?
+ lvm.getSoftwareLayoutVersion() : key.getVersion();
+
+ checkArgument(lvm.getSoftwareLayoutVersion() >= key.getVersion(),
+ String.format("Cannot register key %s since the version is greater " +
+ "than the Software layout version %d",
+ key, lvm.getSoftwareLayoutVersion()));
+
+ // If we reach here, we know that the passed in version belongs to
+ // [0, SLV].
+ String primaryKey = key.getKey();
+ instances.computeIfAbsent(primaryKey, s ->
+ new PriorityQueue<>(Comparator.comparingInt(o -> o.version)));
+
+ PriorityQueue<VersionedInstance<T>> versionedInstances =
+ instances.get(primaryKey);
+ Optional<VersionedInstance<T>> existingInstance =
+ versionedInstances.parallelStream()
+ .filter(v -> v.version == key.getVersion()).findAny();
+
+ if (existingInstance.isPresent()) {
+ throw new IllegalArgumentException(String.format("Cannot register key " +
+ "%s since there is an existing entry already.", key));
+ }
+
+ if (!versionedInstances.isEmpty() && isValid(lvm, version)) {
+ VersionedInstance<T> currentPeek = versionedInstances.peek();
+ if (currentPeek.version < version) {
+ // Current peek < passed in version (and <= MLV). Hence, we can
+ // remove it, since the passed in a better candidate.
+ versionedInstances.poll();
+ // Add the passed in instance.
+ versionedInstances.offer(new VersionedInstance<>(version, instance));
+ return true;
+ } else if (currentPeek.version > lvm.getMetadataLayoutVersion()) {
+ // Current peak is > MLV, hence we don't need to remove that. Just
+ // add passed in instance.
+ versionedInstances.offer(new VersionedInstance<>(version, instance));
+ return true;
+ } else {
+ // Current peek <= MLV and > passed in version, and hence a better
+ // canidate. Retaining the peek, and ignoring the passed in instance.
+ return false;
+ }
+ } else {
+ // Passed in instance version > MLV (or the first version to be
+ // registered), hence can be registered.
+ versionedInstances.offer(new VersionedInstance<>(version, instance));
+ return true;
+ }
+ }
+
+ private boolean isValid(LayoutVersionManager lvm, int version) {
+ return version <= lvm.getMetadataLayoutVersion();
+ }
+
+ /**
+ * From the list of versioned instances for a given "key", this
+ * returns the "floor" value corresponding to the given version.
+ * For example, if we have key = "CreateKey", entry -> [(1, CreateKeyV1),
+ * (3, CreateKeyV2), and if the passed in key = CreateKey & version = 2, we
+ * return CreateKeyV1.
+ * Since this is a priority queue based implementation, we use a O(1) peek()
+ * lookup to get the current valid version.
+ * @param lvm LayoutVersionManager
+ * @param key Key and Version.
+ * @return instance.
+ */
+ public T get(LayoutVersionManager lvm, VersionFactoryKey key) {
+ Integer version = key.getVersion();
+ // If version is not passed in, go defensive and set the highest allowed
+ // version (MLV).
+ if (version == null) {
+ version = lvm.getMetadataLayoutVersion();
+ }
+
+ checkArgument(lvm.getMetadataLayoutVersion() >= version,
+ String.format("Cannot get key %s since the version is greater " +
+ "than the Metadata layout version %d",
+ key, lvm.getMetadataLayoutVersion()));
+
+ String primaryKey = key.getKey();
+ PriorityQueue<VersionedInstance<T>> versionedInstances =
+ instances.get(primaryKey);
+ if (versionedInstances == null || versionedInstances.isEmpty()) {
+ throw new IllegalArgumentException(
+ "No suitable instance found for request : " + key);
+ }
+
+ VersionedInstance<T> value = versionedInstances.peek();
+ if (value == null || value.version > version) {
+ throw new IllegalArgumentException(
+ "No suitable instance found for request : " + key);
+ } else {
+ return value.instance;
+ }
+ }
+
+ /**
+ * To be called on finalization when there is an MLV update.
+ * @param lvm LayoutVersionManager instance.
+ */
+ public void onFinalize(LayoutVersionManager lvm) {
+ Iterator<Map.Entry<String, PriorityQueue<VersionedInstance<T>>>> iterator =
+ instances.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry<String, PriorityQueue<VersionedInstance<T>>> next =
+ iterator.next();
+ PriorityQueue<VersionedInstance<T>> vInstances = next.getValue();
+ VersionedInstance<T> prevInstance = null;
+ while (!vInstances.isEmpty() &&
+ vInstances.peek().version < lvm.getMetadataLayoutVersion()) {
+ prevInstance = vInstances.poll();
+ LOG.info("Unregistering {} from factory. ", prevInstance.instance);
+ }
+
+ if ((vInstances.isEmpty() ||
+ vInstances.peek().version > lvm.getMetadataLayoutVersion())
+ && prevInstance != null) {
+ vInstances.offer(prevInstance);
+ }
+
+ if (vInstances.isEmpty()) {
+ LOG.info("Unregistering '{}' from factory since it has no entries.",
+ next.getKey());
+ iterator.remove();
+ }
+ }
+ }
+
+ @VisibleForTesting
+ protected Map<String, List<T>> getInstances() {
+ Map<String, List<T>> instancesCopy = new HashMap<>();
+ instances.forEach((key, value) -> {
+ List<T> collect =
+ value.stream().map(v -> v.instance).collect(toList());
+ instancesCopy.put(key, collect);
+ });
+ return Collections.unmodifiableMap(instancesCopy);
+ }
+
+ /**
+ * Class to encapsulate a instance with version. Not meant to be exposed
+ * outside this class.
+ * @param <T> instance
+ */
+ static class VersionedInstance<T> {
+ private int version;
+ private T instance;
+
+ VersionedInstance(int version, T instance) {
+ this.version = version;
+ this.instance = instance;
+ }
+
+ public long getVersion() {
+ return version;
+ }
+
+ public T getInstance() {
+ return instance;
+ }
+ }
+}
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/VersionFactoryKey.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/VersionFactoryKey.java
new file mode 100644
index 0000000..bda45f5
--- /dev/null
+++
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/VersionFactoryKey.java
@@ -0,0 +1,70 @@
+/**
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.upgrade;
+
+/**
+ * "Key" element to the Version specific instance factory. Currently it has 2
+ * dimensions -> a 'key' string and a version. This is to support a factory
+ * which returns an instance for a given "key" and "version".
+ */
+public class VersionFactoryKey {
+ private String key;
+ private Integer version;
+
+ public VersionFactoryKey(String key, Integer version) {
+ this.key = key;
+ this.version = version;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public Integer getVersion() {
+ return version;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + " : [" + key + ", "
+ + version + "]";
+ }
+
+ /**
+ * Builder for above key.
+ */
+ public static class Builder {
+ private String key;
+ private Integer version;
+
+ public Builder key(String k) {
+ this.key = k;
+ return this;
+ }
+
+ public Builder version(Integer v) {
+ this.version = v;
+ return this;
+ }
+
+ public VersionFactoryKey build() {
+ return new VersionFactoryKey(key, version);
+ }
+ }
+}
diff --git
a/hadoop-hdds/common/src/test/java/org/apache/hadoop/ozone/upgrade/TestLayoutVersionInstanceFactory.java
b/hadoop-hdds/common/src/test/java/org/apache/hadoop/ozone/upgrade/TestLayoutVersionInstanceFactory.java
new file mode 100644
index 0000000..e0bb185
--- /dev/null
+++
b/hadoop-hdds/common/src/test/java/org/apache/hadoop/ozone/upgrade/TestLayoutVersionInstanceFactory.java
@@ -0,0 +1,191 @@
+/**
+ * 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.upgrade;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.function.Supplier;
+
+import org.apache.hadoop.test.LambdaTestUtils;
+import org.junit.Test;
+
+/**
+ * Test out APIs of VersionSpecificInstanceFactory.
+ */
+public class TestLayoutVersionInstanceFactory {
+
+ private MockInterface m1 = new MockClassV1();
+ private MockInterface m2 = new MockClassV2();
+
+
+ @Test
+ public void testRegister() throws Exception {
+ LayoutVersionManager lvm = getMockLvm(1, 2);
+ LayoutVersionInstanceFactory<MockInterface> factory =
+ new LayoutVersionInstanceFactory<>();
+
+ assertTrue(factory.register(lvm, getKey("key", 0), m1));
+ assertTrue(factory.register(lvm, getKey("key", 1), m1));
+ assertTrue(factory.register(lvm, getKey("key", 2), m2));
+
+ assertEquals(1, factory.getInstances().size());
+ assertEquals(2, factory.getInstances().get("key").size());
+
+ // Should fail on re-registration.
+ LambdaTestUtils.intercept(IllegalArgumentException.class,
+ "existing entry already",
+ () -> factory.register(lvm, getKey("key", 1), new MockClassV1()));
+ assertEquals(1, factory.getInstances().size());
+
+ // Verify SLV check.
+ LambdaTestUtils.intercept(IllegalArgumentException.class,
+ "version is greater",
+ () -> factory.register(lvm, getKey("key2", 4), new MockClassV2()));
+
+ }
+
+ @Test
+ public void testGet() throws Exception {
+ LayoutVersionManager lvm = getMockLvm(2, 3);
+ LayoutVersionInstanceFactory<MockInterface> factory =
+ new LayoutVersionInstanceFactory<>();
+ assertTrue(factory.register(lvm, getKey("key", 0), null));
+ assertTrue(factory.register(lvm, getKey("key", 1), m1));
+ assertTrue(factory.register(lvm, getKey("key", 3), m2));
+
+ MockInterface val = factory.get(lvm, getKey("key", 2));
+ assertTrue(val instanceof MockClassV1);
+
+ // Not passing in version --> Use MLV.
+ val = factory.get(lvm, getKey("key", null));
+ assertTrue(val instanceof MockClassV1);
+
+ // MLV check.
+ LambdaTestUtils.intercept(IllegalArgumentException.class,
+ "version is greater",
+ () -> factory.get(lvm, getKey("key", 3)));
+
+ // Verify failure on Unknown request.
+ LambdaTestUtils.intercept(IllegalArgumentException.class,
+ "No suitable instance found",
+ () -> factory.get(lvm, getKey("key1", 1)));
+ }
+
+ @Test
+ public void testMethodBasedVersionFactory() {
+ LayoutVersionManager lvm = getMockLvm(1, 2);
+ LayoutVersionInstanceFactory<Supplier<String>> factory =
+ new LayoutVersionInstanceFactory<>();
+
+ MockClassWithVersionedAPIs m = new MockClassWithVersionedAPIs();
+ factory.register(lvm, getKey("method", 1), m::mockMethodV1);
+ factory.register(lvm, getKey("method", 2), m::mockMethodV2);
+
+ Supplier<String> method = factory.get(lvm, getKey("method", 1));
+ assertEquals("v1", method.get());
+ }
+
+
+ private VersionFactoryKey getKey(String key, Integer version) {
+ VersionFactoryKey.Builder vfKey = new VersionFactoryKey.Builder().key(key);
+ if (version != null) {
+ vfKey.version(version);
+ }
+ return vfKey.build();
+ }
+
+
+
+ @Test
+ public void testOnFinalize() {
+ LayoutVersionManager lvm = getMockLvm(1, 3);
+ LayoutVersionInstanceFactory<MockInterface> factory =
+ new LayoutVersionInstanceFactory<>();
+ assertTrue(factory.register(lvm, getKey("key", 1), m1));
+ assertTrue(factory.register(lvm, getKey("key", 3), m2));
+ assertTrue(factory.register(lvm, getKey("key2", 1), m1));
+ assertTrue(factory.register(lvm, getKey("key2", 2), m2));
+
+ MockInterface val = factory.get(lvm, getKey("key", null));
+ assertTrue(val instanceof MockClassV1);
+ assertEquals(2, factory.getInstances().size());
+ assertEquals(2, factory.getInstances().get("key").size());
+
+ val = factory.get(lvm, getKey("key2", null));
+ assertTrue(val instanceof MockClassV1);
+
+ // Finalize the layout version.
+ lvm = getMockLvm(3, 3);
+ factory.onFinalize(lvm);
+
+ val = factory.get(lvm, getKey("key", null));
+ assertTrue(val instanceof MockClassV2);
+ assertEquals(2, factory.getInstances().size());
+ assertEquals(1, factory.getInstances().get("key").size());
+
+ val = factory.get(lvm, getKey("key2", null));
+ assertTrue(val instanceof MockClassV2);
+ }
+
+ private LayoutVersionManager getMockLvm(int mlv, int slv) {
+ LayoutVersionManager lvm = mock(LayoutVersionManager.class);
+ when(lvm.getMetadataLayoutVersion()).thenReturn(mlv);
+ when(lvm.getSoftwareLayoutVersion()).thenReturn(slv);
+ return lvm;
+ }
+
+ /**
+ * Mock Interface.
+ */
+ interface MockInterface {
+ String mockMethod();
+ }
+
+ /**
+ * Mock Impl v1.
+ */
+ static class MockClassV1 implements MockInterface {
+ @Override
+ public String mockMethod() {
+ return getClass().getSimpleName();
+ }
+ }
+
+ /**
+ * Mock Impl v2.
+ */
+ static class MockClassV2 extends MockClassV1 {
+ }
+
+ /**
+ * Mock class with a v1 and v2 method.
+ */
+ static class MockClassWithVersionedAPIs {
+ public String mockMethodV1() {
+ return "v1";
+ }
+
+ public String mockMethodV2() {
+ return "v2";
+ }
+ }
+}
\ No newline at end of file
diff --git
a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index 9e0354a..758d6e3 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -107,6 +107,7 @@ message OMRequest {
optional UserInfo userInfo = 4;
+ optional LayoutVersion layoutVersion = 5;
optional CreateVolumeRequest createVolumeRequest =
11;
optional SetVolumePropertyRequest setVolumePropertyRequest =
12;
@@ -1199,6 +1200,10 @@ message GetS3SecretResponse {
required S3Secret s3Secret = 2;
}
+message LayoutVersion {
+ required uint64 version = 1;
+}
+
/**
This will be used internally by OM to replicate S3 Secret across quorum of
OM's.
diff --git a/hadoop-ozone/ozone-manager/pom.xml
b/hadoop-ozone/ozone-manager/pom.xml
index 484a8f8..8680867 100644
--- a/hadoop-ozone/ozone-manager/pom.xml
+++ b/hadoop-ozone/ozone-manager/pom.xml
@@ -126,7 +126,6 @@ https://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.12</version>
- <scope>test</scope>
</dependency>
</dependencies>
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 f9ff357..a0e0067 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
@@ -141,7 +141,8 @@ import
org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer;
import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerRatisUtils;
import org.apache.hadoop.ozone.om.request.file.OMFileRequest;
import org.apache.hadoop.ozone.om.snapshot.OzoneManagerSnapshotProvider;
-import org.apache.hadoop.ozone.om.upgrade.OMLayoutVersionManager;
+import org.apache.hadoop.ozone.om.upgrade.OMLayoutVersionManagerImpl;
+import org.apache.hadoop.ozone.om.upgrade.OmLayoutVersionManager;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DBUpdatesRequest;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs;
@@ -311,6 +312,7 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
private KeyProviderCryptoExtension kmsProvider = null;
private static String keyProviderUriKeyName =
CommonConfigurationKeysPublic.HADOOP_SECURITY_KEY_PROVIDER_PATH;
+ private final OMLayoutVersionManagerImpl versionManager;
private boolean allowListAllVolumes;
// Adding parameters needed for VolumeRequests here, so that during request
@@ -351,6 +353,8 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
omStorage = new OMStorage(conf);
omId = omStorage.getOmId();
+ versionManager = OMLayoutVersionManagerImpl.initialize(omStorage);
+
// In case of single OM Node Service there will be no OM Node ID
// specified, set it to value from om storage
if (this.omNodeDetails.getOMNodeId() == null) {
@@ -1143,8 +1147,6 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
metadataManager.start(configuration);
startSecretManagerIfNecessary();
- OMLayoutVersionManager omVersionManager =
- OMLayoutVersionManager.initialize(omStorage);
if (certClient != null) {
caCertPem = CertificateCodec.getPEMEncodedString(
@@ -3711,4 +3713,7 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
}
+ public OmLayoutVersionManager getVersionManager() {
+ return versionManager;
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java
index f43dfba..f0117b5 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java
@@ -18,6 +18,7 @@
package org.apache.hadoop.ozone.om.ratis.utils;
import com.google.common.base.Preconditions;
+
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.utils.db.DBStore;
import org.apache.hadoop.hdds.utils.db.Table;
@@ -25,42 +26,16 @@ import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.exceptions.OMException;
import org.apache.hadoop.ozone.om.ratis.OMTransactionInfo;
-import org.apache.hadoop.ozone.om.request.bucket.OMBucketCreateRequest;
-import org.apache.hadoop.ozone.om.request.bucket.OMBucketDeleteRequest;
-import org.apache.hadoop.ozone.om.request.bucket.OMBucketSetPropertyRequest;
import org.apache.hadoop.ozone.om.request.OMClientRequest;
import org.apache.hadoop.ozone.om.request.bucket.acl.OMBucketAddAclRequest;
import org.apache.hadoop.ozone.om.request.bucket.acl.OMBucketRemoveAclRequest;
import org.apache.hadoop.ozone.om.request.bucket.acl.OMBucketSetAclRequest;
-import org.apache.hadoop.ozone.om.request.file.OMDirectoryCreateRequest;
-import org.apache.hadoop.ozone.om.request.file.OMFileCreateRequest;
-import org.apache.hadoop.ozone.om.request.key.OMKeysDeleteRequest;
-import org.apache.hadoop.ozone.om.request.key.OMAllocateBlockRequest;
-import org.apache.hadoop.ozone.om.request.key.OMKeyCommitRequest;
-import org.apache.hadoop.ozone.om.request.key.OMKeyCreateRequest;
-import org.apache.hadoop.ozone.om.request.key.OMKeyDeleteRequest;
-import org.apache.hadoop.ozone.om.request.key.OMKeyPurgeRequest;
-import org.apache.hadoop.ozone.om.request.key.OMKeyRenameRequest;
-import org.apache.hadoop.ozone.om.request.key.OMKeysRenameRequest;
-import org.apache.hadoop.ozone.om.request.key.OMTrashRecoverRequest;
import org.apache.hadoop.ozone.om.request.key.acl.OMKeyAddAclRequest;
import org.apache.hadoop.ozone.om.request.key.acl.OMKeyRemoveAclRequest;
import org.apache.hadoop.ozone.om.request.key.acl.OMKeySetAclRequest;
import org.apache.hadoop.ozone.om.request.key.acl.prefix.OMPrefixAddAclRequest;
import
org.apache.hadoop.ozone.om.request.key.acl.prefix.OMPrefixRemoveAclRequest;
import org.apache.hadoop.ozone.om.request.key.acl.prefix.OMPrefixSetAclRequest;
-import
org.apache.hadoop.ozone.om.request.s3.multipart.S3InitiateMultipartUploadRequest;
-import
org.apache.hadoop.ozone.om.request.s3.multipart.S3MultipartUploadAbortRequest;
-import
org.apache.hadoop.ozone.om.request.s3.multipart.S3MultipartUploadCommitPartRequest;
-import
org.apache.hadoop.ozone.om.request.s3.multipart.S3MultipartUploadCompleteRequest;
-import org.apache.hadoop.ozone.om.request.s3.security.S3GetSecretRequest;
-import
org.apache.hadoop.ozone.om.request.security.OMCancelDelegationTokenRequest;
-import org.apache.hadoop.ozone.om.request.security.OMGetDelegationTokenRequest;
-import
org.apache.hadoop.ozone.om.request.security.OMRenewDelegationTokenRequest;
-import
org.apache.hadoop.ozone.om.request.upgrade.OMFinalizeUpgradeProgressRequest;
-import org.apache.hadoop.ozone.om.request.upgrade.OMFinalizeUpgradeRequest;
-import org.apache.hadoop.ozone.om.request.volume.OMVolumeCreateRequest;
-import org.apache.hadoop.ozone.om.request.volume.OMVolumeDeleteRequest;
import org.apache.hadoop.ozone.om.request.volume.OMVolumeSetOwnerRequest;
import org.apache.hadoop.ozone.om.request.volume.OMVolumeSetQuotaRequest;
import org.apache.hadoop.ozone.om.request.volume.acl.OMVolumeAddAclRequest;
@@ -73,6 +48,8 @@ import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
import org.apache.ratis.util.FileUtils;
import org.rocksdb.RocksDBException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.file.Path;
@@ -85,131 +62,110 @@ import static
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.TRANSACTION_INFO_
*/
public final class OzoneManagerRatisUtils {
+ private static final Logger LOG = LoggerFactory
+ .getLogger(OzoneManagerRatisUtils.class);
+
private OzoneManagerRatisUtils() {
}
- /**
- * Create OMClientRequest which encapsulates the OMRequest.
- * @param omRequest
- * @return OMClientRequest
- * @throws IOException
- */
- public static OMClientRequest createClientRequest(OMRequest omRequest) {
+
+ public static OMClientRequest getRequest(OzoneManager om,
+ OMRequest omRequest) {
Type cmdType = omRequest.getCmdType();
switch (cmdType) {
- case CreateVolume:
- return new OMVolumeCreateRequest(omRequest);
- case SetVolumeProperty:
- boolean hasQuota = omRequest.getSetVolumePropertyRequest()
- .hasQuotaInBytes();
- boolean hasOwner =
omRequest.getSetVolumePropertyRequest().hasOwnerName();
- Preconditions.checkState(hasOwner || hasQuota, "Either Quota or owner " +
- "should be set in the SetVolumeProperty request");
- Preconditions.checkState(!(hasOwner && hasQuota), "Either Quota or " +
- "owner should be set in the SetVolumeProperty request. Should not " +
- "set both");
- if (hasQuota) {
- return new OMVolumeSetQuotaRequest(omRequest);
- } else {
- return new OMVolumeSetOwnerRequest(omRequest);
- }
- case DeleteVolume:
- return new OMVolumeDeleteRequest(omRequest);
- case CreateBucket:
- return new OMBucketCreateRequest(omRequest);
- case DeleteBucket:
- return new OMBucketDeleteRequest(omRequest);
- case SetBucketProperty:
- return new OMBucketSetPropertyRequest(omRequest);
- case AllocateBlock:
- return new OMAllocateBlockRequest(omRequest);
- case CreateKey:
- return new OMKeyCreateRequest(omRequest);
- case CommitKey:
- return new OMKeyCommitRequest(omRequest);
- case DeleteKey:
- return new OMKeyDeleteRequest(omRequest);
- case DeleteKeys:
- return new OMKeysDeleteRequest(omRequest);
- case RenameKey:
- return new OMKeyRenameRequest(omRequest);
- case RenameKeys:
- return new OMKeysRenameRequest(omRequest);
- case CreateDirectory:
- return new OMDirectoryCreateRequest(omRequest);
- case CreateFile:
- return new OMFileCreateRequest(omRequest);
- case PurgeKeys:
- return new OMKeyPurgeRequest(omRequest);
- case InitiateMultiPartUpload:
- return new S3InitiateMultipartUploadRequest(omRequest);
- case CommitMultiPartUpload:
- return new S3MultipartUploadCommitPartRequest(omRequest);
- case AbortMultiPartUpload:
- return new S3MultipartUploadAbortRequest(omRequest);
- case CompleteMultiPartUpload:
- return new S3MultipartUploadCompleteRequest(omRequest);
case AddAcl:
case RemoveAcl:
case SetAcl:
- return getOMAclRequest(omRequest);
- case GetDelegationToken:
- return new OMGetDelegationTokenRequest(omRequest);
- case CancelDelegationToken:
- return new OMCancelDelegationTokenRequest(omRequest);
- case RenewDelegationToken:
- return new OMRenewDelegationTokenRequest(omRequest);
- case GetS3Secret:
- return new S3GetSecretRequest(omRequest);
- case RecoverTrash:
- return new OMTrashRecoverRequest(omRequest);
- case FinalizeUpgrade:
- return new OMFinalizeUpgradeRequest(omRequest);
- case FinalizeUpgradeProgress:
- return new OMFinalizeUpgradeProgressRequest(omRequest);
+ return getOMAclRequest(om, omRequest);
+ case SetVolumeProperty:
+ return getVolumeSetPropertyRequest(om, omRequest);
default:
- throw new IllegalStateException("Unrecognized write command " +
- "type request" + cmdType);
+ Class<? extends OMClientRequest> requestClass =
+ om.getVersionManager()
+ .getRequestHandler(omRequest.getCmdType().name());
+ return getClientRequest(requestClass, omRequest);
+ }
+ }
+
+ private static OMClientRequest getClientRequest(Class<?
+ extends OMClientRequest> requestClass, OMRequest omRequest) {
+ try {
+ return requestClass.getDeclaredConstructor(OMRequest.class)
+ .newInstance(omRequest);
+ } catch (Exception ex) {
+ LOG.error("Unable to get request handler for '{}', current layout " +
+ "version = {}, request factory returned '{}'",
+ omRequest.getCmdType(),
+ omRequest.getLayoutVersion().getVersion(),
+ requestClass.getSimpleName());
}
+ throw new IllegalStateException("Unrecognized write command " +
+ "type request : " + omRequest.getCmdType());
}
- private static OMClientRequest getOMAclRequest(OMRequest omRequest) {
+ public static OMClientRequest getOMAclRequest(OzoneManager om,
+ OMRequest omRequest) {
Type cmdType = omRequest.getCmdType();
+ String requestType = null;
if (Type.AddAcl == cmdType) {
ObjectType type = omRequest.getAddAclRequest().getObj().getResType();
if (ObjectType.VOLUME == type) {
- return new OMVolumeAddAclRequest(omRequest);
+ requestType = OMVolumeAddAclRequest.getRequestType();
} else if (ObjectType.BUCKET == type) {
- return new OMBucketAddAclRequest(omRequest);
+ requestType = OMBucketAddAclRequest.getRequestType();
} else if (ObjectType.KEY == type) {
- return new OMKeyAddAclRequest(omRequest);
+ requestType = OMKeyAddAclRequest.getRequestType();
} else {
- return new OMPrefixAddAclRequest(omRequest);
+ requestType = OMPrefixAddAclRequest.getRequestType();
}
} else if (Type.RemoveAcl == cmdType) {
ObjectType type = omRequest.getRemoveAclRequest().getObj().getResType();
if (ObjectType.VOLUME == type) {
- return new OMVolumeRemoveAclRequest(omRequest);
+ requestType = OMVolumeRemoveAclRequest.getRequestType();
} else if (ObjectType.BUCKET == type) {
- return new OMBucketRemoveAclRequest(omRequest);
+ requestType = OMBucketRemoveAclRequest.getRequestType();
} else if (ObjectType.KEY == type) {
- return new OMKeyRemoveAclRequest(omRequest);
+ requestType = OMKeyRemoveAclRequest.getRequestType();
} else {
- return new OMPrefixRemoveAclRequest(omRequest);
+ requestType = OMPrefixRemoveAclRequest.getRequestType();
}
} else {
ObjectType type = omRequest.getSetAclRequest().getObj().getResType();
if (ObjectType.VOLUME == type) {
- return new OMVolumeSetAclRequest(omRequest);
+ requestType = OMVolumeSetAclRequest.getRequestType();
} else if (ObjectType.BUCKET == type) {
- return new OMBucketSetAclRequest(omRequest);
+ requestType = OMBucketSetAclRequest.getRequestType();
} else if (ObjectType.KEY == type) {
- return new OMKeySetAclRequest(omRequest);
+ requestType = OMKeySetAclRequest.getRequestType();
} else {
- return new OMPrefixSetAclRequest(omRequest);
+ requestType = OMPrefixSetAclRequest.getRequestType();
}
}
+ Class<? extends OMClientRequest> requestClass =
+ om.getVersionManager().getRequestHandler(requestType);
+ return getClientRequest(requestClass, omRequest);
}
+ public static OMClientRequest getVolumeSetPropertyRequest(
+ OzoneManager om, OMRequest omRequest) {
+ boolean hasQuota = omRequest.getSetVolumePropertyRequest()
+ .hasQuotaInBytes();
+ boolean hasOwner = omRequest.getSetVolumePropertyRequest().hasOwnerName();
+ Preconditions.checkState(hasOwner || hasQuota,
+ "Either Quota or owner " +
+ "should be set in the SetVolumeProperty request");
+ Preconditions.checkState(!(hasOwner && hasQuota),
+ "Either Quota or " +
+ "owner should be set in the SetVolumeProperty request. Should not "
+ + "set both");
+
+ String requestType = hasQuota ? OMVolumeSetQuotaRequest.getRequestType() :
+ OMVolumeSetOwnerRequest.getRequestType();
+ Class<? extends OMClientRequest> requestClass =
+ om.getVersionManager().getRequestHandler(requestType);
+ return getClientRequest(requestClass, omRequest);
+ }
+
+
/**
* Convert exception result to {@link OzoneManagerProtocolProtos.Status}.
* @param exception
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java
index 0fa9ca1..b215544 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java
@@ -34,6 +34,7 @@ import
org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper;
import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerRatisUtils;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.LayoutVersion;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
@@ -89,7 +90,12 @@ public abstract class OMClientRequest implements
RequestAuditor {
*/
public OMRequest preExecute(OzoneManager ozoneManager)
throws IOException {
- omRequest = getOmRequest().toBuilder().setUserInfo(getUserInfo()).build();
+ LayoutVersion layoutVersion = LayoutVersion.newBuilder()
+
.setVersion(ozoneManager.getVersionManager().getMetadataLayoutVersion())
+ .build();
+ omRequest =
+ getOmRequest().toBuilder()
+
.setUserInfo(getUserInfo()).setLayoutVersion(layoutVersion).build();
return omRequest;
}
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 7c60f61..8bdf254 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
@@ -75,6 +75,7 @@ import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_L
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.CryptoProtocolVersionProto.ENCRYPTION_ZONES;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CreateBucket;
/**
* Handles CreateBucket Request.
@@ -297,4 +298,8 @@ public class OMBucketCreateRequest extends OMClientRequest {
CipherSuite.convert(metadata.getCipher())));
return bekb.build();
}
+
+ public static String getRequestType() {
+ return CreateBucket.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java
index 91aef6a..33ea990 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java
@@ -54,6 +54,7 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_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;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.DeleteBucket;
/**
* Handles DeleteBucket Request.
@@ -169,4 +170,8 @@ public class OMBucketDeleteRequest extends OMClientRequest {
return omClientResponse;
}
}
+
+ public static String getRequestType() {
+ return DeleteBucket.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java
index d90f08e..6b8576a 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java
@@ -59,6 +59,7 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.SetBucketProperty;
/**
* Handle SetBucketProperty Request.
@@ -206,4 +207,8 @@ public class OMBucketSetPropertyRequest extends
OMClientRequest {
return omClientResponse;
}
}
+
+ public static String getRequestType() {
+ return SetBucketProperty.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java
index 78afeff..45cfdcf 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java
@@ -18,12 +18,15 @@
package org.apache.hadoop.ozone.om.request.bucket.acl;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.AddAcl;
+
import java.io.IOException;
import java.util.List;
import com.google.common.collect.Lists;
import org.apache.hadoop.ozone.om.OMMetrics;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.apache.hadoop.ozone.util.BooleanBiFunction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -115,5 +118,8 @@ public class OMBucketAddAclRequest extends
OMBucketAclRequest {
}
}
+ public static String getRequestType() {
+ return AddAcl.name() + "-" + ObjectType.BUCKET.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java
index 5268309..799373f 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java
@@ -18,10 +18,13 @@
package org.apache.hadoop.ozone.om.request.bucket.acl;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.RemoveAcl;
+
import java.io.IOException;
import java.util.List;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -112,5 +115,9 @@ public class OMBucketRemoveAclRequest extends
OMBucketAclRequest {
}
}
}
+
+ public static String getRequestType() {
+ return RemoveAcl.name() + "-" + ObjectType.BUCKET.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java
index 66df8c6..669f6e0 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java
@@ -18,11 +18,14 @@
package org.apache.hadoop.ozone.om.request.bucket.acl;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.SetAcl;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -113,5 +116,9 @@ public class OMBucketSetAclRequest extends
OMBucketAclRequest {
}
}
}
+
+ public static String getRequestType() {
+ return SetAcl.name() + "-" + ObjectType.BUCKET.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java
index 7b2ab51..3ed7793 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java
@@ -75,6 +75,8 @@ import static
org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryR
import static
org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS_IN_GIVENPATH;
import static
org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.NONE;
import static
org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CreateDirectory;
+
/**
* Handle create directory request.
*/
@@ -353,4 +355,7 @@ public class OMDirectoryCreateRequest extends OMKeyRequest {
.setUpdateID(objectId);
}
+ public static String getRequestType() {
+ return CreateDirectory.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java
index 3226f78..bf41343 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java
@@ -60,8 +60,6 @@ import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.OMResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.OMRequest;
-import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
- .Type;
import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
import org.apache.hadoop.ozone.security.acl.OzoneObj;
import org.apache.hadoop.util.Time;
@@ -73,6 +71,7 @@ import static
org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryR
import static
org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS_IN_GIVENPATH;
import static
org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CreateFile;
/**
* Handles create file request.
@@ -297,7 +296,7 @@ public class OMFileCreateRequest extends OMKeyRequest {
.setKeyInfo(omKeyInfo.getProtobuf())
.setID(clientID)
.setOpenVersion(openVersion).build())
- .setCmdType(Type.CreateFile);
+ .setCmdType(CreateFile);
omClientResponse = new OMFileCreateResponse(omResponse.build(),
omKeyInfo, missingParentInfos, clientID);
@@ -306,7 +305,7 @@ public class OMFileCreateRequest extends OMKeyRequest {
result = Result.FAILURE;
exception = ex;
omMetrics.incNumCreateFileFails();
- omResponse.setCmdType(Type.CreateFile);
+ omResponse.setCmdType(CreateFile);
omClientResponse = new OMFileCreateResponse(createErrorOMResponse(
omResponse, exception));
} finally {
@@ -352,4 +351,8 @@ public class OMFileCreateRequest extends OMKeyRequest {
OMException.ResultCodes.DIRECTORY_NOT_FOUND);
}
}
+
+ public static String getRequestType() {
+ return CreateFile.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
index 94d700f..4f4eb17 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
@@ -61,6 +61,7 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes
.KEY_NOT_FOUND;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.AllocateBlock;
/**
* Handles allocate block request.
@@ -236,4 +237,8 @@ public class OMAllocateBlockRequest extends OMKeyRequest {
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return AllocateBlock.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMECKeyCreateRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMECKeyCreateRequest.java
new file mode 100644
index 0000000..56e7e47
--- /dev/null
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMECKeyCreateRequest.java
@@ -0,0 +1,54 @@
+/**
+ * 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.request.key;
+
+import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.CREATE_EC;
+
+import java.io.IOException;
+
+import org.apache.hadoop.ozone.om.OzoneManager;
+import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper;
+import org.apache.hadoop.ozone.om.response.OMClientResponse;
+import org.apache.hadoop.ozone.om.upgrade.BelongsToLayoutVersion;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
+
+/**
+ * Handles Create EC Key request. (To be removed later)
+ */
+@BelongsToLayoutVersion(CREATE_EC)
+public class OMECKeyCreateRequest extends OMKeyCreateRequest {
+
+ public OMECKeyCreateRequest(OMRequest omRequest) {
+ super(omRequest);
+ }
+
+ @Override
+ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
+ // V2 impl here.
+ return null;
+ }
+
+ @Override
+ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager,
+ long trxnLogIndex, OzoneManagerDoubleBufferHelper omDoubleBufferHelper) {
+ // V2 impl here.
+ return null;
+ }
+
+}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
index dccb93b..80143b2 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
@@ -61,6 +61,7 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CommitKey;
/**
* Handles CommitKey request.
@@ -229,4 +230,8 @@ public class OMKeyCommitRequest extends OMKeyRequest {
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return CommitKey.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
index 1b712fb..a51bb9d 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
@@ -72,6 +72,7 @@ import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
import static
org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.DIRECTORY_EXISTS;
import static
org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS_IN_GIVENPATH;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CreateKey;
/**
* Handles CreateKey request.
@@ -343,4 +344,7 @@ public class OMKeyCreateRequest extends OMKeyRequest {
return omClientResponse;
}
+ public static String getRequestType() {
+ return CreateKey.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java
index 4d8562c..37ef8a6 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java
@@ -54,6 +54,7 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.DeleteKey;
/**
* Handles DeleteKey request.
@@ -190,4 +191,8 @@ public class OMKeyDeleteRequest extends OMKeyRequest {
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return DeleteKey.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyPurgeRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyPurgeRequest.java
index ce7f1e9..51f27fe 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyPurgeRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyPurgeRequest.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.ozone.om.request.key;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.PurgeKeys;
+
import java.util.ArrayList;
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper;
@@ -71,4 +73,8 @@ public class OMKeyPurgeRequest extends OMKeyRequest {
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return PurgeKeys.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java
index 4e7c05c..8243859 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java
@@ -58,6 +58,7 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.RenameKey;
/**
* Handles rename key request.
@@ -236,4 +237,8 @@ public class OMKeyRenameRequest extends OMKeyRequest {
auditMap.put(OzoneConsts.DST_KEY, renameKeyRequest.getToKeyName());
return auditMap;
}
+
+ public static String getRequestType() {
+ return RenameKey.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
index 012df49..e247877 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
@@ -56,6 +56,7 @@ import static
org.apache.hadoop.ozone.audit.OMAction.DELETE_KEYS;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.OK;
import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.PARTIAL_DELETE;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.DeleteKeys;
/**
* Handles DeleteKey request.
@@ -236,4 +237,8 @@ public class OMKeysDeleteRequest extends OMKeyRequest {
auditMap.put(UNDELETED_KEYS_LIST, String.join(",", unDeletedKeys));
}
+ public static String getRequestType() {
+ return DeleteKeys.name();
+ }
+
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java
index dbcde6d..a81b8a5 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java
@@ -59,6 +59,7 @@ import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.
import static org.apache.hadoop.ozone.OzoneConsts.RENAMED_KEYS_MAP;
import static org.apache.hadoop.ozone.OzoneConsts.UNRENAMED_KEYS_MAP;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.RenameKeys;
/**
* Handles rename keys request.
@@ -248,6 +249,10 @@ public class OMKeysRenameRequest extends OMKeyRequest {
return omClientResponse;
}
+ public static String getRequestType() {
+ return RenameKeys.name();
+ }
+
/**
* Build audit map for RenameKeys request.
*
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMTrashRecoverRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMTrashRecoverRequest.java
index 232a0fb..3034820 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMTrashRecoverRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMTrashRecoverRequest.java
@@ -42,6 +42,7 @@ import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.RecoverTrash;
/**
* Handles RecoverTrash request.
@@ -140,4 +141,7 @@ public class OMTrashRecoverRequest extends OMKeyRequest {
return omClientResponse;
}
+ public static String getRequestType() {
+ return RecoverTrash.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java
index 3697cb8..5527742 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.ozone.om.request.key.acl;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.AddAcl;
+
import java.io.IOException;
import java.util.List;
@@ -27,6 +29,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
import org.apache.hadoop.ozone.om.response.key.acl.OMKeyAclResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -101,5 +104,9 @@ public class OMKeyAddAclRequest extends OMKeyAclRequest {
// No need to check not null here, this will be never called with null.
return omKeyInfo.addAcl(ozoneAcls.get(0));
}
+
+ public static String getRequestType() {
+ return AddAcl.name() + "-" + ObjectType.KEY;
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java
index 67b891a..6f84648 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.ozone.om.request.key.acl;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.RemoveAcl;
+
import java.io.IOException;
import java.util.List;
@@ -27,6 +29,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
import org.apache.hadoop.ozone.om.response.key.acl.OMKeyAclResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -102,5 +105,9 @@ public class OMKeyRemoveAclRequest extends OMKeyAclRequest {
// No need to check not null here, this will be never called with null.
return omKeyInfo.removeAcl(ozoneAcls.get(0));
}
+
+ public static String getRequestType() {
+ return RemoveAcl.name() + "-" + ObjectType.KEY;
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java
index 70f7b28..bceac54 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.ozone.om.request.key.acl;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.SetAcl;
+
import java.io.IOException;
import java.util.List;
@@ -28,6 +30,7 @@ import org.apache.hadoop.ozone.om.helpers.OzoneAclUtil;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
import org.apache.hadoop.ozone.om.response.key.acl.OMKeyAclResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -98,5 +101,9 @@ public class OMKeySetAclRequest extends OMKeyAclRequest {
// No need to check not null here, this will be never called with null.
return omKeyInfo.setAcls(ozoneAcls);
}
+
+ public static String getRequestType() {
+ return SetAcl.name() + "-" + ObjectType.KEY;
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java
index 7160042..e4dcea6 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.ozone.om.request.key.acl.prefix;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.AddAcl;
+
import java.io.IOException;
import java.util.List;
@@ -28,6 +30,7 @@ import
org.apache.hadoop.ozone.om.PrefixManagerImpl.OMPrefixAclOpResult;
import org.apache.hadoop.ozone.om.helpers.OmPrefixInfo;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
import org.apache.hadoop.ozone.om.response.key.acl.prefix.OMPrefixAclResponse;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.apache.hadoop.ozone.security.acl.OzoneObj;
import org.apache.hadoop.ozone.security.acl.OzoneObjInfo;
import org.slf4j.Logger;
@@ -123,5 +126,9 @@ public class OMPrefixAddAclRequest extends
OMPrefixAclRequest {
return prefixManager.addAcl(ozoneObj, ozoneAcls.get(0), omPrefixInfo,
trxnLogIndex);
}
+
+ public static String getRequestType() {
+ return AddAcl.name() + "-" + ObjectType.PREFIX;
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java
index 3731ad1..f2af320 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.ozone.om.request.key.acl.prefix;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.RemoveAcl;
+
import java.io.IOException;
import java.util.List;
@@ -28,6 +30,7 @@ import
org.apache.hadoop.ozone.om.PrefixManagerImpl.OMPrefixAclOpResult;
import org.apache.hadoop.ozone.om.helpers.OmPrefixInfo;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
import org.apache.hadoop.ozone.om.response.key.acl.prefix.OMPrefixAclResponse;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.apache.hadoop.ozone.security.acl.OzoneObj;
import org.apache.hadoop.ozone.security.acl.OzoneObjInfo;
import org.slf4j.Logger;
@@ -119,5 +122,9 @@ public class OMPrefixRemoveAclRequest extends
OMPrefixAclRequest {
OmPrefixInfo omPrefixInfo, long trxnLogIndex) throws IOException {
return prefixManager.removeAcl(ozoneObj, ozoneAcls.get(0), omPrefixInfo);
}
+
+ public static String getRequestType() {
+ return RemoveAcl.name() + "-" + ObjectType.PREFIX;
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java
index 44bc43b..a5fef16 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.ozone.om.request.key.acl.prefix;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.SetAcl;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -28,6 +30,7 @@ import
org.apache.hadoop.ozone.om.PrefixManagerImpl.OMPrefixAclOpResult;
import org.apache.hadoop.ozone.om.helpers.OmPrefixInfo;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
import org.apache.hadoop.ozone.om.response.key.acl.prefix.OMPrefixAclResponse;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.apache.hadoop.ozone.security.acl.OzoneObj;
import org.apache.hadoop.ozone.security.acl.OzoneObjInfo;
import org.slf4j.Logger;
@@ -116,5 +119,9 @@ public class OMPrefixSetAclRequest extends
OMPrefixAclRequest {
return prefixManager.setAcl(ozoneObj, ozoneAcls, omPrefixInfo,
trxnLogIndex);
}
+
+ public static String getRequestType() {
+ return SetAcl.name() + "-" + ObjectType.PREFIX;
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java
index 08063b6..7c5e0e3 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java
@@ -54,6 +54,7 @@ import java.util.UUID;
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_SUPPORTED_OPERATION;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.InitiateMultiPartUpload;
/**
* Handles initiate multipart upload request.
@@ -250,4 +251,8 @@ public class S3InitiateMultipartUploadRequest extends
OMKeyRequest {
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return InitiateMultiPartUpload.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java
index c0ef8b3..0aa3fa3 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java
@@ -53,6 +53,7 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.AbortMultiPartUpload;
/**
* Handles Abort of multipart upload request.
@@ -192,4 +193,8 @@ public class S3MultipartUploadAbortRequest extends
OMKeyRequest {
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return AbortMultiPartUpload.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
index 1e29d5f..6ab5c67 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
@@ -56,6 +56,7 @@ import java.util.stream.Collectors;
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CommitMultiPartUpload;
/**
* Handle Multipart upload commit upload part file.
@@ -261,5 +262,8 @@ public class S3MultipartUploadCommitPartRequest extends
OMKeyRequest {
return omClientResponse;
}
+ public static String getRequestType() {
+ return CommitMultiPartUpload.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
index 83cc28b..c953d25 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
@@ -56,6 +56,8 @@ import com.google.common.base.Optional;
import org.apache.commons.codec.digest.DigestUtils;
import static org.apache.hadoop.ozone.OzoneConsts.OM_MULTIPART_MIN_SIZE;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CompleteMultiPartUpload;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -367,5 +369,9 @@ public class S3MultipartUploadCompleteRequest extends
OMKeyRequest {
new CacheKey<>(multipartKey),
new CacheValue<>(Optional.absent(), transactionLogIndex));
}
+
+ public static String getRequestType() {
+ return CompleteMultiPartUpload.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3GetSecretRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3GetSecretRequest.java
index b240373..691b278 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3GetSecretRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/security/S3GetSecretRequest.java
@@ -51,6 +51,7 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.S3_SECRET_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.GetS3Secret;
/**
* Handles GetS3Secret request.
@@ -186,4 +187,8 @@ public class S3GetSecretRequest extends OMClientRequest {
}
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return GetS3Secret.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMCancelDelegationTokenRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMCancelDelegationTokenRequest.java
index e931735..0b159bb 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMCancelDelegationTokenRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMCancelDelegationTokenRequest.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.ozone.om.request.security;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CancelDelegationToken;
+
import com.google.common.base.Optional;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.OzoneManager;
@@ -108,7 +110,6 @@ public class OMCancelDelegationTokenRequest extends
OMClientRequest {
return omClientResponse;
}
-
public Token<OzoneTokenIdentifier> getToken() {
CancelDelegationTokenRequestProto cancelDelegationTokenRequest =
getOmRequest().getCancelDelegationTokenRequest();
@@ -116,4 +117,8 @@ public class OMCancelDelegationTokenRequest extends
OMClientRequest {
return OMPBHelper.convertToDelegationToken(
cancelDelegationTokenRequest.getToken());
}
+
+ public static String getRequestType() {
+ return CancelDelegationToken.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMGetDelegationTokenRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMGetDelegationTokenRequest.java
index 4d2a6b4..81eb3d2 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMGetDelegationTokenRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMGetDelegationTokenRequest.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.ozone.om.request.security;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.GetDelegationToken;
+
import com.google.common.base.Optional;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.ozone.om.OMMetadataManager;
@@ -64,7 +66,6 @@ public class OMGetDelegationTokenRequest extends
OMClientRequest {
Token<OzoneTokenIdentifier> token = ozoneManager
.getDelegationToken(new Text(getDelegationTokenRequest.getRenewer()));
-
// Client issues GetDelegationToken request, when received by OM leader
// it will generate a token. Original GetDelegationToken request is
// converted to UpdateGetDelegationToken request with the generated token
@@ -181,4 +182,8 @@ public class OMGetDelegationTokenRequest extends
OMClientRequest {
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return GetDelegationToken.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMRenewDelegationTokenRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMRenewDelegationTokenRequest.java
index 360ca4f..a683216 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMRenewDelegationTokenRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/security/OMRenewDelegationTokenRequest.java
@@ -18,6 +18,8 @@
package org.apache.hadoop.ozone.om.request.security;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.RenewDelegationToken;
+
import java.io.IOException;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
@@ -156,4 +158,8 @@ public class OMRenewDelegationTokenRequest extends
OMClientRequest {
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return RenewDelegationToken.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeProgressRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeProgressRequest.java
index 3cb9210..9a8d56e 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeProgressRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeProgressRequest.java
@@ -17,6 +17,8 @@
package org.apache.hadoop.ozone.om.request.upgrade;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.FinalizeUpgradeProgress;
+
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper;
import org.apache.hadoop.ozone.om.request.OMClientRequest;
@@ -84,4 +86,8 @@ public class OMFinalizeUpgradeProgressRequest extends
OMClientRequest {
return response;
}
+
+ public static String getRequestType() {
+ return FinalizeUpgradeProgress.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java
index 772eae7..1b1897a 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMFinalizeUpgradeRequest.java
@@ -17,13 +17,14 @@
package org.apache.hadoop.ozone.om.request.upgrade;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.FinalizeUpgrade;
+
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper;
import org.apache.hadoop.ozone.om.request.OMClientRequest;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.om.response.upgrade.OMFinalizeUpgradeResponse;
-import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.FinalizeUpgradeRequest;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.FinalizeUpgradeResponse;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
@@ -53,7 +54,7 @@ public class OMFinalizeUpgradeRequest extends OMClientRequest
{
LOG.trace("Request: {}", getOmRequest());
OMResponse.Builder responseBuilder =
OmResponseUtil.getOMResponseBuilder(getOmRequest());
-
responseBuilder.setCmdType(OzoneManagerProtocolProtos.Type.FinalizeUpgrade);
+ responseBuilder.setCmdType(FinalizeUpgrade);
OMClientResponse response = null;
try {
@@ -77,4 +78,8 @@ public class OMFinalizeUpgradeRequest extends OMClientRequest
{
return response;
}
+
+ public static String getRequestType() {
+ return FinalizeUpgrade.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
index 7e2ccd9..ce1b2cb 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
@@ -56,6 +56,7 @@ import org.apache.hadoop.util.Time;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.USER_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CreateVolume;
/**
* Handles volume create request.
@@ -201,6 +202,10 @@ public class OMVolumeCreateRequest extends OMVolumeRequest
{
}
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return CreateVolume.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java
index ce93e26..05480cc 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java
@@ -51,6 +51,8 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.USER_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.DeleteVolume;
+
/**
* Handles volume delete request.
*/
@@ -162,5 +164,9 @@ public class OMVolumeDeleteRequest extends OMVolumeRequest {
}
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return DeleteVolume.name();
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java
index 6873086..d95d271 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java
@@ -48,6 +48,7 @@ import java.io.IOException;
import java.util.Map;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.SetVolumeProperty;
/**
* Handle set owner request for volume.
@@ -208,5 +209,9 @@ public class OMVolumeSetOwnerRequest extends
OMVolumeRequest {
}
return omClientResponse;
}
+
+ public static String getRequestType() {
+ return SetVolumeProperty.name() + "-Owner";
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java
index 746a1a6..3b9c809 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java
@@ -53,6 +53,7 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import static
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.SetVolumeProperty;
/**
* Handles set Quota request for volume.
@@ -172,7 +173,9 @@ public class OMVolumeSetQuotaRequest extends
OMVolumeRequest {
return omClientResponse;
}
-
+ public static String getRequestType() {
+ return SetVolumeProperty.name() + "-Quota";
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
index 12008e2..d65e0df 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
@@ -17,6 +17,8 @@
*/
package org.apache.hadoop.ozone.om.request.volume.acl;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.AddAcl;
+
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import org.apache.hadoop.hdds.scm.storage.CheckedBiFunction;
@@ -28,6 +30,7 @@ import
org.apache.hadoop.ozone.om.response.volume.OMVolumeAclOpResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -113,4 +116,8 @@ public class OMVolumeAddAclRequest extends
OMVolumeAclRequest {
getOmRequest());
}
}
+
+ public static String getRequestType() {
+ return AddAcl.name() + "-" + ObjectType.VOLUME;
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
index 461ad48..e386e20 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
@@ -17,6 +17,8 @@
*/
package org.apache.hadoop.ozone.om.request.volume.acl;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.RemoveAcl;
+
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import org.apache.hadoop.hdds.scm.storage.CheckedBiFunction;
@@ -28,6 +30,7 @@ import
org.apache.hadoop.ozone.om.response.volume.OMVolumeAclOpResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -112,4 +115,8 @@ public class OMVolumeRemoveAclRequest extends
OMVolumeAclRequest {
getOmRequest());
}
}
+
+ public static String getRequestType() {
+ return RemoveAcl.name() + "-" + ObjectType.VOLUME;
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
index c73e19e..6a0d0f1 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
@@ -17,6 +17,8 @@
*/
package org.apache.hadoop.ozone.om.request.volume.acl;
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.SetAcl;
+
import com.google.common.base.Preconditions;
import org.apache.hadoop.hdds.scm.storage.CheckedBiFunction;
import org.apache.hadoop.ozone.OzoneAcl;
@@ -27,6 +29,7 @@ import
org.apache.hadoop.ozone.om.response.volume.OMVolumeAclOpResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneObj.ObjectType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -109,4 +112,8 @@ public class OMVolumeSetAclRequest extends
OMVolumeAclRequest {
getOmRequest());
}
}
+
+ public static String getRequestType() {
+ return SetAcl.name() + "-" + ObjectType.VOLUME;
+ }
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/BelongsToLayoutVersion.java
similarity index 78%
copy from
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
copy to
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/BelongsToLayoutVersion.java
index 2da8b38..cfee3e6 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/BelongsToLayoutVersion.java
@@ -6,9 +6,9 @@
* 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <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.
@@ -23,13 +23,11 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeatureCatalog.OMLayoutFeature;
-
/**
- * Annotation to specify if an API is backed up by a Layout Feature.
+ * Annotation to mark a class that belongs to a specific Layout Version.
*/
-@Target(ElementType.METHOD)
+@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
-public @interface OMLayoutFeatureAPI {
+public @interface BelongsToLayoutVersion {
OMLayoutFeature value();
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/DisallowedUntilLayoutVersion.java
similarity index 81%
copy from
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
copy to
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/DisallowedUntilLayoutVersion.java
index 2da8b38..c437c1d 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/DisallowedUntilLayoutVersion.java
@@ -23,13 +23,13 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeatureCatalog.OMLayoutFeature;
-
/**
- * Annotation to specify if an API is backed up by a Layout Feature.
+ * Annotation used to "disallow" an API if current layout version does
+ * not include the associated layout feature. Helps to keep the method logic
+ * and upgrade related cross cutting concern separate.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
-public @interface OMLayoutFeatureAPI {
+public @interface DisallowedUntilLayoutVersion {
OMLayoutFeature value();
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeature.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeature.java
new file mode 100644
index 0000000..0d22b01
--- /dev/null
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeature.java
@@ -0,0 +1,63 @@
+/**
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.upgrade;
+
+import java.util.Optional;
+
+import org.apache.hadoop.ozone.upgrade.LayoutFeature;
+
+/**
+ * List of OM Layout features / versions.
+ */
+public enum OMLayoutFeature implements LayoutFeature {
+ INITIAL_VERSION(0, "Initial Layout Version"),
+ CREATE_EC(1, ""),
+ NEW_FEATURE(2, "new feature", new NewOmFeatureUpgradeAction());
+
+ private int layoutVersion;
+ private String description;
+ private Optional<OmUpgradeAction> omUpgradeAction = Optional.empty();
+
+ OMLayoutFeature(final int layoutVersion, String description) {
+ this.layoutVersion = layoutVersion;
+ this.description = description;
+ }
+
+ OMLayoutFeature(final int layoutVersion, String description,
+ OmUpgradeAction upgradeAction) {
+ this.layoutVersion = layoutVersion;
+ this.description = description;
+ omUpgradeAction = Optional.of(upgradeAction);
+ }
+
+ @Override
+ public int layoutVersion() {
+ return layoutVersion;
+ }
+
+ @Override
+ public String description() {
+ return description;
+ }
+
+ @Override
+ public Optional<OmUpgradeAction> onFinalizeAction() {
+ return omUpgradeAction;
+ }
+}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAspect.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAspect.java
index a92e3b4..dbc0259 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAspect.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAspect.java
@@ -28,6 +28,7 @@ import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
+
/**
* 'Aspect' for OM Layout Feature API. All methods annotated with the
* specific annotation will have pre-processing done here to check layout
@@ -36,19 +37,22 @@ import org.aspectj.lang.reflect.MethodSignature;
@Aspect
public class OMLayoutFeatureAspect {
- @Before("@annotation(OMLayoutFeatureAPI) && execution(* *(..))")
+ @Before("@annotation(DisallowedUntilLayoutVersion) && execution(* *(..))")
public void checkLayoutFeature(JoinPoint joinPoint) throws Throwable {
String featureName = ((MethodSignature) joinPoint.getSignature())
- .getMethod().getAnnotation(OMLayoutFeatureAPI.class).value().name();
- LayoutVersionManager lvm = OMLayoutVersionManager.getInstance();
+ .getMethod().getAnnotation(DisallowedUntilLayoutVersion.class)
+ .value().name();
+ LayoutVersionManager lvm = OMLayoutVersionManagerImpl.getInstance();
if (!lvm.isAllowed(featureName)) {
LayoutFeature layoutFeature = lvm.getFeature(featureName);
throw new OMException(String.format("Operation %s cannot be invoked " +
- "before finalization. Current layout version = %d, feature's layout"
+
- " version = %d",
- featureName,
- lvm.getMetadataLayoutVersion(),
- layoutFeature.layoutVersion()), NOT_SUPPORTED_OPERATION);
+ "before finalization. It belongs to the layout feature %s, " +
+ "whose layout version is %d. Current Layout version is %d",
+ joinPoint.getSignature().toShortString(),
+ layoutFeature.name(),
+ layoutFeature.layoutVersion(),
+ lvm.getMetadataLayoutVersion()),
+ NOT_SUPPORTED_OPERATION);
}
}
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureCatalog.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureCatalog.java
deleted file mode 100644
index c5ed27d..0000000
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureCatalog.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * 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.upgrade;
-
-import java.util.Optional;
-
-import org.apache.hadoop.ozone.upgrade.LayoutFeature;
-
-/**
- * Catalog of Ozone Manager features.
- */
-public class OMLayoutFeatureCatalog {
-
- /**
- * List of OM Features.
- */
- public enum OMLayoutFeature implements LayoutFeature {
- INITIAL_VERSION(0, "Initial Layout Version"),
- CREATE_EC(1, ""),
- NEW_FEATURE(2, "new feature", new NewOmFeatureUpgradeAction());
-
-
- private int layoutVersion;
- private String description;
- private Optional<OmUpgradeAction> omUpgradeAction = Optional.empty();
-
- OMLayoutFeature(final int layoutVersion, String description) {
- this.layoutVersion = layoutVersion;
- this.description = description;
- }
-
- OMLayoutFeature(final int layoutVersion, String description,
- OmUpgradeAction upgradeAction) {
- this.layoutVersion = layoutVersion;
- this.description = description;
- omUpgradeAction = Optional.of(upgradeAction);
- }
-
- @Override
- public int layoutVersion() {
- return layoutVersion;
- }
-
- @Override
- public String description() {
- return description;
- }
-
- @Override
- public Optional<OmUpgradeAction> onFinalizeAction() {
- return omUpgradeAction;
- }
- }
-
- /**
- * This is an example of an "API" that uses a new Layout feature (EC) that is
- * not yet supported by the current layout version. The following can be
- * "guarded" by just adding the following annotation, thereby keeping the
- * method logic and upgrade logic separate.
- */
- @OMLayoutFeatureAPI(OMLayoutFeature.CREATE_EC)
- public String ecMethod() {
- // Blah Blah EC Blah....
- return "ec";
- }
-
- /**
- * This is an example of an "API" that uses a Layout feature (EC) that is
- * supported by the current layout version.
- */
- @OMLayoutFeatureAPI(OMLayoutFeature.INITIAL_VERSION)
- public String basicMethod() {
- // Blah Blah Basic Blah....
- return "basic";
- }
-}
-
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureUtil.java
similarity index 53%
copy from
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
copy to
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureUtil.java
index 2da8b38..c237638 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureUtil.java
@@ -18,18 +18,32 @@
package org.apache.hadoop.ozone.om.upgrade;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeatureCatalog.OMLayoutFeature;
+import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.CREATE_EC;
/**
- * Annotation to specify if an API is backed up by a Layout Feature.
+ * Test util class. To be removed.
*/
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface OMLayoutFeatureAPI {
- OMLayoutFeature value();
+public class OMLayoutFeatureUtil {
+
+ /**
+ * This is an example of an "API" that uses a new Layout feature (EC) that is
+ * not yet supported by the current layout version. The following can be
+ * "disallowed" by just adding the following annotation, thereby keeping the
+ * method logic and upgrade logic separate.
+ */
+ @DisallowedUntilLayoutVersion(CREATE_EC)
+ public String ecMethod() {
+ // Blah Blah EC Blah....
+ return "ec";
+ }
+
+ /**
+ * This is an example of an "API" that is
+ * supported by the current layout version.
+ */
+ public String basicMethod() {
+ // Blah Blah Basic Blah....
+ return "basic";
+ }
}
+
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutVersionManager.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutVersionManager.java
deleted file mode 100644
index 2f959a9..0000000
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutVersionManager.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * 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.upgrade;
-
-import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_SUPPORTED_OPERATION;
-
-import org.apache.hadoop.ozone.common.Storage;
-import org.apache.hadoop.ozone.om.OMStorage;
-import org.apache.hadoop.ozone.om.exceptions.OMException;
-import
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeatureCatalog.OMLayoutFeature;
-import org.apache.hadoop.ozone.upgrade.AbstractLayoutVersionManager;
-import org.apache.hadoop.ozone.upgrade.LayoutVersionManager;
-
-import com.google.common.annotations.VisibleForTesting;
-
-/**
- * Class to manage layout versions and features for Ozone Manager.
- */
-public final class OMLayoutVersionManager extends AbstractLayoutVersionManager
{
-
- private static OMLayoutVersionManager omVersionManager;
-
- private OMLayoutVersionManager() {
- }
-
- /**
- * Read only instance to OM Version Manager.
- * @return version manager instance.
- */
- public static synchronized LayoutVersionManager getInstance() {
- if (omVersionManager == null) {
- throw new RuntimeException("OM Layout Version Manager not yet " +
- "initialized.");
- }
- return omVersionManager;
- }
-
-
- /**
- * Initialize OM version manager from storage.
- * @return version manager instance.
- */
- public static synchronized OMLayoutVersionManager initialize(
- OMStorage omStorage)
- throws OMException {
- if (omVersionManager == null) {
- omVersionManager = new OMLayoutVersionManager();
- omVersionManager.init(omStorage);
- }
- return omVersionManager;
- }
-
- /**
- * Initialize the OM Layout Features and current Layout Version.
- * @param storage to read the current layout version.
- * @throws OMException on error.
- */
- private void init(Storage storage) throws OMException {
- init(storage.getLayoutVersion(), OMLayoutFeature.values());
- if (metadataLayoutVersion > softwareLayoutVersion) {
- throw new OMException(
- String.format("Cannot initialize VersionManager. Metadata " +
- "layout version (%d) > software layout version (%d)",
- metadataLayoutVersion, softwareLayoutVersion),
- NOT_SUPPORTED_OPERATION);
- }
- }
-
- @VisibleForTesting
- protected synchronized static void resetLayoutVersionManager() {
- if (omVersionManager != null) {
- omVersionManager.reset();
- omVersionManager = null;
- }
- }
-}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutVersionManagerImpl.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutVersionManagerImpl.java
new file mode 100644
index 0000000..70a8d6b
--- /dev/null
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutVersionManagerImpl.java
@@ -0,0 +1,177 @@
+/**
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.upgrade;
+
+import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_SUPPORTED_OPERATION;
+import static
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.INITIAL_VERSION;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Set;
+
+import org.apache.hadoop.ozone.common.Storage;
+import org.apache.hadoop.ozone.om.OMStorage;
+import org.apache.hadoop.ozone.om.OzoneManager;
+import org.apache.hadoop.ozone.om.exceptions.OMException;
+import org.apache.hadoop.ozone.om.request.OMClientRequest;
+import org.apache.hadoop.ozone.upgrade.AbstractLayoutVersionManager;
+import org.apache.hadoop.ozone.upgrade.LayoutVersionInstanceFactory;
+import org.apache.hadoop.ozone.upgrade.LayoutVersionManager;
+import org.apache.hadoop.ozone.upgrade.VersionFactoryKey;
+import org.reflections.Reflections;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+
+/**
+ * Class to manage layout versions and features for Ozone Manager.
+ */
+public final class OMLayoutVersionManagerImpl
+ extends AbstractLayoutVersionManager implements OmLayoutVersionManager {
+
+ private static final Logger LOG =
+ LoggerFactory.getLogger(OMLayoutVersionManagerImpl.class);
+
+ private static OMLayoutVersionManagerImpl omVersionManager;
+ private LayoutVersionInstanceFactory<Class<? extends OMClientRequest>>
+ requestFactory;
+
+ private OMLayoutVersionManagerImpl() {
+ requestFactory = new LayoutVersionInstanceFactory<>();
+ }
+
+ /**
+ * Read only instance to OM Version Manager.
+ * @return version manager instance.
+ */
+ public static synchronized LayoutVersionManager getInstance() {
+ if (omVersionManager == null) {
+ throw new RuntimeException("OM Layout Version Manager not yet " +
+ "initialized.");
+ }
+ return omVersionManager;
+ }
+
+
+ /**
+ * Initialize OM version manager from storage.
+ * @return version manager instance.
+ */
+ public static synchronized OMLayoutVersionManagerImpl initialize(
+ OMStorage omStorage)
+ throws OMException {
+ if (omVersionManager == null) {
+ omVersionManager = new OMLayoutVersionManagerImpl();
+ omVersionManager.init(omStorage);
+ }
+ return omVersionManager;
+ }
+
+ /**
+ * Initialize the OM Layout Features and current Layout Version.
+ * @param storage to read the current layout version.
+ * @throws OMException on error.
+ */
+ private void init(Storage storage) throws OMException {
+ init(storage.getLayoutVersion(), OMLayoutFeature.values());
+
+ if (metadataLayoutVersion > softwareLayoutVersion) {
+ throw new OMException(
+ String.format("Cannot initialize VersionManager. Metadata " +
+ "layout version (%d) > software layout version (%d)",
+ metadataLayoutVersion, softwareLayoutVersion),
+ NOT_SUPPORTED_OPERATION);
+ }
+ registerOzoneManagerRequests();
+ }
+
+ public void doFinalize(OzoneManager om) {
+ super.doFinalize(om);
+ requestFactory.onFinalize(this);
+ }
+
+ @VisibleForTesting
+ protected synchronized static void resetLayoutVersionManager() {
+ if (omVersionManager != null) {
+ omVersionManager.reset();
+ omVersionManager = null;
+ }
+ }
+
+ public void reset() {
+ requestFactory = null;
+ super.reset();
+ }
+
+ private void registerOzoneManagerRequests() {
+ Reflections reflections = new Reflections(
+ "org.apache.hadoop.ozone.om.request");
+ Set<Class<? extends OMClientRequest>> subTypes =
+ reflections.getSubTypesOf(OMClientRequest.class);
+ try {
+ for (Class<? extends OMClientRequest> requestClass : subTypes) {
+ if (Modifier.isAbstract(requestClass.getModifiers())) {
+ continue;
+ }
+ try {
+ Method getRequestTypeMethod = requestClass.getMethod(
+ "getRequestType");
+ String type = (String) getRequestTypeMethod.invoke(null);
+ LOG.debug("Registering {} with OmVersionFactory.",
+ requestClass.getSimpleName());
+ BelongsToLayoutVersion annotation =
+ requestClass.getAnnotation(BelongsToLayoutVersion.class);
+ if (annotation == null) {
+ registerRequestType(type, INITIAL_VERSION.layoutVersion(),
+ requestClass);
+ } else {
+ registerRequestType(type, annotation.value().layoutVersion(),
+ requestClass);
+ }
+ } catch (NoSuchMethodException nsmEx) {
+ LOG.warn("Found a class {} with request type not defined. ",
+ requestClass.getSimpleName());
+ }
+ }
+ } catch (Exception ex) {
+ LOG.error("Exception registering OM client request.", ex);
+ }
+ }
+
+ private void registerRequestType(String type, int version,
+ Class<? extends OMClientRequest> reqClass) {
+ VersionFactoryKey key = new VersionFactoryKey.Builder()
+ .key(type).version(version).build();
+ requestFactory.register(this, key, reqClass);
+ }
+
+ /**
+ * Given a type and version, get the corresponding request class type.
+ * @param requestType type string
+ * @param version version
+ * @return class type.
+ */
+ @Override
+ public Class< ? extends OMClientRequest> getRequestHandler(String type) {
+ VersionFactoryKey versionFactoryKey = new VersionFactoryKey.Builder()
+ .key(type).build();
+ return requestFactory.get(this, versionFactoryKey);
+ }
+}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OmLayoutVersionManager.java
similarity index 66%
rename from
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
rename to
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OmLayoutVersionManager.java
index 2da8b38..51b5c6c 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeatureAPI.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OmLayoutVersionManager.java
@@ -18,18 +18,12 @@
package org.apache.hadoop.ozone.om.upgrade;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeatureCatalog.OMLayoutFeature;
+import org.apache.hadoop.ozone.om.request.OMClientRequest;
+import org.apache.hadoop.ozone.upgrade.LayoutVersionManager;
/**
- * Annotation to specify if an API is backed up by a Layout Feature.
+ * Read only Interface for OM Layout Version Management.
*/
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface OMLayoutFeatureAPI {
- OMLayoutFeature value();
+public interface OmLayoutVersionManager extends LayoutVersionManager {
+ Class<? extends OMClientRequest> getRequestHandler(String requestType);
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java
index d64db61..0ac655f 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java
@@ -16,6 +16,8 @@
*/
package org.apache.hadoop.ozone.protocolPB;
+import static
org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerRatisUtils.getRequest;
+
import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
@@ -98,7 +100,6 @@ public class OzoneManagerProtocolServerSideTranslatorPB
implements
this.omRatisServer = ratisServer;
dispatcher = new OzoneProtocolMessageDispatcher<>("OzoneProtocol",
metrics, LOG);
-
}
/**
@@ -124,8 +125,7 @@ public class OzoneManagerProtocolServerSideTranslatorPB
implements
} else {
if (omRatisServer.isLeader()) {
try {
- OMClientRequest omClientRequest =
- OzoneManagerRatisUtils.createClientRequest(request);
+ OMClientRequest omClientRequest = getRequest(ozoneManager,
request);
request = omClientRequest.preExecute(ozoneManager);
} catch (IOException ex) {
// As some of the preExecute returns error. So handle here.
@@ -217,8 +217,7 @@ public class OzoneManagerProtocolServerSideTranslatorPB
implements
if (OmUtils.isReadOnly(request)) {
return handler.handleReadRequest(request);
} else {
- OMClientRequest omClientRequest =
- OzoneManagerRatisUtils.createClientRequest(request);
+ OMClientRequest omClientRequest = getRequest(ozoneManager, request);
request = omClientRequest.preExecute(ozoneManager);
index = transactionIndex.incrementAndGet();
omClientResponse = handler.handleWriteRequest(request, index);
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
index 35ab275..dd9e704 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
@@ -78,6 +78,7 @@ import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
import org.apache.hadoop.ozone.security.acl.OzoneObjInfo;
import com.google.common.collect.Lists;
+
import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DBUpdatesRequest;
import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DBUpdatesResponse;
import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.GetAclRequest;
@@ -91,6 +92,7 @@ import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.
import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.MultipartUploadInfo;
import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneAclInfo;
import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.PartInfo;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -222,7 +224,7 @@ public class OzoneManagerRequestHandler implements
RequestHandler {
public OMClientResponse handleWriteRequest(OMRequest omRequest,
long transactionLogIndex) {
OMClientRequest omClientRequest =
- OzoneManagerRatisUtils.createClientRequest(omRequest);
+ OzoneManagerRatisUtils.getRequest(getOzoneManager(), omRequest);
OMClientResponse omClientResponse =
omClientRequest.validateAndUpdateCache(getOzoneManager(),
transactionLogIndex, ozoneManagerDoubleBuffer::add);
@@ -290,6 +292,14 @@ public class OzoneManagerRequestHandler implements
RequestHandler {
throw new OMException("ClientId is null",
OMException.ResultCodes.INVALID_REQUEST);
}
+
+ // Layout version should have been set up the leader while serializing
+ // the request, and hence cannot be null. This version is used by each
+ // node to identify which request handler version to use.
+ if (omRequest.getLayoutVersion() == null) {
+ throw new OMException("LayoutVersion for request is null.",
+ OMException.ResultCodes.INTERNAL_ERROR);
+ }
}
private CheckVolumeAccessResponse checkVolumeAccess(
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestBucketRequest.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestBucketRequest.java
index 7ae82f8..012f2c9 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestBucketRequest.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestBucketRequest.java
@@ -19,6 +19,7 @@
package org.apache.hadoop.ozone.om.request.bucket;
+import org.apache.hadoop.ozone.om.upgrade.OMLayoutVersionManagerImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
@@ -37,6 +38,7 @@ import
org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
@@ -71,6 +73,9 @@ public class TestBucketRequest {
when(ozoneManager.getMetrics()).thenReturn(omMetrics);
when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager);
when(ozoneManager.isRatisEnabled()).thenReturn(true);
+ OMLayoutVersionManagerImpl lvm = mock(OMLayoutVersionManagerImpl.class);
+ when(lvm.getMetadataLayoutVersion()).thenReturn(0);
+ when(ozoneManager.getVersionManager()).thenReturn(lvm);
auditLogger = Mockito.mock(AuditLogger.class);
when(ozoneManager.getAuditLogger()).thenReturn(auditLogger);
Mockito.doNothing().when(auditLogger).logWrite(any(AuditMessage.class));
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
index cb35e2b..52bb164 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
@@ -27,6 +27,7 @@ import org.apache.hadoop.ozone.om.ResolvedBucket;
import org.apache.hadoop.ozone.om.KeyManager;
import org.apache.hadoop.ozone.om.KeyManagerImpl;
import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper;
+import org.apache.hadoop.ozone.om.upgrade.OMLayoutVersionManagerImpl;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs;
import org.junit.After;
import org.junit.Before;
@@ -57,6 +58,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
@@ -107,6 +109,9 @@ public class TestOMKeyRequest {
when(ozoneManager.getMetrics()).thenReturn(omMetrics);
when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager);
when(ozoneManager.getConfiguration()).thenReturn(ozoneConfiguration);
+ OMLayoutVersionManagerImpl lvm = mock(OMLayoutVersionManagerImpl.class);
+ when(lvm.getMetadataLayoutVersion()).thenReturn(0);
+ when(ozoneManager.getVersionManager()).thenReturn(lvm);
when(ozoneManager.isRatisEnabled()).thenReturn(true);
auditLogger = Mockito.mock(AuditLogger.class);
when(ozoneManager.getAuditLogger()).thenReturn(auditLogger);
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/volume/TestOMVolumeRequest.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/volume/TestOMVolumeRequest.java
index d0b2cf0..c2486db 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/volume/TestOMVolumeRequest.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/volume/TestOMVolumeRequest.java
@@ -29,6 +29,7 @@ import org.apache.hadoop.ozone.om.OMMetrics;
import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper;
+import org.apache.hadoop.ozone.om.upgrade.OMLayoutVersionManagerImpl;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.CreateVolumeRequest;
@@ -44,6 +45,7 @@ import org.junit.rules.TemporaryFolder;
import org.mockito.Mockito;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
@@ -67,7 +69,7 @@ public class TestOMVolumeRequest {
@Before
public void setup() throws Exception {
- ozoneManager = Mockito.mock(OzoneManager.class);
+ ozoneManager = mock(OzoneManager.class);
omMetrics = OMMetrics.create();
OzoneConfiguration ozoneConfiguration = new OzoneConfiguration();
ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS,
@@ -76,8 +78,11 @@ public class TestOMVolumeRequest {
when(ozoneManager.getMetrics()).thenReturn(omMetrics);
when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager);
when(ozoneManager.getMaxUserVolumeCount()).thenReturn(10L);
+ OMLayoutVersionManagerImpl lvm = mock(OMLayoutVersionManagerImpl.class);
+ when(lvm.getMetadataLayoutVersion()).thenReturn(0);
+ when(ozoneManager.getVersionManager()).thenReturn(lvm);
when(ozoneManager.isRatisEnabled()).thenReturn(true);
- auditLogger = Mockito.mock(AuditLogger.class);
+ auditLogger = mock(AuditLogger.class);
when(ozoneManager.getAuditLogger()).thenReturn(auditLogger);
Mockito.doNothing().when(auditLogger).logWrite(any(AuditMessage.class));
}
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMLayoutFeatureAspect.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMLayoutFeatureAspect.java
index b68c7c2..d37d0e7 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMLayoutFeatureAspect.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMLayoutFeatureAspect.java
@@ -56,8 +56,8 @@ public class TestOMLayoutFeatureAspect {
*/
@Test
public void testCheckLayoutFeature() throws Exception {
- OMLayoutVersionManager.initialize(new OMStorage(configuration));
- OMLayoutFeatureCatalog testObj = new OMLayoutFeatureCatalog();
+ OMLayoutVersionManagerImpl.initialize(new OMStorage(configuration));
+ OMLayoutFeatureUtil testObj = new OMLayoutFeatureUtil();
try {
testObj.ecMethod();
Assert.fail();
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMVersionManager.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMVersionManager.java
index cfcfe24..9116e59 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMVersionManager.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMVersionManager.java
@@ -18,8 +18,9 @@
package org.apache.hadoop.ozone.om.upgrade;
-import static
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeatureCatalog.OMLayoutFeature.CREATE_EC;
-import static
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeatureCatalog.OMLayoutFeature.INITIAL_VERSION;
+import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_SUPPORTED_OPERATION;
+import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.CREATE_EC;
+import static
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.INITIAL_VERSION;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -30,8 +31,9 @@ import java.io.IOException;
import org.apache.hadoop.ozone.om.OMStorage;
import org.apache.hadoop.ozone.om.OzoneManager;
-import
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeatureCatalog.OMLayoutFeature;
-import org.apache.hadoop.ozone.upgrade.LayoutFeature;
+import org.apache.hadoop.ozone.om.exceptions.OMException;
+import org.junit.After;
+import org.junit.Assert;
import org.junit.Test;
/**
@@ -39,12 +41,17 @@ import org.junit.Test;
*/
public class TestOMVersionManager {
+ @After
+ public void cleanup() {
+ OMLayoutVersionManagerImpl.resetLayoutVersionManager();
+ }
+
@Test
public void testOMLayoutVersionManager() throws IOException {
OMStorage omStorage = mock(OMStorage.class);
when(omStorage.getLayoutVersion()).thenReturn(0);
- OMLayoutVersionManager omVersionManager =
- OMLayoutVersionManager.initialize(omStorage);
+ OMLayoutVersionManagerImpl omVersionManager =
+ OMLayoutVersionManagerImpl.initialize(omStorage);
assertTrue(omVersionManager.isAllowed(INITIAL_VERSION));
assertFalse(omVersionManager.isAllowed(CREATE_EC));
assertEquals(0, omVersionManager.getMetadataLayoutVersion());
@@ -55,10 +62,38 @@ public class TestOMVersionManager {
}
@Test
+ public void testOMLayoutVersionManagerInitError() {
+ OMStorage omStorage = mock(OMStorage.class);
+ when(omStorage.getLayoutVersion()).thenReturn(
+ OMLayoutFeature.values()[OMLayoutFeature.values().length - 1]
+ .layoutVersion() + 1);
+ try {
+ OMLayoutVersionManagerImpl.initialize(omStorage);
+ Assert.fail();
+ } catch (OMException ex) {
+ assertEquals(NOT_SUPPORTED_OPERATION, ex.getResult());
+ }
+ }
+
+ @Test
+ public void testOMLayoutVersionManagerReset() throws IOException {
+ OMStorage omStorage = mock(OMStorage.class);
+ when(omStorage.getLayoutVersion()).thenReturn(0);
+ OMLayoutVersionManagerImpl omVersionManager =
+ OMLayoutVersionManagerImpl.initialize(omStorage);
+ int numLayoutVersions = OMLayoutFeature.values().length;
+ assertEquals(
+ OMLayoutFeature.values()[numLayoutVersions - 1].layoutVersion(),
+ omVersionManager.getSoftwareLayoutVersion());
+ OMLayoutVersionManagerImpl.resetLayoutVersionManager();
+ assertEquals(0, omVersionManager.getSoftwareLayoutVersion());
+ }
+
+ @Test
public void testOMLayoutFeatureCatalog() {
OMLayoutFeature[] values = OMLayoutFeature.values();
int currVersion = Integer.MIN_VALUE;
- for (LayoutFeature lf : values) {
+ for (OMLayoutFeature lf : values) {
assertTrue(currVersion <= lf.layoutVersion());
currVersion = lf.layoutVersion();
}
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOmVersionManagerRequestFactory.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOmVersionManagerRequestFactory.java
new file mode 100644
index 0000000..dffddd1
--- /dev/null
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOmVersionManagerRequestFactory.java
@@ -0,0 +1,122 @@
+/**
+ * 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.upgrade;
+
+import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CreateKey;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.hadoop.ozone.om.OMStorage;
+import org.apache.hadoop.ozone.om.OzoneManager;
+import org.apache.hadoop.ozone.om.exceptions.OMException;
+import org.apache.hadoop.ozone.om.request.OMClientRequest;
+import org.apache.hadoop.ozone.om.request.key.OMECKeyCreateRequest;
+import org.apache.hadoop.ozone.om.request.key.OMKeyCreateRequest;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.reflections.Reflections;
+
+/**
+ * Test OmVersionFactory.
+ */
+public class TestOmVersionManagerRequestFactory {
+
+ private static OMLayoutVersionManagerImpl omVersionManager;
+
+ @BeforeClass
+ public static void setup() throws OMException {
+ OMStorage omStorage = mock(OMStorage.class);
+ when(omStorage.getLayoutVersion()).thenReturn(0);
+ omVersionManager = OMLayoutVersionManagerImpl.initialize(omStorage);
+ }
+
+ @Test
+ public void testKeyCreateRequest() throws Exception {
+
+ // Try getting v1 of 'CreateKey'.
+ Class<? extends OMClientRequest> requestType =
+ omVersionManager.getRequestHandler(CreateKey.name());
+ Assert.assertEquals(requestType, OMKeyCreateRequest.class);
+
+ // Finalize the version manager.
+ omVersionManager.doFinalize(mock(OzoneManager.class));
+
+ // Try getting 'CreateKey' again. Should return CreateECKey.
+ requestType = omVersionManager.getRequestHandler(CreateKey.name());
+ Assert.assertEquals(requestType, OMECKeyCreateRequest.class);
+ }
+
+ @Test
+ public void testAllOMRequestClassesHaveGetRequestTypeMethod()
+ throws Exception {
+ Reflections reflections = new Reflections(
+ "org.apache.hadoop.ozone.om.request");
+ Set<Class<? extends OMClientRequest>> subTypes =
+ reflections.getSubTypesOf(OMClientRequest.class);
+ List<Class<? extends OMClientRequest>> collect = subTypes.stream()
+ .filter(c -> !Modifier.isAbstract(c.getModifiers()))
+ .collect(Collectors.toList());
+
+ for (Class<? extends OMClientRequest> c : collect) {
+ Method getRequestTypeMethod = null;
+ try {
+ getRequestTypeMethod = c.getMethod("getRequestType");
+ } catch (NoSuchMethodException nsmEx) {
+ Assert.fail(String.format(
+ "%s does not have the 'getRequestType' method " +
+ "which should be defined or inherited for every OM request class.",
+ c));
+ }
+ String type = (String) getRequestTypeMethod.invoke(null);
+ Assert.assertNotNull(String.format("Cannot get handler for %s", type),
+ omVersionManager.getRequestHandler(type));
+ }
+ }
+
+ @Test
+ public void testOmClientRequestHasExpectedConstructor()
+ throws NoSuchMethodException {
+ Reflections reflections = new Reflections(
+ "org.apache.hadoop.ozone.om.request");
+ Set<Class<? extends OMClientRequest>> subTypes =
+ reflections.getSubTypesOf(OMClientRequest.class);
+
+ for (Class<? extends OMClientRequest> requestClass : subTypes) {
+ if (Modifier.isAbstract(requestClass.getModifiers())) {
+ continue;
+ }
+ Method getRequestTypeMethod = requestClass.getMethod(
+ "getRequestType");
+ Assert.assertNotNull(getRequestTypeMethod);
+
+ Constructor<? extends OMClientRequest> constructorWithOmRequestArg =
+ requestClass.getDeclaredConstructor(OMRequest.class);
+ Assert.assertNotNull(constructorWithOmRequestArg);
+ }
+ }
+}
diff --git a/hadoop-ozone/s3gateway/pom.xml b/hadoop-ozone/s3gateway/pom.xml
index 4a62fc7..588ecc8 100644
--- a/hadoop-ozone/s3gateway/pom.xml
+++ b/hadoop-ozone/s3gateway/pom.xml
@@ -37,6 +37,11 @@
<scope>compile</scope>
</dependency>
<dependency>
+ <groupId>org.javassist</groupId>
+ <artifactId>javassist</artifactId>
+ <version>3.26.0-GA</version>
+ </dependency>
+ <dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdds-test-utils</artifactId>
<scope>test</scope>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]