/*
* 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.geode.internal.cache.wan.parallel;
import org.junit.experimental.categories.Category;
import org.junit.Test;
import static org.junit.Assert.*;
import org.apache.geode.test.dunit.cache.internal.JUnit4CacheTestCase;
import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
import org.apache.geode.test.junit.categories.DistributedTest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.apache.geode.internal.cache.wan.WANTestBase;
import org.apache.geode.test.dunit.IgnoredException;
/**
*
*/
@Category(DistributedTest.class)
public class ParallelWANConflationDUnitTest extends WANTestBase {
private static final long serialVersionUID = 1L;
public ParallelWANConflationDUnitTest() {
super();
}
@Override
protected final void postSetUpWANTestBase() throws Exception {
IgnoredException.addIgnoredException("java.net.ConnectException");
}
@Test
public void testParallelPropagationConflationDisabled() throws Exception {
initialSetUp();
createSendersNoConflation();
createSenderPRs();
startPausedSenders();
createReceiverPrs();
final Map keyValues = putKeyValues();
vm4.invoke(() -> checkQueueSize("ln", keyValues.size()));
final Map updateKeyValues = updateKeyValues();
vm4.invoke(() -> checkQueueSize("ln", (keyValues.size() + updateKeyValues.size())));
vm2.invoke(() -> validateRegionSize(getTestMethodName(), 0));
resumeSenders();
keyValues.putAll(updateKeyValues);
validateReceiverRegionSize(keyValues);
}
/**
* This test is disabled as it is not guaranteed to pass it everytime. This test is related to the
* conflation in batch. yet did find any way to ascertain that the vents in the batch will always
* be conflated.
*
* @throws Exception
*/
@Test
public void testParallelPropagationBatchConflation() throws Exception {
initialSetUp();
vm4.invoke(() -> createSender("ln", 2, true, 100, 50, false, false, null, true));
vm5.invoke(() -> createSender("ln", 2, true, 100, 50, false, false, null, true));
vm6.invoke(() -> createSender("ln", 2, true, 100, 50, false, false, null, true));
vm7.invoke(() -> createSender("ln", 2, true, 100, 50, false, false, null, true));
createSenderPRs();
startSenderInVMs("ln", vm4, vm5, vm6, vm7);
pauseSenders();
createReceiverPrs();
final Map keyValues = new HashMap();
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
keyValues.put(j, i);
}
vm4.invoke(() -> putGivenKeyValue(getTestMethodName(), keyValues));
}
vm4.invoke(() -> enableConflation("ln"));
vm5.invoke(() -> enableConflation("ln"));
vm6.invoke(() -> enableConflation("ln"));
vm7.invoke(() -> enableConflation("ln"));
resumeSenders();
ArrayList<Integer> v4List =
(ArrayList<Integer>) vm4.invoke(() -> WANTestBase.getSenderStats("ln", 0));
ArrayList<Integer> v5List =
(ArrayList<Integer>) vm5.invoke(() -> WANTestBase.getSenderStats("ln", 0));
ArrayList<Integer> v6List =
(ArrayList<Integer>) vm6.invoke(() -> WANTestBase.getSenderStats("ln", 0));
ArrayList<Integer> v7List =
(ArrayList<Integer>) vm7.invoke(() -> WANTestBase.getSenderStats("ln", 0));
assertTrue("No events conflated in batch",
(v4List.get(8) + v5List.get(8) + v6List.get(8) + v7List.get(8)) > 0);
vm2.invoke(() -> validateRegionSize(getTestMethodName(), 10));
}
@Test
public void testParallelPropagationConflation() throws Exception {
doTestParallelPropagationConflation(0);
}
@Test
public void testParallelPropagationConflationRedundancy2() throws Exception {
doTestParallelPropagationConflation(2);
}
public void doTestParallelPropagationConflation(int redundancy) throws Exception {
initialSetUp();
createSendersWithConflation();
createSenderPRs(redundancy);
startPausedSenders();
createReceiverPrs();
final Map keyValues = putKeyValues();
vm4.invoke(() -> checkQueueSize("ln", keyValues.size()));
final Map updateKeyValues = updateKeyValues();
vm4.invoke(() -> checkQueueSize("ln", keyValues.size() + updateKeyValues.size())); // creates
// aren't
// conflated
vm4.invoke(() -> putGivenKeyValue(getTestMethodName(), updateKeyValues));
vm4.invoke(() -> checkQueueSize("ln", keyValues.size() + updateKeyValues.size())); // creates
// aren't
// conflated
vm2.invoke(() -> validateRegionSize(getTestMethodName(), 0));
resumeSenders();
keyValues.putAll(updateKeyValues);
validateReceiverRegionSize(keyValues);
}
@Test
public void testParallelPropagationConflationOfRandomKeys() throws Exception {
initialSetUp();
createSendersWithConflation();
createSenderPRs();
startPausedSenders();
createReceiverPrs();
final Map keyValues = putKeyValues();
vm4.invoke(() -> checkQueueSize("ln", keyValues.size()));
final Map updateKeyValues = new HashMap();
while (updateKeyValues.size() != 10) {
int key = (new Random()).nextInt(keyValues.size());
updateKeyValues.put(key, key + "_updated");
}
vm4.invoke(() -> putGivenKeyValue(getTestMethodName(), updateKeyValues));
vm4.invoke(() -> checkQueueSize("ln", keyValues.size() + updateKeyValues.size()));
vm4.invoke(() -> putGivenKeyValue(getTestMethodName(), updateKeyValues));
vm4.invoke(() -> checkQueueSize("ln", keyValues.size() + updateKeyValues.size()));
vm2.invoke(() -> validateRegionSize(getTestMethodName(), 0));
resumeSenders();
keyValues.putAll(updateKeyValues);
validateReceiverRegionSize(keyValues);
}
@Test
public void testParallelPropagationColocatedRegionConflation() throws Exception {
initialSetUp();
createSendersWithConflation();
createOrderShipmentOnSenders();
startPausedSenders();
createOrderShipmentOnReceivers();
Map custKeyValues = (Map) vm4.invoke(() -> putCustomerPartitionedRegion(20));
Map orderKeyValues = (Map) vm4.invoke(() -> putOrderPartitionedRegion(20));
Map shipmentKeyValues = (Map) vm4.invoke(() -> putShipmentPartitionedRegion(20));
vm4.invoke(() -> WANTestBase.checkQueueSize("ln",
(custKeyValues.size() + orderKeyValues.size() + shipmentKeyValues.size())));
Map updatedCustKeyValues = (Map) vm4.invoke(() -> updateCustomerPartitionedRegion(10));
Map updatedOrderKeyValues = (Map) vm4.invoke(() -> updateOrderPartitionedRegion(10));
Map updatedShipmentKeyValues = (Map) vm4.invoke(() -> updateShipmentPartitionedRegion(10));
int sum = (custKeyValues.size() + orderKeyValues.size() + shipmentKeyValues.size())
+ updatedCustKeyValues.size() + updatedOrderKeyValues.size()
+ updatedShipmentKeyValues.size();
vm4.invoke(() -> WANTestBase.checkQueueSize("ln", sum));
updatedCustKeyValues = (Map) vm4.invoke(() -> updateCustomerPartitionedRegion(10));
updatedOrderKeyValues = (Map) vm4.invoke(() -> updateOrderPartitionedRegion(10));
updatedShipmentKeyValues = (Map) vm4.invoke(() -> updateShipmentPartitionedRegion(10));
int sum2 = (custKeyValues.size() + orderKeyValues.size() + shipmentKeyValues.size())
+ updatedCustKeyValues.size() + updatedOrderKeyValues.size()
+ updatedShipmentKeyValues.size();
vm4.invoke(() -> WANTestBase.checkQueueSize("ln", sum2));
vm2.invoke(() -> validateRegionSize(WANTestBase.customerRegionName, 0));
vm2.invoke(() -> validateRegionSize(WANTestBase.orderRegionName, 0));
vm2.invoke(() -> validateRegionSize(WANTestBase.shipmentRegionName, 0));
resumeSenders();
custKeyValues.putAll(updatedCustKeyValues);
orderKeyValues.putAll(updatedOrderKeyValues);
shipmentKeyValues.putAll(updatedShipmentKeyValues);
validateColocatedRegionContents(custKeyValues, orderKeyValues, shipmentKeyValues);
}
//
// This is the same as the previous test, except for the UsingCustId methods
@Test
public void testParallelPropagationColocatedRegionConflationSameKey() throws Exception {
initialSetUp();
createSendersWithConflation();
createOrderShipmentOnSenders();
startPausedSenders();
createOrderShipmentOnReceivers();
Map custKeyValues = (Map) vm4.invoke(() -> putCustomerPartitionedRegion(20));
Map orderKeyValues = (Map) vm4.invoke(() -> putOrderPartitionedRegionUsingCustId(20));
Map shipmentKeyValues = (Map) vm4.invoke(() -> putShipmentPartitionedRegionUsingCustId(20));
vm4.invoke(() -> checkQueueSize("ln",
(custKeyValues.size() + orderKeyValues.size() + shipmentKeyValues.size())));
Map updatedCustKeyValues = (Map) vm4.invoke(() -> updateCustomerPartitionedRegion(10));
Map updatedOrderKeyValues = (Map) vm4.invoke(() -> updateOrderPartitionedRegionUsingCustId(10));
Map updatedShipmentKeyValues =
(Map) vm4.invoke(() -> updateShipmentPartitionedRegionUsingCustId(10));
int sum = (custKeyValues.size() + orderKeyValues.size() + shipmentKeyValues.size())
+ updatedCustKeyValues.size() + updatedOrderKeyValues.size()
+ updatedShipmentKeyValues.size();
vm4.invoke(() -> checkQueueSize("ln", sum));
updatedCustKeyValues = (Map) vm4.invoke(() -> updateCustomerPartitionedRegion(10));
updatedOrderKeyValues = (Map) vm4.invoke(() -> updateOrderPartitionedRegionUsingCustId(10));
updatedShipmentKeyValues =
(Map) vm4.invoke(() -> updateShipmentPartitionedRegionUsingCustId(10));
int sum2 = (custKeyValues.size() + orderKeyValues.size() + shipmentKeyValues.size())
+ updatedCustKeyValues.size() + updatedOrderKeyValues.size()
+ updatedShipmentKeyValues.size();
vm4.invoke(() -> checkQueueSize("ln", sum2));
vm2.invoke(() -> validateRegionSize(WANTestBase.customerRegionName, 0));
vm2.invoke(() -> validateRegionSize(WANTestBase.orderRegionName, 0));
vm2.invoke(() -> validateRegionSize(WANTestBase.shipmentRegionName, 0));
resumeSenders();
custKeyValues.putAll(updatedCustKeyValues);
orderKeyValues.putAll(updatedOrderKeyValues);
shipmentKeyValues.putAll(updatedShipmentKeyValues);
validateColocatedRegionContents(custKeyValues, orderKeyValues, shipmentKeyValues);
}
protected void validateColocatedRegionContents(Map custKeyValues, Map orderKeyValues,
Map shipmentKeyValues) {
vm2.invoke(() -> validateRegionSize(WANTestBase.customerRegionName, custKeyValues.size()));
vm2.invoke(() -> validateRegionSize(WANTestBase.orderRegionName, orderKeyValues.size()));
vm2.invoke(() -> validateRegionSize(WANTestBase.shipmentRegionName, shipmentKeyValues.size()));
vm2.invoke(() -> validateRegionContents(WANTestBase.customerRegionName, custKeyValues));
vm2.invoke(() -> validateRegionContents(WANTestBase.orderRegionName, orderKeyValues));
vm2.invoke(() -> validateRegionContents(WANTestBase.shipmentRegionName, shipmentKeyValues));
vm3.invoke(() -> validateRegionSize(WANTestBase.customerRegionName, custKeyValues.size()));
vm3.invoke(() -> validateRegionSize(WANTestBase.orderRegionName, orderKeyValues.size()));
vm3.invoke(() -> validateRegionSize(WANTestBase.shipmentRegionName, shipmentKeyValues.size()));
vm3.invoke(() -> validateRegionContents(WANTestBase.customerRegionName, custKeyValues));
vm3.invoke(() -> validateRegionContents(WANTestBase.orderRegionName, orderKeyValues));
vm3.invoke(() -> validateRegionContents(WANTestBase.shipmentRegionName, shipmentKeyValues));
}
protected void createOrderShipmentOnReceivers() {
vm2.invoke(() -> createCustomerOrderShipmentPartitionedRegion(null, 1, 8, isOffHeap()));
vm3.invoke(() -> createCustomerOrderShipmentPartitionedRegion(null, 1, 8, isOffHeap()));
}
protected void createOrderShipmentOnSenders() {
vm4.invoke(() -> createCustomerOrderShipmentPartitionedRegion("ln", 0, 8, isOffHeap()));
vm5.invoke(() -> createCustomerOrderShipmentPartitionedRegion("ln", 0, 8, isOffHeap()));
vm6.invoke(() -> createCustomerOrderShipmentPartitionedRegion("ln", 0, 8, isOffHeap()));
vm7.invoke(() -> createCustomerOrderShipmentPartitionedRegion("ln", 0, 8, isOffHeap()));
}
protected Map updateKeyValues() {
final Map updateKeyValues = new HashMap();
for (int i = 0; i < 10; i++) {
updateKeyValues.put(i, i + "_updated");
}
vm4.invoke(() -> putGivenKeyValue(getTestMethodName(), updateKeyValues));
return updateKeyValues;
}
protected Map putKeyValues() {
final Map keyValues = new HashMap();
for (int i = 0; i < 20; i++) {
keyValues.put(i, i);
}
vm4.invoke(() -> putGivenKeyValue(getTestMethodName(), keyValues));
return keyValues;
}
protected void validateReceiverRegionSize(final Map keyValues) {
vm2.invoke(() -> validateRegionSize(getTestMethodName(), keyValues.size()));
vm3.invoke(() -> validateRegionSize(getTestMethodName(), keyValues.size()));
vm2.invoke(() -> validateRegionContents(getTestMethodName(), keyValues));
vm3.invoke(() -> validateRegionContents(getTestMethodName(), keyValues));
}
protected void resumeSenders() {
vm4.invoke(() -> resumeSender("ln"));
vm5.invoke(() -> resumeSender("ln"));
vm6.invoke(() -> resumeSender("ln"));
vm7.invoke(() -> resumeSender("ln"));
}
protected void createReceiverPrs() {
vm2.invoke(() -> createPartitionedRegion(getTestMethodName(), null, 1, 8, isOffHeap()));
vm3.invoke(() -> createPartitionedRegion(getTestMethodName(), null, 1, 8, isOffHeap()));
}
protected void startPausedSenders() {
startSenderInVMs("ln", vm4, vm5, vm6, vm7);
pauseSenders();
}
protected void pauseSenders() {
vm4.invoke(() -> pauseSender("ln"));
vm5.invoke(() -> pauseSender("ln"));
vm6.invoke(() -> pauseSender("ln"));
vm7.invoke(() -> pauseSender("ln"));
}
protected void createSenderPRs() {
createSenderPRs(0);
}
protected void createSenderPRs(int redundancy) {
vm4.invoke(
() -> createPartitionedRegion(getTestMethodName(), "ln", redundancy, 8, isOffHeap()));
vm5.invoke(
() -> createPartitionedRegion(getTestMethodName(), "ln", redundancy, 8, isOffHeap()));
vm6.invoke(
() -> createPartitionedRegion(getTestMethodName(), "ln", redundancy, 8, isOffHeap()));
vm7.invoke(
() -> createPartitionedRegion(getTestMethodName(), "ln", redundancy, 8, isOffHeap()));
}
protected void initialSetUp() {
Integer lnPort = (Integer) vm0.invoke(() -> createFirstLocatorWithDSId(1));
Integer nyPort = (Integer) vm1.invoke(() -> createFirstRemoteLocator(2, lnPort));
createCacheInVMs(nyPort, vm2, vm3);
createReceiverInVMs(vm2, vm3);
createCacheInVMs(lnPort, vm4, vm5, vm6, vm7);
}
protected void createSendersNoConflation() {
vm4.invoke(() -> createSender("ln", 2, true, 100, 10, false, false, null, true));
vm5.invoke(() -> createSender("ln", 2, true, 100, 10, false, false, null, true));
vm6.invoke(() -> createSender("ln", 2, true, 100, 10, false, false, null, true));
vm7.invoke(() -> createSender("ln", 2, true, 100, 10, false, false, null, true));
}
protected void createSendersWithConflation() {
vm4.invoke(() -> createSender("ln", 2, true, 100, 2, true, false, null, true));
vm5.invoke(() -> createSender("ln", 2, true, 100, 2, true, false, null, true));
vm6.invoke(() -> createSender("ln", 2, true, 100, 2, true, false, null, true));
vm7.invoke(() -> createSender("ln", 2, true, 100, 2, true, false, null, true));
}
}