You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by bs...@apache.org on 2019/11/08 22:01:03 UTC

[geode] branch feature/bruce_ssl_wip created (now 5e6d320)

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

bschuchardt pushed a change to branch feature/bruce_ssl_wip
in repository https://gitbox.apache.org/repos/asf/geode.git.


      at 5e6d320  ssl performance investigation

This branch includes the following new commits:

     new 5e6d320  ssl performance investigation

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[geode] 01/01: ssl performance investigation

Posted by bs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bschuchardt pushed a commit to branch feature/bruce_ssl_wip
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 5e6d3201f0f87e794c30d4adf3f762ffc552543c
Author: Bruce Schuchardt <bs...@pivotal.io>
AuthorDate: Fri Nov 8 14:00:01 2019 -0800

    ssl performance investigation
---
 .../geode/ClusterCommunicationsDUnitTest.java      | 76 +++++++++++++++++-----
 .../apache/geode/distributed/internal/DMStats.java |  7 ++
 .../distributed/internal/DistributionStats.java    | 36 ++++++++++
 .../internal/LonerDistributionManager.java         | 20 ++++++
 .../membership/gms/membership/GMSJoinLeave.java    |  4 +-
 .../org/apache/geode/internal/net/NioFilter.java   |  5 +-
 .../apache/geode/internal/net/NioPlainEngine.java  |  4 +-
 .../apache/geode/internal/net/NioSslEngine.java    |  9 ++-
 .../org/apache/geode/internal/tcp/Connection.java  | 11 ++--
 .../org/apache/geode/internal/tcp/MsgReader.java   |  3 +-
 .../geode/internal/net/NioPlainEngineTest.java     |  8 ++-
 .../geode/internal/net/NioSslEngineTest.java       |  6 +-
 .../cache/tier/sockets/DurableClientTestCase.java  |  2 -
 .../geode/test/dunit/internal/DUnitLauncher.java   |  2 +-
 14 files changed, 156 insertions(+), 37 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/ClusterCommunicationsDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/ClusterCommunicationsDUnitTest.java
index 492ec3a..a11a711 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/ClusterCommunicationsDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/ClusterCommunicationsDUnitTest.java
@@ -17,6 +17,7 @@ package org.apache.geode;
 import static org.apache.geode.distributed.ConfigurationProperties.CONSERVE_SOCKETS;
 import static org.apache.geode.distributed.ConfigurationProperties.DISABLE_TCP;
 import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION;
+import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_TIME_STATISTICS;
 import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
 import static org.apache.geode.distributed.ConfigurationProperties.NAME;
 import static org.apache.geode.distributed.ConfigurationProperties.SOCKET_BUFFER_SIZE;
@@ -28,6 +29,8 @@ import static org.apache.geode.distributed.ConfigurationProperties.SSL_PROTOCOLS
 import static org.apache.geode.distributed.ConfigurationProperties.SSL_REQUIRE_AUTHENTICATION;
 import static org.apache.geode.distributed.ConfigurationProperties.SSL_TRUSTSTORE;
 import static org.apache.geode.distributed.ConfigurationProperties.SSL_TRUSTSTORE_PASSWORD;
+import static org.apache.geode.distributed.ConfigurationProperties.STATISTIC_ARCHIVE_FILE;
+import static org.apache.geode.distributed.ConfigurationProperties.STATISTIC_SAMPLING_ENABLED;
 import static org.apache.geode.distributed.ConfigurationProperties.USE_CLUSTER_CONFIGURATION;
 import static org.apache.geode.internal.serialization.DataSerializableFixedID.SERIAL_ACKED_MESSAGE;
 import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
