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());
}
}
}