This is an automated email from the ASF dual-hosted git repository.
weichiu pushed a commit to branch HDDS-7593
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/HDDS-7593 by this push:
new cc66490524 HDDS-11258. [hsync] Add new OM layout version. (#7013)
cc66490524 is described below
commit cc6649052460e408a56624e5f6aa68623701149b
Author: Wei-Chiu Chuang <[email protected]>
AuthorDate: Thu Aug 1 22:52:46 2024 -0700
HDDS-11258. [hsync] Add new OM layout version. (#7013)
---
.../java/org/apache/hadoop/fs/ozone/TestHSync.java | 81 ++++++++++++++++++++++
.../om/request/file/OMRecoverLeaseRequest.java | 3 +
.../ozone/om/request/key/OMKeyCommitRequest.java | 34 +++++++++
.../hadoop/ozone/om/upgrade/OMLayoutFeature.java | 3 +-
.../protocolPB/OzoneManagerRequestHandler.java | 2 +
5 files changed, 122 insertions(+), 1 deletion(-)
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestHSync.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestHSync.java
index 56d38f9f02..ca19d90f37 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestHSync.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestHSync.java
@@ -90,7 +90,10 @@ import org.apache.hadoop.ozone.om.helpers.BucketLayout;
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
import org.apache.hadoop.ozone.om.helpers.RepeatedOmKeyInfo;
+import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
import org.apache.hadoop.ozone.om.service.OpenKeyCleanupService;
+import org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature;
+import org.apache.hadoop.ozone.upgrade.UpgradeFinalizer;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.util.Time;
import org.apache.ozone.test.GenericTestUtils;
@@ -119,6 +122,8 @@ import static
org.apache.hadoop.ozone.OzoneConsts.OZONE_URI_DELIMITER;
import static org.apache.hadoop.ozone.OzoneConsts.OZONE_URI_SCHEME;
import static org.apache.hadoop.ozone.TestDataUtil.cleanupDeletedTable;
import static org.apache.hadoop.ozone.TestDataUtil.cleanupOpenKeyTable;
+import static
org.apache.hadoop.ozone.admin.scm.FinalizeUpgradeCommandUtil.isDone;
+import static
org.apache.hadoop.ozone.admin.scm.FinalizeUpgradeCommandUtil.isStarting;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT;
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ADDRESS_KEY;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_RATIS_ENABLE_KEY;
@@ -126,6 +131,9 @@ import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_DIR_DELETING_SERVICE
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_OPEN_KEY_CLEANUP_SERVICE_INTERVAL;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_OPEN_KEY_EXPIRE_THRESHOLD;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_LEASE_HARD_LIMIT;
+import static
org.apache.hadoop.ozone.om.OmUpgradeConfig.ConfigStrings.OZONE_OM_INIT_DEFAULT_LAYOUT_VERSION;
+import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_SUPPORTED_OPERATION_PRIOR_FINALIZATION;
+import static org.apache.ozone.test.LambdaTestUtils.await;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
@@ -163,6 +171,9 @@ public class TestHSync {
private static OpenKeyCleanupService openKeyCleanupService;
+ private static final int POLL_INTERVAL_MILLIS = 500;
+ private static final int POLL_MAX_WAIT_MILLIS = 120_000;
+
@BeforeAll
public static void init() throws Exception {
final BucketLayout layout = BUCKET_LAYOUT;
@@ -184,6 +195,7 @@ public class TestHSync {
CONF.setTimeDuration(OZONE_OM_LEASE_HARD_LIMIT,
EXPIRE_THRESHOLD_MS, TimeUnit.MILLISECONDS);
CONF.set(OzoneConfigKeys.OZONE_OM_LEASE_SOFT_LIMIT, "0s");
+ CONF.setInt(OZONE_OM_INIT_DEFAULT_LAYOUT_VERSION,
OMLayoutFeature.QUOTA.layoutVersion());
ClientConfigForTesting.newBuilder(StorageUnit.BYTES)
.setBlockSize(BLOCK_SIZE)
@@ -216,6 +228,9 @@ public class TestHSync {
openKeyCleanupService =
(OpenKeyCleanupService)
cluster.getOzoneManager().getKeyManager().getOpenKeyCleanupService();
openKeyCleanupService.suspend();
+
+ preFinalizationChecks();
+ finalizeOMUpgrade();
}
@AfterAll
@@ -226,6 +241,72 @@ public class TestHSync {
}
}
+ private static void preFinalizationChecks() throws IOException {
+ final String rootPath = String.format("%s://%s/",
+ OZONE_OFS_URI_SCHEME, CONF.get(OZONE_OM_ADDRESS_KEY));
+ CONF.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, rootPath);
+
+ final String dir = OZONE_ROOT + bucket.getVolumeName()
+ + OZONE_URI_DELIMITER + bucket.getName();
+
+ final Path file = new Path(dir, "pre-finalization");
+ try (RootedOzoneFileSystem fs =
(RootedOzoneFileSystem)FileSystem.get(CONF)) {
+ try (FSDataOutputStream outputStream = fs.create(file, true)) {
+ OMException omException = assertThrows(OMException.class,
outputStream::hsync);
+ assertFinalizationExceptionForHsyncLeaseRecovery(omException);
+ }
+ final OzoneManagerProtocol omClient = client.getObjectStore()
+ .getClientProxy().getOzoneManagerClient();
+ OMException omException = assertThrows(OMException.class,
+ () -> omClient.listOpenFiles("", 100, ""));
+ assertFinalizationException(omException);
+
+ omException = assertThrows(OMException.class,
+ () -> fs.recoverLease(file));
+ assertFinalizationException(omException);
+
+ fs.delete(file, false);
+ }
+ }
+
+ private static void
assertFinalizationExceptionForHsyncLeaseRecovery(OMException omException) {
+ assertEquals(NOT_SUPPORTED_OPERATION_PRIOR_FINALIZATION,
+ omException.getResult());
+ assertThat(omException.getMessage())
+ .contains("Cluster does not have the HBase support feature finalized
yet");
+ }
+
+ private static void assertFinalizationException(OMException omException) {
+ assertEquals(NOT_SUPPORTED_OPERATION_PRIOR_FINALIZATION,
+ omException.getResult());
+ assertThat(omException.getMessage())
+ .contains("cannot be invoked before finalization.");
+ }
+
+ /**
+ * Trigger OM upgrade finalization from the client and block until completion
+ * (status FINALIZATION_DONE).
+ */
+ private static void finalizeOMUpgrade() throws Exception {
+ // Trigger OM upgrade finalization. Ref: FinalizeUpgradeSubCommand#call
+ final OzoneManagerProtocol omClient = client.getObjectStore()
+ .getClientProxy().getOzoneManagerClient();
+ final String upgradeClientID = "Test-Upgrade-Client-" + UUID.randomUUID();
+ UpgradeFinalizer.StatusAndMessages finalizationResponse =
+ omClient.finalizeUpgrade(upgradeClientID);
+
+ // The status should transition as soon as the client call above returns
+ assertTrue(isStarting(finalizationResponse.status()));
+ // Wait for the finalization to be marked as done.
+ // 10s timeout should be plenty.
+ await(POLL_MAX_WAIT_MILLIS, POLL_INTERVAL_MILLIS, () -> {
+ final UpgradeFinalizer.StatusAndMessages progress =
+ omClient.queryUpgradeFinalizationProgress(
+ upgradeClientID, false, false);
+ return isDone(progress.status());
+ });
+ }
+
@Test
// Making this the first test to be run to avoid db key composition headaches
@Order(1)
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
index 2d13140cac..e657719eb7 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
@@ -37,6 +37,7 @@ import org.apache.hadoop.ozone.om.request.key.OMKeyRequest;
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.om.response.file.OMRecoverLeaseResponse;
+import org.apache.hadoop.ozone.om.upgrade.DisallowedUntilLayoutVersion;
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.RecoverLeaseRequest;
@@ -46,6 +47,7 @@ import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.BlockTokenSecretP
import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.BlockTokenSecretProto.AccessModeProto.WRITE;
import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_OM_LEASE_SOFT_LIMIT;
import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_OM_LEASE_SOFT_LIMIT_DEFAULT;
+import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.HBASE_SUPPORT;
import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.RecoverLease;
import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
@@ -101,6 +103,7 @@ public class OMRecoverLeaseRequest extends OMKeyRequest {
}
@Override
+ @DisallowedUntilLayoutVersion(HBASE_SUPPORT)
public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
OMRequest request = super.preExecute(ozoneManager);
RecoverLeaseRequest recoverLeaseRequest = request.getRecoverLeaseRequest();
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 6235099a11..b27e8430f0 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
@@ -568,6 +568,40 @@ public class OMKeyCommitRequest extends OMKeyRequest {
return req;
}
+ /**
+ * Validates key commit requests.
+ * We do not want to allow clients to perform lease recovery requests
+ * until the cluster has finalized the HBase support feature.
+ *
+ * @param req - the request to validate
+ * @param ctx - the validation context
+ * @return the validated request
+ * @throws OMException if the request is invalid
+ */
+ @RequestFeatureValidator(
+ conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION,
+ processingPhase = RequestProcessingPhase.PRE_PROCESS,
+ requestType = Type.CommitKey
+ )
+
+ public static OMRequest disallowRecovery(
+ OMRequest req, ValidationContext ctx) throws OMException {
+ if (!ctx.versionManager()
+ .isAllowed(OMLayoutFeature.HBASE_SUPPORT)) {
+ CommitKeyRequest commitKeyRequest = req.getCommitKeyRequest();
+ boolean isRecovery = commitKeyRequest.hasRecovery() &&
+ commitKeyRequest.getRecovery();
+ if (isRecovery) {
+ throw new OMException("Cluster does not have the HBase support "
+ + "feature finalized yet, but the request contains"
+ + " an recovery field. Rejecting the request,"
+ + " please finalize the cluster upgrade and then try again.",
+
OMException.ResultCodes.NOT_SUPPORTED_OPERATION_PRIOR_FINALIZATION);
+ }
+ }
+ return req;
+ }
+
protected void validateAtomicRewrite(OmKeyInfo existing, OmKeyInfo toCommit,
Map<String, String> auditMap)
throws OMException {
if (toCommit.getExpectedDataGeneration() != null) {
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
index d931c128a9..7cdff8f5c1 100644
---
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
@@ -44,7 +44,8 @@ public enum OMLayoutFeature implements LayoutFeature {
FILESYSTEM_SNAPSHOT(5, "Ozone version supporting snapshot"),
- QUOTA(6, "Ozone quota re-calculate");
+ QUOTA(6, "Ozone quota re-calculate"),
+ HBASE_SUPPORT(7, "Full support of hsync, lease recovery and listOpenFiles
APIs for HBase");
/////////////////////////////// /////////////////////////////
// Example OM Layout Feature with Actions
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 75eeaeac4e..631345d4f3 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
@@ -144,6 +144,7 @@ import org.apache.hadoop.ozone.security.acl.OzoneObjInfo;
import com.google.common.collect.Lists;
+import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.HBASE_SUPPORT;
import static
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.MULTITENANCY_SCHEMA;
import static
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.FILESYSTEM_SNAPSHOT;
import static
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DBUpdatesRequest;
@@ -914,6 +915,7 @@ public class OzoneManagerRequestHandler implements
RequestHandler {
return resp;
}
+ @DisallowedUntilLayoutVersion(HBASE_SUPPORT)
private ListOpenFilesResponse listOpenFiles(ListOpenFilesRequest req,
int clientVersion)
throws IOException {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]