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/ozone.git


The following commit(s) were added to refs/heads/HDDS-3698-upgrade by this push:
     new 2489968  HDDS-4540. Add a new OM admin operation to submit the 
OMPrepareRequest. (#1664)
2489968 is described below

commit 2489968f3b2340d0a7edb027d18ccefd50476b1b
Author: avijayanhwx <[email protected]>
AuthorDate: Wed Dec 9 11:53:52 2020 -0800

    HDDS-4540. Add a new OM admin operation to submit the OMPrepareRequest. 
(#1664)
---
 .../ozone/om/protocol/OzoneManagerProtocol.java    |  15 +++
 ...OzoneManagerProtocolClientSideTranslatorPB.java |  27 +++++
 .../hadoop/ozone/om/TestOzoneManagerPrepare.java   | 113 +++++----------------
 .../src/main/proto/OmClientProtocol.proto          |   5 +
 .../ozone/om/request/upgrade/OMPrepareRequest.java |  35 ++++---
 .../org/apache/hadoop/ozone/admin/om/OMAdmin.java  |   3 +-
 .../hadoop/ozone/admin/om/PrepareSubCommand.java   |  79 ++++++++++++++
 7 files changed, 173 insertions(+), 104 deletions(-)

diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java
index 9fbf483..1bf9434 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OzoneManagerProtocol.java
@@ -587,4 +587,19 @@ public interface OzoneManagerProtocol
     return false;
   }
 
+  /**
+   *
+   * @param txnApplyWaitTimeoutSeconds Max time in SECONDS to wait for all
+   *                                   transactions before the prepare request
+   *                                   to be applied to the OM DB.
+   * @param txnApplyCheckIntervalSeconds Time in SECONDS to wait between
+   *                                     successive checks for all transactions
+   *                                     to be applied to the OM DB.
+   * @return
+   */
+  default long prepareOzoneManager(
+      long txnApplyWaitTimeoutSeconds, long txnApplyCheckIntervalSeconds)
+      throws IOException {
+    return -1;
+  }
 }
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
index cd4064b..b6ea86a 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
@@ -1547,6 +1547,33 @@ public final class 
OzoneManagerProtocolClientSideTranslatorPB
     return recoverResponse.getResponse();
   }
 