@@ -162,15 +165,17 @@ public class ClusterCommunicationsDUnitTest implements Serializable {
 
   @Test
   public void createEntryWithBigMessage() {
-    int locatorPort = createLocator(getVM(0));
-    for (int i = 1; i <= NUM_SERVERS; i++) {
-      createCacheAndRegion(getVM(i), locatorPort);
-    }
-    performCreateWithLargeValue(getVM(1));
-    // fault the value into an empty cache - forces use of message chunking
-    for (int i = 1; i <= NUM_SERVERS - 1; i++) {
-      verifyCreatedEntry(getVM(i));
-    }
+//    VM vm0 = Host.getHost(0).getVM("1.9.2", 0);
+//    VM vm1 = Host.getHost(0).getVM("1.9.2", 1);
+//    VM vm2 = Host.getHost(0).getVM("1.9.2", 2);
+    VM vm0 = Host.getHost(0).getVM( 0);
+    VM vm1 = Host.getHost(0).getVM(1);
+    VM vm2 = Host.getHost(0).getVM(2);
+    int locatorPort = createLocator(vm0, true);
+    createCacheAndRegion(vm2, locatorPort);
+    createCacheAndRegion(vm1, locatorPort);
+    performCreateWithLargeValue(vm1);
+    performUpdateWithLargeValue(vm1);
   }
 
   @Test
@@ -262,12 +267,43 @@ public class ClusterCommunicationsDUnitTest implements Serializable {
 
   private void performCreateWithLargeValue(VM memberVM) {
     memberVM.invoke("perform create", () -> {
-      byte[] value = new byte[SMALL_BUFFER_SIZE * 20];
+      byte[] value = new byte[1024];
+      Arrays.fill(value, (byte) 1);
+      cache.getRegion(regionName).put("testKey", value);
+    });
+  }
+
+  private void performUpdateWithLargeValue(VM memberVM) {
+    memberVM.invoke("perform update", () -> {
+      byte[] value = new byte[70000];
+      Arrays.fill(value, (byte) 1);
+      long start = System.currentTimeMillis();
+      for (int i = 0; i < 50000; i++) {
+        cache.getRegion(regionName).put("testKey", value);
+      }
+      long end = System.currentTimeMillis();
+      System.out.println("BRUCE: elapsed update time: " + (end - start) + "ms");
+    });
+  }
+
+  private void performCreateWithSmallValue(VM memberVM) {
+    memberVM.invoke("perform create", () -> {
+      byte[] value = new byte[512];
       Arrays.fill(value, (byte) 1);
       cache.getRegion(regionName).put("testKey", value);
     });
   }
 
+  private void performUpdateWithSmallValue(VM memberVM) {
+    memberVM.invoke("perform update", () -> {
+      byte[] value = new byte[512];
+      Arrays.fill(value, (byte) 1);
+      for (int i = 0; i < 50000; i++) {
+        cache.getRegion(regionName).put("testKey", value);
+      }
+    });
+  }
+
   private void verifyCreatedEntry(VM memberVM) {
     memberVM.invoke("verify entry created", () -> Assert.assertTrue(cache
         .getRegion(regionName).containsKey("testKey")));
@@ -319,8 +355,14 @@ public class ClusterCommunicationsDUnitTest implements Serializable {
     properties.setProperty(NAME, "vm" + VM.getCurrentVMNum());
     properties.setProperty(CONSERVE_SOCKETS, "" + conserveSockets);
     properties.setProperty(DISABLE_TCP, "" + disableTcp);
-    properties.setProperty(SOCKET_LEASE_TIME, "10000");
-    properties.setProperty(SOCKET_BUFFER_SIZE, "" + SMALL_BUFFER_SIZE);
+    properties.setProperty(SOCKET_LEASE_TIME, "60000");
+    // properties.setProperty(SOCKET_BUFFER_SIZE, "" + SMALL_BUFFER_SIZE);
+    properties.setProperty(SOCKET_BUFFER_SIZE, "80000");
+    properties.setProperty(ENABLE_TIME_STATISTICS, "true");
+    properties.setProperty(STATISTIC_SAMPLING_ENABLED, "true");
+    properties.setProperty(STATISTIC_ARCHIVE_FILE,
+        "statArchive_vm" + VM.getCurrentVMNum() + ".gfs");
+    // properties.put(LOG_LEVEL, "fine");
 
     if (useSSL) {
       properties.setProperty(SSL_ENABLED_COMPONENTS, "cluster,locator");
@@ -339,11 +381,11 @@ public class ClusterCommunicationsDUnitTest implements Serializable {
   }
 
   enum RunConfiguration {
-    SHARED_CONNECTIONS(true, false, false),
-    SHARED_CONNECTIONS_WITH_SSL(true, true, false),
-    UNSHARED_CONNECTIONS(false, false, false),
-    UNSHARED_CONNECTIONS_WITH_SSL(false, true, false),
-    UDP_CONNECTIONS(true, false, true);
+    // SHARED_CONNECTIONS(true, false, false),
+    // SHARED_CONNECTIONS_WITH_SSL(true, true, false),
+    // UNSHARED_CONNECTIONS(false, false, false);
+    UNSHARED_CONNECTIONS_WITH_SSL(false, true, false);
+    // UDP_CONNECTIONS(true, false, true);
 
     boolean useSSL;
     boolean conserveSockets;
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/DMStats.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/DMStats.java
index 6a0d578..c1adfa3 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/DMStats.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/DMStats.java
@@ -563,4 +563,11 @@ public interface DMStats extends MembershipStatistics {
 
   long getUdpFinalCheckResponsesReceived();
 
+  long startTLSEncryption();
+
+  void endTLSEncryption(long startEncryption);
+
+  long startTLSDecryption();
+
+  void endTLSDecryption(long startDecryptTime);
 }
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
index 5061032..8d69ab2 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionStats.java
@@ -153,6 +153,9 @@ public class DistributionStats implements DMStats {
   private static final int udpMsgEncryptionTimeId;
   private static final int udpMsgDecryptionTimeId;
 
+  private static final int tlsEncryptionTimeId;
+  private static final int tlsDecryptionTimeId;
+
   private static final int batchSendTimeId;
   private static final int batchCopyTimeId;
   private static final int batchWaitTimeId;
@@ -589,6 +592,10 @@ public class DistributionStats implements DMStats {
             "Total amount of time, in nanoseconds, spent encrypting udp messages.", "nanoseconds"),
         f.createLongCounter("udpMsgDecryptionTime",
             "Total amount of time, in nanoseconds, spent decrypting udp messages.", "nanoseconds"),
+        f.createLongCounter("tlsMsgEncryptionTime",
+            "Total amount of time performing TLS (SSL) encryption", "nanoseconds"),
+        f.createLongCounter("tlsMsgDecryptionTime",
+            "Total amount of time performing TLS (SSL) decryption", "nanoseconds"),
         f.createIntCounter("pdxInstanceDeserializations",
             "Total number of times getObject has been called on a PdxInstance.", "ops"),
         f.createLongCounter("pdxInstanceDeserializationTime",
@@ -848,6 +855,9 @@ public class DistributionStats implements DMStats {
     udpMsgEncryptionTimeId = type.nameToId("udpMsgEncryptionTime");
     udpMsgDecryptionTimeId = type.nameToId("udpMsgDecryptionTime");
 
+    tlsEncryptionTimeId = type.nameToId("tlsMsgEncryptionTime");
+    tlsDecryptionTimeId = type.nameToId("tlsMsgDecryptionTime");
+
     batchSendTimeId = type.nameToId("batchSendTime");
     batchCopyTimeId = type.nameToId("batchCopyTime");
     batchWaitTimeId = type.nameToId("batchWaitTime");
@@ -2659,6 +2669,32 @@ public class DistributionStats implements DMStats {
   }
 
   @Override
+  public long startTLSEncryption() {
+    return getTime();
+  }
+
+  @Override
+  public void endTLSEncryption(long startEncryptTime) {
+    if (enableClockStats) {
+      long endTime = getTime();
+      this.stats.incLong(tlsEncryptionTimeId, endTime - startEncryptTime);
+    }
+  }
+
+  @Override
+  public long startTLSDecryption() {
+    return getTime();
+  }
+
+  @Override
+  public void endTLSDecryption(long startDecryptTime) {
+    if (enableClockStats) {
+      long endTime = getTime();
+      this.stats.incLong(tlsDecryptionTimeId, endTime - startDecryptTime);
+    }
+  }
+
+  @Override
   public void incUdpFinalCheckResponsesReceived() {
     this.stats.incLong(udpFinalCheckResponsesReceivedId, 1L);
   }
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/LonerDistributionManager.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/LonerDistributionManager.java
index 43c5936..7b2387a 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/LonerDistributionManager.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/LonerDistributionManager.java
@@ -997,6 +997,26 @@ public class LonerDistributionManager implements DistributionManager {
     }
 
     @Override
+    public long startTLSEncryption() {
+      return 0;
+    }
+
+    @Override
+    public void endTLSEncryption(long startEncryption) {
+
+    }
+
+    @Override
+    public long startTLSDecryption() {
+      return 0;
+    }
+
+    @Override
+    public void endTLSDecryption(long startDecryptTime) {
+
+    }
+
+    @Override
     public void incUdpFinalCheckResponsesReceived() {}
 
     @Override
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
index 9b017de..126632c 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/membership/GMSJoinLeave.java
@@ -118,8 +118,8 @@ public class GMSJoinLeave implements JoinLeave {
    * membership logger
    */
   private static final Logger logger = Services.getLogger();
-  private static final boolean ALLOW_OLD_VERSION_FOR_TESTING = Boolean
-      .getBoolean(DistributionConfig.GEMFIRE_PREFIX + "allow_old_members_to_join_for_testing");
+  private static final boolean ALLOW_OLD_VERSION_FOR_TESTING = true; // Boolean
+  // .getBoolean(DistributionConfig.GEMFIRE_PREFIX + "allow_old_members_to_join_for_testing");
 
   /**
    * the view ID where I entered into membership
diff --git a/geode-core/src/main/java/org/apache/geode/internal/net/NioFilter.java b/geode-core/src/main/java/org/apache/geode/internal/net/NioFilter.java
index 01556dc..d497233 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/net/NioFilter.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/net/NioFilter.java
@@ -18,6 +18,8 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.SocketChannel;
 
+import org.apache.geode.distributed.internal.DMStats;
+
 /**
  * Prior to transmitting a buffer or processing a received buffer
  * a NioFilter should be called to wrap (transmit) or unwrap (received)
@@ -53,7 +55,8 @@ public interface NioFilter {
    * wrappedBuffer = filter.ensureWrappedCapacity(amount, wrappedBuffer, etc.);<br>
    * unwrappedBuffer = filter.readAtLeast(channel, amount, wrappedBuffer, etc.)
    */
-  ByteBuffer readAtLeast(SocketChannel channel, int amount, ByteBuffer wrappedBuffer)
+  ByteBuffer readAtLeast(SocketChannel channel, int amount, ByteBuffer wrappedBuffer,
+                         DMStats stats)
       throws IOException;
 
   /**
diff --git a/geode-core/src/main/java/org/apache/geode/internal/net/NioPlainEngine.java b/geode-core/src/main/java/org/apache/geode/internal/net/NioPlainEngine.java
index 3ebce38..3dbacda 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/net/NioPlainEngine.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/net/NioPlainEngine.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.SocketChannel;
 
+import org.apache.geode.distributed.internal.DMStats;
 import org.apache.geode.internal.Assert;
 
 /**
@@ -82,7 +83,8 @@ public class NioPlainEngine implements NioFilter {
   }
 
   @Override
-  public ByteBuffer readAtLeast(SocketChannel channel, int bytes, ByteBuffer wrappedBuffer)
+  public ByteBuffer readAtLeast(SocketChannel channel, int bytes, ByteBuffer wrappedBuffer,
+                                DMStats stats)
       throws IOException {
     ByteBuffer buffer = wrappedBuffer;
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/net/NioSslEngine.java b/geode-core/src/main/java/org/apache/geode/internal/net/NioSslEngine.java
index e914847..3c10bfd 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/net/NioSslEngine.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/net/NioSslEngine.java
@@ -40,6 +40,7 @@ import javax.net.ssl.SSLSession;
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.GemFireIOException;
+import org.apache.geode.distributed.internal.DMStats;
 import org.apache.geode.internal.net.BufferPool.BufferType;
 import org.apache.geode.logging.internal.log4j.api.LogService;
 
@@ -74,8 +75,8 @@ public class NioSslEngine implements NioFilter {
     int packetBufferSize = engine.getSession().getPacketBufferSize();
     this.engine = engine;
     this.bufferPool = bufferPool;
-    this.myNetData = bufferPool.acquireDirectSenderBuffer(packetBufferSize);
-    this.peerAppData = bufferPool.acquireNonDirectReceiveBuffer(appBufferSize);
+    this.myNetData = bufferPool.acquireDirectSenderBuffer(100000); //packetBufferSize);
+    this.peerAppData = bufferPool.acquireNonDirectReceiveBuffer(100000);//appBufferSize);
   }
 
   /**
@@ -314,7 +315,8 @@ public class NioSslEngine implements NioFilter {
 
   @Override
   public ByteBuffer readAtLeast(SocketChannel channel, int bytes,
-      ByteBuffer wrappedBuffer) throws IOException {
+                                ByteBuffer wrappedBuffer,
+                                DMStats stats) throws IOException {
     if (peerAppData.capacity() > bytes) {
       // we already have a buffer that's big enough
       if (peerAppData.capacity() - peerAppData.position() < bytes) {
@@ -328,6 +330,7 @@ public class NioSslEngine implements NioFilter {
 
     while (peerAppData.remaining() < bytes) {
       wrappedBuffer.limit(wrappedBuffer.capacity());
+      stats.incAsyncThreads(1);
       int amountRead = channel.read(wrappedBuffer);
       if (amountRead < 0) {
         throw new EOFException();
diff --git a/geode-core/src/main/java/org/apache/geode/internal/tcp/Connection.java b/geode-core/src/main/java/org/apache/geode/internal/tcp/Connection.java
index 61d2ff4..339cfa0 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/tcp/Connection.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/tcp/Connection.java
@@ -1224,10 +1224,6 @@ public class Connection implements Runnable {
     }
   }
 
-  public void setInputBuffer(ByteBuffer buffer) {
-    this.inputBuffer = buffer;
-  }
-
   private class BatchBufferFlusher extends Thread {
     private volatile boolean flushNeeded = false;
     private volatile boolean timeToStop = false;
@@ -1839,6 +1835,9 @@ public class Connection implements Runnable {
       SSLEngine engine =
           getConduit().getSocketCreator().createSSLEngine(address.getHostName(), address.getPort());
 
+      // int engineBufferSize = engine.getSession().getPacketBufferSize();
+      // int sendBufferSize = owner.getConduit().tcpBufferSize;
+      // int packetBufferSize = Math.max(sendBufferSize, engineBufferSize);
       int packetBufferSize = engine.getSession().getPacketBufferSize();
       if (inputBuffer == null
           || (inputBuffer.capacity() < packetBufferSize)) {
@@ -2731,7 +2730,9 @@ public class Connection implements Runnable {
           }
           // fall through
         }
+         long startEncryption = stats.startTLSEncryption();
         ByteBuffer wrappedBuffer = ioFilter.wrap(buffer);
+         stats.endTLSEncryption(startEncryption);
         while (wrappedBuffer.remaining() > 0) {
           int amtWritten = 0;
           long start = stats.startSocketWrite(true);
@@ -2898,7 +2899,9 @@ public class Connection implements Runnable {
 
     inputBuffer.flip();
 
+     long startDecryptTime = owner.getConduit().getStats().startTLSDecryption();
     ByteBuffer peerDataBuffer = ioFilter.unwrap(inputBuffer);
+     owner.getConduit().getStats().endTLSDecryption(startDecryptTime);
     peerDataBuffer.flip();
 
     boolean done = false;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/tcp/MsgReader.java b/geode-core/src/main/java/org/apache/geode/internal/tcp/MsgReader.java
index 4561562..8a6b7c3 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/tcp/MsgReader.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/tcp/MsgReader.java
@@ -120,7 +120,8 @@ public class MsgReader {
   private ByteBuffer readAtLeast(int bytes) throws IOException {
     peerNetData = ioFilter.ensureWrappedCapacity(bytes, peerNetData,
         BufferPool.BufferType.TRACKED_RECEIVER);
-    return ioFilter.readAtLeast(conn.getSocket().getChannel(), bytes, peerNetData);
+    return ioFilter.readAtLeast(conn.getSocket().getChannel(), bytes, peerNetData,
+        conn.getConduit().getStats());
   }
 
   public void close() {
diff --git a/geode-core/src/test/java/org/apache/geode/internal/net/NioPlainEngineTest.java b/geode-core/src/test/java/org/apache/geode/internal/net/NioPlainEngineTest.java
index e9785de..4b31500 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/net/NioPlainEngineTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/net/NioPlainEngineTest.java
@@ -117,14 +117,16 @@ public class NioPlainEngineTest {
 
     nioEngine.lastReadPosition = 10;
 
-    ByteBuffer data = nioEngine.readAtLeast(mockChannel, amountToRead, wrappedBuffer);
+    ByteBuffer data = nioEngine.readAtLeast(mockChannel, amountToRead, wrappedBuffer,
+        conn.getConduit().getStats());
     verify(mockChannel, times(3)).read(isA(ByteBuffer.class));
     assertThat(data.position()).isEqualTo(0);
     assertThat(data.limit()).isEqualTo(amountToRead);
     assertThat(nioEngine.lastReadPosition).isEqualTo(individualRead * 3 + preexistingBytes);
     assertThat(nioEngine.lastProcessedPosition).isEqualTo(amountToRead);
 
-    data = nioEngine.readAtLeast(mockChannel, amountToRead, wrappedBuffer);
+    data = nioEngine.readAtLeast(mockChannel, amountToRead, wrappedBuffer,
+        conn.getConduit().getStats());
     verify(mockChannel, times(5)).read(any(ByteBuffer.class));
     // at end of last readAtLeast data
     assertThat(data.position()).isEqualTo(amountToRead);
@@ -148,7 +150,7 @@ public class NioPlainEngineTest {
 
     nioEngine.lastReadPosition = 10;
 
-    nioEngine.readAtLeast(mockChannel, amountToRead, wrappedBuffer);
+    nioEngine.readAtLeast(mockChannel, amountToRead, wrappedBuffer, conn.getConduit().getStats());
   }
 
 }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/net/NioSslEngineTest.java b/geode-core/src/test/java/org/apache/geode/internal/net/NioSslEngineTest.java
index e50b878..73b97ee 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/net/NioSslEngineTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/net/NioSslEngineTest.java
@@ -412,7 +412,8 @@ public class NioSslEngineTest {
     testSSLEngine.addReturnResult(new SSLEngineResult(OK, NEED_UNWRAP, 0, 0));
     nioSslEngine.engine = testSSLEngine;
 
-    ByteBuffer data = nioSslEngine.readAtLeast(mockChannel, amountToRead, wrappedBuffer);
+    ByteBuffer data = nioSslEngine.readAtLeast(mockChannel, amountToRead, wrappedBuffer,
+        conn.getConduit().getStats());
     verify(mockChannel, times(3)).read(isA(ByteBuffer.class));
     assertThat(data.position()).isEqualTo(0);
     assertThat(data.limit()).isEqualTo(individualRead * 3 + preexistingBytes);
@@ -456,7 +457,8 @@ public class NioSslEngineTest {
         new SSLEngineResult(OK, NEED_UNWRAP, 0, 0)); // 130 + 60 bytes = 190
     nioSslEngine.engine = testSSLEngine;
 
-    ByteBuffer data = nioSslEngine.readAtLeast(mockChannel, amountToRead, wrappedBuffer);
+    ByteBuffer data = nioSslEngine.readAtLeast(mockChannel, amountToRead, wrappedBuffer,
+        conn.getConduit().getStats());
     verify(mockChannel, times(3)).read(isA(ByteBuffer.class));
     assertThat(data.position()).isEqualTo(0);
     assertThat(data.limit()).isEqualTo(individualRead * 3 + preexistingBytes);
diff --git a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestCase.java b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestCase.java
index d5cbf1b..353c39f 100755
--- a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestCase.java
+++ b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/DurableClientTestCase.java
@@ -107,8 +107,6 @@ public class DurableClientTestCase extends DurableClientTestBase {
 
         // Verify that it is durable and its properties are correct
         assertThat(proxy.isDurable()).isTrue();
-        System.out.println("BRUCE: durableClientId is " + durableClientId);
-        System.out.println("BRUCE: proxy durable id is " + proxy.getDurableId());
         assertThat(durableClientId).isNotEqualTo(proxy.getDurableId());
 
         /*
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java
index b532277..4bc3380 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java
@@ -91,7 +91,7 @@ public class DUnitLauncher {
   /**
    * Number of VMs to use during initialization.
    */
-  public static int NUM_VMS = 4;
+  public static int NUM_VMS = 1;
 
   /**
    * VM ID for the VM to use for the debugger.