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

zhouxj pushed a commit to branch feature/GEODE-9373
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 6ccd9bccd70c572e42b1904a19f4dcf733c6daea
Author: zhouxh <[email protected]>
AuthorDate: Fri Jun 11 15:38:43 2021 -0700

    GEODE-9373: add 
testEventIdOutOfOrderInPartitionRegionSingleHopFromClientRegisteredInterest
---
 .../cache/PutAllClientServerDistributedTest.java   | 103 +++++++++++++++++++++
 1 file changed, 103 insertions(+)

diff --git 
a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/PutAllClientServerDistributedTest.java
 
b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/PutAllClientServerDistributedTest.java
index 67423c8..a5c20c4 100755
--- 
a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/PutAllClientServerDistributedTest.java
+++ 
b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/PutAllClientServerDistributedTest.java
@@ -2486,6 +2486,109 @@ public class PutAllClientServerDistributedTest 
implements Serializable {
   }
 
   /**
+   * The purpose of this test is to validate that when two servers of three in 
a cluster configured
+   * with a client doing singlehop, that the client which registered interest 
gets afterCreate
+   * messages for each
+   * entry in the putall.
+   * Further, we also check that the region size is correct on the remaining 
server.
+   *
+   */
+  @Test
+  public void 
testEventIdOutOfOrderInPartitionRegionSingleHopFromClientRegisteredInterest() {
+    VM server3 = client2;
+
+    int serverPort1 = server1.invoke(() -> new ServerBuilder()
+        .regionShortcut(PARTITION)
+        .create());
+
+    int serverPort2 = server2.invoke(() -> new ServerBuilder()
+        .regionShortcut(PARTITION)
+        .create());
+
+    int serverPort3 = server3.invoke(() -> new ServerBuilder()
+        .regionShortcut(PARTITION)
+        .create());
+
+    client1.invoke(() -> new ClientBuilder()
+        .prSingleHopEnabled(true)
+        .serverPorts(serverPort1, serverPort2, serverPort3)
+        .subscriptionAckInterval()
+        .subscriptionEnabled(true)
+        .subscriptionRedundancy()
+        .create());
+
+    new ClientBuilder()
+        .prSingleHopEnabled(true)
+        .serverPorts(serverPort1, serverPort2, serverPort3)
+        .subscriptionAckInterval()
+        .subscriptionEnabled(true)
+        .subscriptionRedundancy()
+        .create();
+
+    Region<String, TickerData> myRegion = 
getClientCache().getRegion(regionName);
+    myRegion.registerInterest("ALL_KEYS");
+
+    // do some putAll to get ClientMetaData for future putAll
+    client1.invoke(() -> doPutAll(getClientCache().getRegion(regionName), 
"key-", ONE_HUNDRED));
+
+    // register interest and add listener
+    Counter clientCounter = new Counter("client");
+    myRegion.getAttributesMutator().addCacheListener(new 
CountingCacheListener<>(clientCounter));
+
+    // server1 and server2 will closeCache after created 10 keys
+    // server1 add slow listener
+    server1.invoke(() -> {
+      Region<String, TickerData> region = getCache().getRegion(regionName);
+      region.getAttributesMutator()
+          .addCacheListener(new SlowCountingCacheListener<>(new 
Action<>(Operation.CREATE,
+              creates -> closeCacheConditionally(creates, 10))));
+    });
+
+    // server2 add slow listener
+    server2.invoke(() -> {
+      Region<String, TickerData> region = getCache().getRegion(regionName);
+      region.getAttributesMutator()
+          .addCacheListener(new SlowCountingCacheListener<>(new 
Action<>(Operation.CREATE,
+              creates -> closeCacheConditionally(creates, 20))));
+    });
+
+    // server3 add slow listener
+    server3.invoke(() -> {
+      COUNTER.set(new Counter("server3"));
+      Region<String, TickerData> region = getCache().getRegion(regionName);
+      region.getAttributesMutator()
+          .addCacheListener(new SlowCountingCacheListener<>(COUNTER.get()));
+    });
+
+    // client1 add listener and putAll
+    client1.invoke(() -> {
+      Region<String, TickerData> region = 
getClientCache().getRegion(regionName);
+      doPutAll(region, keyPrefix, ONE_HUNDRED); // fails in GEODE-7812
+    });
+
+    client1.invoke(() -> await()
+        .untilAsserted(() -> 
assertThat(clientCounter.getCreates()).isEqualTo(ONE_HUNDRED)));
+
+    await().untilAsserted(() -> 
assertThat(clientCounter.getCreates()).isEqualTo(ONE_HUNDRED));
+
+    assertThat(clientCounter.getUpdates()).isZero();
+
+    // server1 and server2 will closeCache after created 10 keys
+    // server3 print counter
+    server3.invoke(() -> {
+      Region<String, TickerData> region = getCache().getRegion(regionName);
+
+      assertThat(region.size())
+          .describedAs("Should have 100 entries plus 3 to 4 buckets worth of 
entries")
+          .isIn(ONE_HUNDRED + 3 * (ONE_HUNDRED) / 10, ONE_HUNDRED + 4 * 
(ONE_HUNDRED) / 10);
+      assertThat(COUNTER.get().getUpdates()).isZero();
+      verifyPutAll(region, keyPrefix);
+
+    });
+
+  }
+
+  /**
    * Tests while putAll to 2 distributed servers, one server failed over Add a 
listener to slow down
    * the processing of putAll
    */

Reply via email to