+  @Override
+  public long prepareOzoneManager(
+      long txnApplyWaitTimeoutSeconds, long txnApplyCheckIntervalSeconds)
+      throws IOException {
+    Preconditions.checkArgument(txnApplyWaitTimeoutSeconds > 0,
+        "txnApplyWaitTimeoutSeconds has to be > zero");
+
+    Preconditions.checkArgument(txnApplyCheckIntervalSeconds > 0 &&
+            txnApplyCheckIntervalSeconds < txnApplyWaitTimeoutSeconds / 2,
+        "txnApplyCheckIntervalSeconds has to be > zero and < half "
+            + "of txnApplyWaitTimeoutSeconds to make sense.");
+
+    PrepareRequest prepareRequest =
+        PrepareRequest.newBuilder().setArgs(
+            PrepareRequestArgs.newBuilder()
+                .setTxnApplyWaitTimeoutSeconds(txnApplyWaitTimeoutSeconds)
+                .setTxnApplyCheckIntervalSeconds(txnApplyCheckIntervalSeconds)
+                .build()).build();
+
+    OMRequest omRequest = createOMRequest(Type.Prepare)
+        .setPrepareRequest(prepareRequest).build();
+
+    PrepareResponse prepareResponse =
+        handleError(submitRequest(omRequest)).getPrepareResponse();
+    return prepareResponse.getTxnID();
+  }
+
   @VisibleForTesting
   public OmTransport getTransport() {
     return transport;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerPrepare.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerPrepare.java
index 711ec2a..20aff56 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerPrepare.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerPrepare.java
@@ -35,20 +35,13 @@ import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.client.OzoneClientFactory;
 import org.apache.hadoop.ozone.client.OzoneVolume;
 import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
+import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
 import org.apache.hadoop.ozone.container.ContainerTestHelper;
 import org.apache.hadoop.ozone.container.TestHelper;
-import org.apache.hadoop.ozone.om.helpers.OMRatisHelper;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
+import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
 import org.apache.hadoop.ozone.om.ratis.OMTransactionInfo;
-import org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer;
-import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
-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.PrepareRequest;
 import org.apache.hadoop.test.LambdaTestUtils;
-import org.apache.ratis.protocol.ClientId;
-import org.apache.ratis.protocol.Message;
-import org.apache.ratis.protocol.RaftClientRequest;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -59,6 +52,8 @@ public class TestOzoneManagerPrepare extends 
TestOzoneManagerHA {
 
   private final String keyPrefix = "key";
   private final int timeoutMillis = 30000;
+  private final static Long PREPARE_FLUSH_WAIT_TIMEOUT_SECONDS = 300L;
+  private final static Long PREPARE_FLUSH_INTERVAL_SECONDS = 5L;
 
   /**
    * Calls prepare on all OMs when they have no transaction information.
@@ -67,22 +62,17 @@ public class TestOzoneManagerPrepare extends 
TestOzoneManagerHA {
   @Test
   public void testPrepareWithoutTransactions() throws Exception {
     MiniOzoneHAClusterImpl cluster = getCluster();
-    OzoneManager leader = cluster.getOMLeader();
-    OMResponse omResponse = submitPrepareRequest(leader.getOmRatisServer());
-    // Get the log index of the prepare request.
+    ClientProtocol ozClient = OzoneClientFactory.getRpcClient(getConf())
+        .getObjectStore().getClientProxy();
     long prepareRequestLogIndex =
-        omResponse.getPrepareResponse().getTxnID();
+        ozClient.getOzoneManagerClient().prepareOzoneManager(
+            PREPARE_FLUSH_WAIT_TIMEOUT_SECONDS, 
PREPARE_FLUSH_INTERVAL_SECONDS);
 
     // Prepare response processing is included in the snapshot,
     // giving index of 1.
     Assert.assertEquals(1, prepareRequestLogIndex);
     for (OzoneManager om: cluster.getOzoneManagersList()) {
-      // Leader should be prepared as soon as it returns response.
-      if (om == leader) {
-        checkPrepared(om, prepareRequestLogIndex);
-      } else {
-        waitAndCheckPrepared(om, prepareRequestLogIndex);
-      }
+      waitAndCheckPrepared(om, prepareRequestLogIndex);
     }
   }
 
@@ -117,21 +107,15 @@ public class TestOzoneManagerPrepare extends 
TestOzoneManagerHA {
           () -> logFilesPresentInRatisPeer(om));
     }
 
-    OzoneManager leader = cluster.getOMLeader();
-    OMResponse omResponse = submitPrepareRequest(leader.getOmRatisServer());
-    // Get the log index of the prepare request.
+    OzoneManagerProtocol ozoneManagerClient =
+        ozClient.getObjectStore().getClientProxy().getOzoneManagerClient();
     long prepareRequestLogIndex =
-        omResponse.getPrepareResponse().getTxnID();
+        ozoneManagerClient.prepareOzoneManager(
+            PREPARE_FLUSH_WAIT_TIMEOUT_SECONDS, 
PREPARE_FLUSH_INTERVAL_SECONDS);
 
     // Make sure all OMs are prepared and all OMs still have their data.
     for (OzoneManager om: cluster.getOzoneManagersList()) {
-      // Leader should be prepared as soon as it returns response.
-      if (om == leader) {
-        checkPrepared(om, prepareRequestLogIndex);
-      } else {
-        waitAndCheckPrepared(om, prepareRequestLogIndex);
-      }
-
+      waitAndCheckPrepared(om, prepareRequestLogIndex);
       List<OmKeyInfo> keys = om.getMetadataManager().listKeys(volumeName,
           bucketName, null, keyPrefix, 100);
 
@@ -152,8 +136,7 @@ public class TestOzoneManagerPrepare extends 
TestOzoneManagerHA {
    * Checks that third OM received all transactions and is prepared.
    * @throws Exception
    */
-  // TODO: Fix this test so it passes.
-  //   @Test
+//  @Test
   public void testPrepareDownedOM() throws Exception {
     // Index of the OM that will be shut down during this test.
     final int shutdownOMIndex = 2;
@@ -196,18 +179,14 @@ public class TestOzoneManagerPrepare extends 
TestOzoneManagerHA {
       writtenKeys.add(keyName);
     }
 
-    // Submit prepare request via Ratis.
-    OzoneManager leaderOM = cluster.getOMLeader();
-    long prepareIndex = submitPrepareRequest(leaderOM.getOmRatisServer())
-            .getPrepareResponse()
-            .getTxnID();
+    OzoneManagerProtocol ozoneManagerClient =
+        ozClient.getObjectStore().getClientProxy().getOzoneManagerClient();
+    long prepareIndex = ozoneManagerClient.prepareOzoneManager(
+        PREPARE_FLUSH_WAIT_TIMEOUT_SECONDS, PREPARE_FLUSH_INTERVAL_SECONDS);
 
     // Check that the two live OMs are prepared.
     for (OzoneManager om: cluster.getOzoneManagersList()) {
-      if (om == leaderOM) {
-        // Leader should have been prepared after we got the response.
-        checkPrepared(om, prepareIndex);
-      } else if (om != downedOM) {
+      if (om != downedOM) {
         // Follower may still be applying transactions.
         waitAndCheckPrepared(om, prepareIndex);
       }
@@ -217,15 +196,11 @@ public class TestOzoneManagerPrepare extends 
TestOzoneManagerHA {
     // Since prepare was the last Ratis transaction, it should have all data
     // it missed once it receives the prepare transaction.
     cluster.restartOzoneManager(downedOM, true);
-    // Wait for other OMs to catch this one up on transactions.
-    LambdaTestUtils.await(timeoutMillis, 1000,
-        () -> downedOM.getRatisSnapshotIndex() == prepareIndex);
-    checkPrepared(downedOM, prepareIndex);
+    LambdaTestUtils.await(timeoutMillis, 2000,
+        () -> checkPrepared(downedOM, prepareIndex));
 
     // Make sure all OMs are prepared and still have data.
     for (OzoneManager om: cluster.getOzoneManagersList()) {
-      waitAndCheckPrepared(om, prepareIndex);
-
       List<OmKeyInfo> readKeys = om.getMetadataManager().listKeys(volumeName,
           bucketName, null, keyPrefix, 100);
 
@@ -266,61 +241,23 @@ public class TestOzoneManagerPrepare extends 
TestOzoneManagerHA {
     keyStream.close();
   }
 
-  private OMRequest buildPrepareRequest() {
-    PrepareRequest requestProto = PrepareRequest.newBuilder().build();
-
-    return OMRequest.newBuilder()
-        .setPrepareRequest(requestProto)
-        .setCmdType(Type.Prepare)
-        .setClientId(UUID.randomUUID().toString())
-        .build();
-  }
-
   private void waitAndCheckPrepared(OzoneManager om,
       long prepareRequestLogIndex) throws Exception {
     // Log files are deleted after the snapshot is taken,
     // So once log files have been deleted, OM should be prepared.
     LambdaTestUtils.await(timeoutMillis, 1000,
         () -> !logFilesPresentInRatisPeer(om));
-    checkPrepared(om, prepareRequestLogIndex);
+    Assert.assertTrue(checkPrepared(om, prepareRequestLogIndex));
   }
 
-  private void checkPrepared(OzoneManager om, long prepareRequestLogIndex)
+  private boolean checkPrepared(OzoneManager om, long prepareRequestLogIndex)
       throws Exception {
-    Assert.assertFalse(logFilesPresentInRatisPeer(om));
-
     // If no transactions have been persisted to the DB, transaction info
     // will be null, not zero.
     // This will cause a null pointer exception if we use
     // OzoneManager#getRatisSnapshotIndex to get the index from the DB.
     OMTransactionInfo txnInfo = om.getMetadataManager()
         .getTransactionInfoTable().get(TRANSACTION_INFO_KEY);
-    if (prepareRequestLogIndex == 0) {
-      Assert.assertNull(txnInfo);
-    } else {
-      Assert.assertEquals(txnInfo.getTransactionIndex(),
-          prepareRequestLogIndex);
-    }
-  }
-
-  private OMResponse submitPrepareRequest(OzoneManagerRatisServer server)
-      throws Exception {
-    PrepareRequest requestProto = PrepareRequest.newBuilder().build();
-
-    OMRequest omRequest = OMRequest.newBuilder()
-        .setPrepareRequest(requestProto)
-        .setCmdType(Type.Prepare)
-        .setClientId(UUID.randomUUID().toString())
-        .build();
-
-    RaftClientRequest raftClientRequest = new RaftClientRequest(
-        ClientId.randomId(),
-        server.getRaftPeerId(),
-        server.getRaftGroupId(),
-        0,
-        Message.valueOf(OMRatisHelper.convertRequestToByteString(omRequest)),
-        RaftClientRequest.writeRequestType(), null);
-
-    return server.submitRequest(omRequest, raftClientRequest);
+    return (txnInfo.getTransactionIndex() == prepareRequestLogIndex);
   }
 }
\ 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 5a90a75..c9eba9d 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -1079,7 +1079,12 @@ message FinalizeUpgradeProgressResponse {
 }
 
 message PrepareRequest {
+    required PrepareRequestArgs args = 1;
+}
 
+message PrepareRequestArgs {
+    optional uint64 txnApplyWaitTimeoutSeconds = 1 [default = 300];
+    optional uint64 txnApplyCheckIntervalSeconds = 2 [default = 5];
 }
 
 message PrepareResponse {
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMPrepareRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMPrepareRequest.java
index 021d7df..84d7122 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMPrepareRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/upgrade/OMPrepareRequest.java
@@ -27,6 +27,7 @@ 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.OMPrepareResponse;
+import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.PrepareResponse;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
@@ -57,14 +58,6 @@ public class OMPrepareRequest extends OMClientRequest {
   private static final Logger LOG =
       LoggerFactory.getLogger(OMPrepareRequest.class);
 
-  // Allow double buffer this many seconds to flush all transactions before
-  // returning an error to the caller.
-  private static final Duration DOUBLE_BUFFER_FLUSH_TIMEOUT =
-      Duration.of(5, ChronoUnit.MINUTES);
-  // Time between checks to see if double buffer finished flushing.
-  private static final Duration DOUBLE_BUFFER_FLUSH_CHECK_INTERVAL =
-      Duration.of(1, ChronoUnit.SECONDS);
-
   public OMPrepareRequest(OMRequest omRequest) {
     super(omRequest);
   }
@@ -76,11 +69,22 @@ public class OMPrepareRequest extends OMClientRequest {
 
     LOG.info("Received prepare request with log index {}", 
transactionLogIndex);
 
+    OMRequest omRequest = getOmRequest();
+    OzoneManagerProtocolProtos.PrepareRequestArgs args =
+        omRequest.getPrepareRequest().getArgs();
     OMResponse.Builder responseBuilder =
-        OmResponseUtil.getOMResponseBuilder(getOmRequest());
+        OmResponseUtil.getOMResponseBuilder(omRequest);
     responseBuilder.setCmdType(Type.Prepare);
     OMClientResponse response = null;
 
+    // Allow double buffer this many seconds to flush all transactions before
+    // returning an error to the caller.
+    Duration flushTimeout =
+        Duration.of(args.getTxnApplyWaitTimeoutSeconds(), ChronoUnit.SECONDS);
+    // Time between checks to see if double buffer finished flushing.
+    Duration flushCheckInterval =
+        Duration.of(args.getTxnApplyCheckIntervalSeconds(), 
ChronoUnit.SECONDS);
+
     try {
       // Create response.
       PrepareResponse omResponse = PrepareResponse.newBuilder()
@@ -106,7 +110,8 @@ public class OMPrepareRequest extends OMClientRequest {
       // already, once this index reaches the state machine, we know all
       // transactions have been flushed.
       waitForLogIndex(transactionLogIndex,
-          ozoneManager.getMetadataManager(), serverImpl);
+          ozoneManager.getMetadataManager(), serverImpl,
+          flushTimeout, flushCheckInterval);
       takeSnapshotAndPurgeLogs(serverImpl);
 
       // TODO: Create marker file with txn index.
@@ -132,11 +137,11 @@ public class OMPrepareRequest extends OMClientRequest {
    * disk, and to be updated in memory in Ratis.
    */
   private static void waitForLogIndex(long indexToWaitFor,
-      OMMetadataManager metadataManager, RaftServerImpl server)
+      OMMetadataManager metadataManager, RaftServerImpl server,
+      Duration flushTimeout, Duration flushCheckInterval)
       throws InterruptedException, IOException {
 
-    long endTime = System.currentTimeMillis() +
-        DOUBLE_BUFFER_FLUSH_TIMEOUT.toMillis();
+    long endTime = System.currentTimeMillis() + flushTimeout.toMillis();
     boolean success = false;
 
     while (!success && System.currentTimeMillis() < endTime) {
@@ -163,7 +168,7 @@ public class OMPrepareRequest extends OMClientRequest {
       }
 
       if (!success) {
-        Thread.sleep(DOUBLE_BUFFER_FLUSH_CHECK_INTERVAL.toMillis());
+        Thread.sleep(flushCheckInterval.toMillis());
       }
     }
 
@@ -173,7 +178,7 @@ public class OMPrepareRequest extends OMClientRequest {
     if (!success) {
       throw new IOException(String.format("After waiting for %d seconds, " +
               "State Machine has not applied  all the transactions.",
-          DOUBLE_BUFFER_FLUSH_TIMEOUT.toMillis() * 1000));
+          flushTimeout.getSeconds()));
     }
   }
 
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
index 317c464..59b2a1b 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
@@ -54,7 +54,8 @@ import java.util.Collection;
     versionProvider = HddsVersionProvider.class,
     subcommands = {
         FinalizeUpgradeSubCommand.class,
-        GetServiceRolesSubcommand.class
+        GetServiceRolesSubcommand.class,
+        PrepareSubCommand.class
     })
 @MetaInfServices(SubcommandWithParent.class)
 public class OMAdmin extends GenericCli implements SubcommandWithParent {
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/om/PrepareSubCommand.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/om/PrepareSubCommand.java
new file mode 100644
index 0000000..9bc0737
--- /dev/null
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/om/PrepareSubCommand.java
@@ -0,0 +1,79 @@
+/**
+ * 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.admin.om;
+
+import java.util.concurrent.Callable;
+
+import org.apache.hadoop.hdds.cli.HddsVersionProvider;
+import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
+
+import picocli.CommandLine;
+
+/**
+ * Handler of ozone admin om finalizeUpgrade command.
+ */
[email protected](
+    name = "prepare",
+    description = "Prepares Ozone Manager for upgrade/downgrade, by applying " 
+
+        "all pending transactions, taking a Ratis snapshot at the last " +
+        "transaction and purging all logs on each OM instance. The returned " +
+        "transaction #ID corresponds to the last transaction in the quorum in" 
+
+        " which the snapshot is taken.",
+    mixinStandardHelpOptions = true,
+    versionProvider = HddsVersionProvider.class
+)
+public class PrepareSubCommand implements Callable<Void> {
+
+  @CommandLine.ParentCommand
+  private OMAdmin parent;
+
+  @CommandLine.Option(
+      names = {"-id", "--service-id"},
+      description = "Ozone Manager Service ID",
+      required = true
+  )
+  private String omServiceId;
+
+  @CommandLine.Option(
+      names = {"-tawt", "--transaction-apply-wait-timeout"},
+      description = "Max time in SECONDS to wait for all transactions before" +
+          "the prepare request to be applied to the OM DB.",
+      defaultValue = "300",
+      hidden = true
+  )
+  private long txnApplyWaitTimeSeconds;
+
+  @CommandLine.Option(
+      names = {"-tact", "--transaction-apply-check-interval"},
+      description = "Time in SECONDS to wait between successive checks for " +
+          "all transactions to be applied to the OM DB.",
+      defaultValue = "5",
+      hidden = true
+  )
+  private long txnApplyCheckIntervalSeconds;
+
+  @Override
+  public Void call() throws Exception {
+    OzoneManagerProtocol client = parent.createOmClient(omServiceId);
+    long prepareTxnId = client.prepareOzoneManager(txnApplyWaitTimeSeconds,
+        txnApplyCheckIntervalSeconds);
+    System.out.println("Ozone Manager Prepare Request successfully returned " +
+        "with Txn Id " + prepareTxnId);
+    return null;
+  }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to