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

szetszwo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-ratis.git


The following commit(s) were added to refs/heads/master by this push:
     new bc85807  RATIS-708. Benchmark for toRaftClientRequestProto.
bc85807 is described below

commit bc85807da993745d86d17ea463c6dce8fdb2e1e5
Author: Tsz Wo Nicholas Sze <[email protected]>
AuthorDate: Thu Oct 24 14:47:41 2019 -0700

    RATIS-708. Benchmark for toRaftClientRequestProto.
---
 .../main/java/org/apache/ratis/util/DataQueue.java |  2 +-
 .../java/org/apache/ratis/util/TimeDuration.java   | 10 ++-
 .../apache/ratis/client/TestClientProtoUtils.java  | 97 ++++++++++++++++++++++
 .../org/apache/ratis/util/TestTimeDuration.java    | 32 +++++--
 4 files changed, 133 insertions(+), 8 deletions(-)

diff --git a/ratis-common/src/main/java/org/apache/ratis/util/DataQueue.java 
b/ratis-common/src/main/java/org/apache/ratis/util/DataQueue.java
index c0cc07e..79d1d92 100644
--- a/ratis-common/src/main/java/org/apache/ratis/util/DataQueue.java
+++ b/ratis-common/src/main/java/org/apache/ratis/util/DataQueue.java
@@ -129,7 +129,7 @@ public class DataQueue<E> {
         return results;
       }
 
