You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by bh...@apache.org on 2020/10/09 17:36:02 UTC

[hadoop-ozone] branch master updated: HDDS-4262. Use ClientID and CallID from Rpc Client to detect retry requests (#1436)

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

bharat pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hadoop-ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new c956ce6  HDDS-4262. Use ClientID and CallID from Rpc Client to detect retry requests (#1436)
c956ce6 is described below

commit c956ce6b7537a0286c01b15d4963333a7ffeba90
Author: Bharat Viswanadham <bh...@apache.org>
AuthorDate: Fri Oct 9 10:35:50 2020 -0700

    HDDS-4262. Use ClientID and CallID from Rpc Client to detect retry requests (#1436)
---
 .../ozone/om/TestOzoneManagerHAMetadataOnly.java   | 76 ++++++++++++++++++++++
 .../ozone/om/ratis/OzoneManagerRatisServer.java    | 11 +++-
 .../om/request/volume/OMVolumeCreateRequest.java   |  6 ++
 3 files changed, 91 insertions(+), 2 deletions(-)

diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHAMetadataOnly.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHAMetadataOnly.java
index 754339e..fbe1762 100644
--- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHAMetadataOnly.java
+++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHAMetadataOnly.java
@@ -30,9 +30,21 @@ import org.apache.hadoop.ozone.client.VolumeArgs;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.ha.OMFailoverProxyProvider;
 import org.apache.hadoop.ozone.om.ha.OMProxyInfo;
+import org.apache.hadoop.ozone.om.helpers.OMRatisHelper;
 import org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer;
+import org.apache.hadoop.ozone.om.request.volume.OMVolumeCreateRequest;
+import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
+import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.CreateVolumeRequest;
+import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
+import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.VolumeInfo;
 import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.hadoop.test.GenericTestUtils;
 import org.apache.log4j.Logger;
+import org.apache.ratis.protocol.ClientId;
+import org.apache.ratis.protocol.Message;
+import org.apache.ratis.protocol.RaftClientReply;
+import org.apache.ratis.protocol.RaftClientRequest;
+import org.apache.ratis.server.RaftServer;
 import org.junit.Assert;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -48,6 +60,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.Iterator;
+import java.util.UUID;
 
 import static org.apache.hadoop.ozone.MiniOzoneHAClusterImpl.NODE_FAILURE_TIMEOUT;
 import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_CLIENT_WAIT_BETWEEN_RETRIES_MILLIS_DEFAULT;
@@ -348,6 +361,69 @@ public class TestOzoneManagerHAMetadataOnly extends TestOzoneManagerHA {
     Assert.assertTrue((long) flushCount >= 0);
   }
 
+  @Test
+  public void testOMRetryCache() throws Exception {
+    ObjectStore objectStore = getObjectStore();
+    objectStore.createVolume(UUID.randomUUID().toString());
+
+
+    OMFailoverProxyProvider omFailoverProxyProvider = OmFailoverProxyUtil
+        .getFailoverProxyProvider(objectStore.getClientProxy());
+
+    String currentLeaderNodeId = omFailoverProxyProvider
+        .getCurrentProxyOMNodeId();
+
+    OzoneManagerRatisServer ozoneManagerRatisServer =
+        getCluster().getOzoneManager(currentLeaderNodeId).getOmRatisServer();
+
+    RaftServer raftServer = ozoneManagerRatisServer.getServer();
+
+    ClientId clientId = ClientId.randomId();
+    long callId = 2000L;
+    String userName = UserGroupInformation.getCurrentUser().getUserName();
+    String volumeName = UUID.randomUUID().toString();
+
+
+    GenericTestUtils.LogCapturer logCapturer = GenericTestUtils.LogCapturer
+        .captureLogs(OMVolumeCreateRequest.getLogger());
+    OMRequest omRequest =
+        OMRequest.newBuilder().setCreateVolumeRequest(
+            CreateVolumeRequest.newBuilder().setVolumeInfo(
+                VolumeInfo.newBuilder().setOwnerName(userName)
+                    .setAdminName(userName).setVolume(volumeName).build())
+                .build()).setClientId(UUID.randomUUID().toString())
+            .setCmdType(OzoneManagerProtocolProtos.Type.CreateVolume).build();
+
+    RaftClientReply raftClientReply =
+        raftServer.submitClientRequest(new RaftClientRequest(clientId,
+         raftServer.getId(), ozoneManagerRatisServer.getRaftGroup()
+         .getGroupId(), callId,
+        Message.valueOf(OMRatisHelper.convertRequestToByteString(omRequest)),
+        RaftClientRequest.writeRequestType(), null));
+
+    Assert.assertTrue(raftClientReply.isSuccess());
+
+    Assert.assertTrue(logCapturer.getOutput().contains("created volume:"
+        + volumeName));
+
+    logCapturer.clearOutput();
+
+    raftClientReply =
+        raftServer.submitClientRequest(new RaftClientRequest(clientId,
+            raftServer.getId(), ozoneManagerRatisServer.getRaftGroup()
+            .getGroupId(), callId, Message.valueOf(
+                OMRatisHelper.convertRequestToByteString(omRequest)),
+            RaftClientRequest.writeRequestType(), null));
+
+    Assert.assertTrue(raftClientReply.isSuccess());
+
+    // As second time with same client id and call id, this request should
+    // not be executed ratis server should return from cache.
+    Assert.assertFalse(logCapturer.getOutput().contains("created volume:"
+        + volumeName));
+
+  }
+
   private void validateVolumesList(String userName,
       Set<String> expectedVolumes) throws Exception {
     ObjectStore objectStore = getObjectStore();
diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerRatisServer.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerRatisServer.java
index 4b8c11a..0b5a2b1 100644
--- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerRatisServer.java
+++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerRatisServer.java
@@ -38,6 +38,7 @@ import org.apache.hadoop.hdds.conf.ConfigurationSource;
 import org.apache.hadoop.hdds.conf.StorageUnit;
 import org.apache.hadoop.hdds.server.ServerUtils;
 import org.apache.hadoop.hdds.tracing.TracingUtil;
+import org.apache.hadoop.ipc.ProtobufRpcEngine.Server;
 import org.apache.hadoop.ozone.om.OMConfigKeys;
 import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
@@ -143,8 +144,9 @@ public final class OzoneManagerRatisServer {
    * ratis server.
    */
   private RaftClientRequest createWriteRaftClientRequest(OMRequest omRequest) {
-    return new RaftClientRequest(clientId, server.getId(), raftGroupId,
-        nextCallId(),
+    return new RaftClientRequest(
+        ClientId.valueOf(UUID.nameUUIDFromBytes(Server.getClientId())),
+        server.getId(), raftGroupId, Server.getCallId(),
         Message.valueOf(OMRatisHelper.convertRequestToByteString(omRequest)),
         RaftClientRequest.writeRequestType(), null);
   }
@@ -339,6 +341,11 @@ public final class OzoneManagerRatisServer {
     return this.raftGroup;
   }
 
+  @VisibleForTesting
+  public RaftServer getServer() {
+    return server;
+  }
+
   /**
    * Initializes and returns OzoneManager StateMachine.
    */
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..9c81c36 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
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
 import org.apache.hadoop.ozone.OmUtils;
@@ -201,6 +202,11 @@ public class OMVolumeCreateRequest extends OMVolumeRequest {
     }
     return omClientResponse;
   }
+
+  @VisibleForTesting
+  public static Logger getLogger() {
+    return LOG;
+  }
 }
 
 


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