-      final TimeDuration remaining = limit.minus(startTime.elapsedTime());
+      final TimeDuration remaining = limit.subtract(startTime.elapsedTime());
       try {
         results.add(getResult.apply(peeked, remaining));
       } catch (TimeoutException e) {
diff --git a/ratis-common/src/main/java/org/apache/ratis/util/TimeDuration.java 
b/ratis-common/src/main/java/org/apache/ratis/util/TimeDuration.java
index 987b628..49aea5e 100644
--- a/ratis-common/src/main/java/org/apache/ratis/util/TimeDuration.java
+++ b/ratis-common/src/main/java/org/apache/ratis/util/TimeDuration.java
@@ -32,6 +32,7 @@ import java.util.function.LongUnaryOperator;
  * This is a value-based class.
  */
 public final class TimeDuration implements Comparable<TimeDuration> {
+  public static final TimeDuration ZERO = valueOf(0, TimeUnit.NANOSECONDS);
   public static final TimeDuration ONE_SECOND = TimeDuration.valueOf(1, 
TimeUnit.SECONDS);
 
   /** Abbreviations of {@link TimeUnit}. */
@@ -158,8 +159,15 @@ public final class TimeDuration implements 
Comparable<TimeDuration> {
     return this.unit == targetUnit? this: valueOf(toLong(targetUnit), 
targetUnit);
   }
 
+  /** @return (this + that) in the minimum unit among them. */
+  public TimeDuration add(TimeDuration that) {
+    Objects.requireNonNull(that, "that == null");
+    final TimeUnit minUnit = CollectionUtils.min(this.unit, that.unit);
+    return valueOf(this.toLong(minUnit) + that.toLong(minUnit), minUnit);
+  }
+
   /** @return (this - that) in the minimum unit among them. */
-  public TimeDuration minus(TimeDuration that) {
+  public TimeDuration subtract(TimeDuration that) {
     Objects.requireNonNull(that, "that == null");
     final TimeUnit minUnit = CollectionUtils.min(this.unit, that.unit);
     return valueOf(this.toLong(minUnit) - that.toLong(minUnit), minUnit);
diff --git 
a/ratis-test/src/test/java/org/apache/ratis/client/TestClientProtoUtils.java 
b/ratis-test/src/test/java/org/apache/ratis/client/TestClientProtoUtils.java
new file mode 100644
index 0000000..3c13413
--- /dev/null
+++ b/ratis-test/src/test/java/org/apache/ratis/client/TestClientProtoUtils.java
@@ -0,0 +1,97 @@
+/*
+ * 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.ratis.client;
+
+
+import org.apache.ratis.BaseTest;
+import org.apache.ratis.client.impl.ClientProtoUtils;
+import org.apache.ratis.proto.RaftProtos.RaftClientRequestProto;
+import org.apache.ratis.protocol.ClientId;
+import org.apache.ratis.protocol.RaftClientRequest;
+import org.apache.ratis.protocol.RaftGroupId;
+import org.apache.ratis.protocol.RaftPeerId;
+import org.apache.ratis.thirdparty.com.google.protobuf.ByteString;
+import org.apache.ratis.util.SizeInBytes;
+import org.apache.ratis.util.TimeDuration;
+import org.apache.ratis.util.Timestamp;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+/** Test {@link ClientProtoUtils}. */
+public class TestClientProtoUtils extends BaseTest {
+  @Test
+  public void testToRaftClientRequestProto() throws Exception {
+    for(int i = 1; i < 32; i <<= 2) {
+      final SizeInBytes messageSize = SizeInBytes.valueOf(i + "MB");
+      runTestToRaftClientRequestProto(100, messageSize);
+    }
+  }
+
+  void runTestToRaftClientRequestProto(int n, SizeInBytes messageSize)
+      throws Exception {
+    final ClientId clientId = ClientId.randomId();
+    final RaftPeerId leaderId = RaftPeerId.valueOf("s0");
+    final RaftGroupId groupId = RaftGroupId.randomId();
+
+
+    TimeDuration toProto = TimeDuration.ZERO;
+    TimeDuration toRequest = TimeDuration.ZERO;
+
+    for(int i = 0; i < n; i++) {
+      final ByteString bytes = newByteString(messageSize.getSizeInt(), i);
+      final RaftClientRequest request = new RaftClientRequest(clientId, 
leaderId, groupId,
+          1, () -> bytes, RaftClientRequest.writeRequestType(), null);
+
+      final Timestamp startTime = Timestamp.currentTime();
+      final RaftClientRequestProto proto = 
ClientProtoUtils.toRaftClientRequestProto(request);
+      final TimeDuration p = startTime.elapsedTime();
+      final RaftClientRequest computed = 
ClientProtoUtils.toRaftClientRequest(proto);
+      final TimeDuration r = startTime.elapsedTime().subtract(p);
+
+      Assert.assertEquals(request.getMessage().getContent(), 
computed.getMessage().getContent());
+      toProto = toProto.add(p);
+      toRequest = toRequest.add(r);
+
+    }
+
+    System.out.printf("%nmessageSize=%s, n=%d%n", messageSize, n);
+    print("toProto  ", toProto, n);
+    print("toRequest", toRequest, n);
+  }
+
+  void print(String name, TimeDuration t, int n) {
+    final long ns = t.toLong(TimeUnit.NANOSECONDS);
+    System.out.printf("%s: avg = %s (total = %s)%n", name, ns2String(ns/n), 
ns2String(ns));
+  }
+
+  static String ns2String(long ns) {
+    return String.format("%.3fms", ns/1_000_000.0);
+  }
+
+  static ByteString newByteString(int size, int offset) throws IOException {
+    try(final ByteString.Output out = ByteString.newOutput()) {
+      for (int i = 0; i < size; i++) {
+        out.write(i + offset);
+      }
+      return out.toByteString();
+    }
+  }
+}
diff --git 
a/ratis-test/src/test/java/org/apache/ratis/util/TestTimeDuration.java 
b/ratis-test/src/test/java/org/apache/ratis/util/TestTimeDuration.java
index 20c4b8f..ba223d1 100644
--- a/ratis-test/src/test/java/org/apache/ratis/util/TestTimeDuration.java
+++ b/ratis-test/src/test/java/org/apache/ratis/util/TestTimeDuration.java
@@ -123,35 +123,55 @@ public class TestTimeDuration {
   }
 
   @Test(timeout = 1000)
-  public void testMinus() {
+  public void testAddAndSubtract() {
     final TimeDuration oneSecond = TimeDuration.valueOf(1, TimeUnit.SECONDS);
     final TimeDuration tenSecond = TimeDuration.valueOf(10, TimeUnit.SECONDS);
     {
-      final TimeDuration d = oneSecond.minus(oneSecond);
+      final TimeDuration d = oneSecond.subtract(oneSecond);
       assertEquals(0, d.getDuration());
       assertEquals(TimeUnit.SECONDS, d.getUnit());
+
+      final TimeDuration sum = d.add(oneSecond);
+      assertEquals(1, sum.getDuration());
+      assertEquals(TimeUnit.SECONDS, sum.getUnit());
     }
     {
-      final TimeDuration d = tenSecond.minus(oneSecond);
+      final TimeDuration d = tenSecond.subtract(oneSecond);
       assertEquals(9, d.getDuration());
       assertEquals(TimeUnit.SECONDS, d.getUnit());
+
+      final TimeDuration sum = d.add(oneSecond);
+      assertEquals(10, sum.getDuration());
+      assertEquals(TimeUnit.SECONDS, sum.getUnit());
     }
     {
-      final TimeDuration d = oneSecond.minus(tenSecond);
+      final TimeDuration d = oneSecond.subtract(tenSecond);
       assertEquals(-9, d.getDuration());
       assertEquals(TimeUnit.SECONDS, d.getUnit());
+
+      final TimeDuration sum = d.add(tenSecond);
+      assertEquals(1, sum.getDuration());
+      assertEquals(TimeUnit.SECONDS, sum.getUnit());
     }
 
     final TimeDuration oneMS = TimeDuration.valueOf(1, TimeUnit.MILLISECONDS);
     {
-      final TimeDuration d = oneSecond.minus(oneMS);
+      final TimeDuration d = oneSecond.subtract(oneMS);
       assertEquals(999, d.getDuration());
       assertEquals(TimeUnit.MILLISECONDS, d.getUnit());
+
+      final TimeDuration sum = d.add(oneSecond);
+      assertEquals(1999, sum.getDuration());
+      assertEquals(TimeUnit.MILLISECONDS, sum.getUnit());
     }
     {
-      final TimeDuration d = oneMS.minus(oneSecond);
+      final TimeDuration d = oneMS.subtract(oneSecond);
       assertEquals(-999, d.getDuration());
       assertEquals(TimeUnit.MILLISECONDS, d.getUnit());
+
+      final TimeDuration sum = d.add(oneSecond);
+      assertEquals(1, sum.getDuration());
+      assertEquals(TimeUnit.MILLISECONDS, sum.getUnit());
     }
   }
 }

Reply via email to