/* * 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.partitioned.fixed; import static org.junit.Assert.*; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Properties; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.junit.experimental.categories.Category; import org.apache.geode.SystemFailure; import org.apache.geode.cache.AttributesFactory; import org.apache.geode.cache.Cache; import org.apache.geode.cache.CacheFactory; import org.apache.geode.cache.DataPolicy; import org.apache.geode.cache.DiskStore; import org.apache.geode.cache.FixedPartitionAttributes; import org.apache.geode.cache.PartitionAttributesFactory; import org.apache.geode.cache.PartitionResolver; import org.apache.geode.cache.Region; import org.apache.geode.cache.control.RebalanceOperation; import org.apache.geode.cache.control.RebalanceResults; import org.apache.geode.cache.control.ResourceManager; import org.apache.geode.cache.partition.PartitionRegionHelper; import org.apache.geode.distributed.DistributedSystem; import org.apache.geode.distributed.internal.DistributionConfig; import org.apache.geode.distributed.internal.membership.InternalDistributedMember; import org.apache.geode.internal.FileUtil; import org.apache.geode.internal.cache.FixedPartitionAttributesImpl; import org.apache.geode.internal.cache.HARegion; import org.apache.geode.internal.cache.PartitionRegionConfig; import org.apache.geode.internal.cache.PartitionedRegion; import org.apache.geode.internal.cache.PartitionedRegionHelper; import org.apache.geode.internal.cache.execute.data.CustId; import org.apache.geode.internal.cache.execute.data.Customer; import org.apache.geode.internal.cache.execute.data.Order; import org.apache.geode.internal.cache.execute.data.OrderId; import org.apache.geode.internal.cache.execute.data.Shipment; import org.apache.geode.internal.cache.execute.data.ShipmentId; import org.apache.geode.internal.cache.partitioned.PartitionedRegionObserver; import org.apache.geode.internal.cache.partitioned.PartitionedRegionObserverAdapter; import org.apache.geode.internal.cache.partitioned.PartitionedRegionObserverHolder; import org.apache.geode.test.dunit.Host; import org.apache.geode.test.dunit.LogWriterUtils; import org.apache.geode.test.dunit.VM; import org.apache.geode.test.dunit.Wait; import org.apache.geode.test.dunit.WaitCriterion; import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase; import org.apache.geode.test.junit.categories.DistributedTest; /** * This is the base class to do operations */ @Category(DistributedTest.class) public class FixedPartitioningTestBase extends JUnit4DistributedTestCase { protected static String Quarter1 = "Q1"; protected static String Quarter2 = "Q2"; protected static String Quarter3 = "Q3"; protected static String Quarter4 = "Q4"; protected static VM member1 = null; protected static VM member2 = null; protected static VM member3 = null; protected static VM member4 = null; static Cache cache = null; protected static PartitionedRegion region_FPR = null; protected static int redundantCopies; private static PartitionedRegionObserver origObserver; public enum Months_Accessor { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP }; public enum Months_DataStore { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC }; public enum Q1_Months { JAN, FEB, MAR }; public enum Q2_Months { APR, MAY, JUN }; public enum Q3_Months { JUL, AUG, SEP }; public enum Q4_Months { OCT, NOV, DEC }; public FixedPartitioningTestBase() { super(); } public static void createCacheOnMember() { new FixedPartitioningTestBase().createCache(); } public static void createCacheOnMember_DisableMovePrimary() { System.setProperty(DistributionConfig.GEMFIRE_PREFIX + "DISABLE_MOVE_PRIMARIES_ON_STARTUP", "true"); new FixedPartitioningTestBase().createCache(); } private void createCache() { try { Properties props = new Properties(); cache = null; DistributedSystem ds = getSystem(props); assertNotNull(ds); ds.disconnect(); ds = getSystem(props); cache = CacheFactory.create(ds); assertNotNull(cache); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail("Failed while creating the cache", e); } } public static void createRegionWithPartitionAttributes(String regionName, List<FixedPartitionAttributes> fpaList, Integer redCopies, Integer localMaxMemory, Integer totalNumBuckets, PartitionResolver resolver, String colocatedWith, boolean isPersistence) { PartitionAttributesFactory paf_FPR = new PartitionAttributesFactory(); paf_FPR.setRedundantCopies(redCopies); paf_FPR.setLocalMaxMemory(localMaxMemory); paf_FPR.setTotalNumBuckets(totalNumBuckets); paf_FPR.setPartitionResolver(resolver); paf_FPR.setColocatedWith(colocatedWith); if (fpaList != null) { for (FixedPartitionAttributes fpa : fpaList) { paf_FPR.addFixedPartitionAttributes(fpa); } } AttributesFactory af_FPR = new AttributesFactory(); af_FPR.setPartitionAttributes(paf_FPR.create()); if (isPersistence) { DiskStore ds = cache.findDiskStore("disk"); if (ds == null) { ds = cache.createDiskStoreFactory().setDiskDirs(getDiskDirs()).create("disk"); } af_FPR.setDataPolicy(DataPolicy.PERSISTENT_PARTITION); af_FPR.setDiskStoreName("disk"); } region_FPR = (PartitionedRegion) cache.createRegion(regionName, af_FPR.create()); assertNotNull(region_FPR); } public static void doRebalance() { ResourceManager manager = cache.getResourceManager(); RebalanceOperation operation = manager.createRebalanceFactory().start(); try { RebalanceResults result = operation.getResults(); } catch (InterruptedException e) { org.apache.geode.test.dunit.Assert.fail("Not expecting exception", e); } } public static File[] getDiskDirs() { return new File[] {getDiskDir()}; } private static File getDiskDir() { int vmNum = VM.getCurrentVMNum(); File dir = new File("diskDir", String.valueOf(vmNum)).getAbsoluteFile(); dir.mkdirs(); return dir; } public static void putThorughAccessor(String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); for (Months_Accessor month : Months_Accessor.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; region_FPR.put(date, value); } } } public static void putThorughAccessor_Immediate(String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); for (int i = 1; i < 10; i++) { for (Months_Accessor month : Months_Accessor.values()) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; region_FPR.put(date, value); } } } public static void putThroughDataStore(String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); for (Months_DataStore month : Months_DataStore.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; region_FPR.put(date, value); } } } public static void putForQuarter(String regionName, String quarters) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); if (quarters.equals("Q1")) { for (Q1_Months month : Q1_Months.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; region_FPR.put(date, value); } } } else if (quarters.equals("Q2")) { for (Q2_Months month : Q2_Months.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; region_FPR.put(date, value); } } } else if (quarters.equals("Q3")) { for (Q3_Months month : Q3_Months.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; region_FPR.put(date, value); } } } else if (quarters.equals("Q4")) { for (Q4_Months month : Q4_Months.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; region_FPR.put(date, value); } } } else { fail("Wrong Quarter"); } } public static void getForQuarter(String regionName, String quarters) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); if (quarters.equals(Quarter1)) { for (Q1_Months month : Q1_Months.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; assertEquals(value, region_FPR.get(date)); } } } else if (quarters.equals(Quarter2)) { for (Q2_Months month : Q2_Months.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; assertEquals(value, region_FPR.get(date)); } } } else if (quarters.equals(Quarter3)) { for (Q3_Months month : Q3_Months.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; assertEquals(value, region_FPR.get(date)); } } } else if (quarters.equals(Quarter4)) { for (Q4_Months month : Q4_Months.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; assertEquals(value, region_FPR.get(date)); } } } else { fail("Wrong Quarter"); } } public static void getForColocation(String customerRegion, String order, String shipment) { Region region_Cust = (PartitionedRegion) cache.getRegion(customerRegion); assertNotNull(region_Cust); for (int i = 1; i <= 20; i++) { CustId custid = new CustId(i); Customer customer = new Customer("name" + i, "Address" + i); try { assertEquals(customer, region_Cust.get(custid)); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "getForColocation : failed while doing get operation in CustomerPartitionedRegion ", e); } } Region region_Ord = (PartitionedRegion) cache.getRegion(order); assertNull(region_Ord); Region region_Ship = (PartitionedRegion) cache.getRegion(shipment); assertNull(region_Ship); } public static void getThroughDataStore(String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); for (Months_DataStore month : Months_DataStore.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; assertEquals(value, region_FPR.get(date)); } } } public static void putThroughDataStore_NoResolver(String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); for (Months_DataStore month : Months_DataStore.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; region_FPR.put(date, value); } } } public static void putThroughDataStore_CallBackWithResolver(String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); for (Months_DataStore month : Months_DataStore.values()) { for (int i = 1; i < 10; i++) { Date date = generateDate(i, month.toString(), "Date"); Date callbackDate = generateDate(i, month.toString(), "MyDate3"); String value = month.toString() + i; region_FPR.put(date, value, callbackDate); } } } public static void putThroughDataStore_FixedPartitionResolver_NoResolver(String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); for (Months_DataStore month : Months_DataStore.values()) { for (int i = 1; i < 10; i++) { if (i % 2 == 1) { MyDate1 date = (MyDate1) generateDate(i, month.toString(), "MyDate1"); String value = month.toString() + i; region_FPR.put(date, value); } else { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; region_FPR.put(date, value); } } } } public static void putThroughDataStore_FixedPartitionResolver_PartitionResolver( String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); for (int i = 1; i < 10; i++) { for (Months_DataStore month : Months_DataStore.values()) { if (month.ordinal() % 2 == 1) { MyDate1 date = (MyDate1) generateDate(i, month.toString(), "MyDate1"); String value = month.toString() + i; region_FPR.put(date, value); } else { MyDate2 date = (MyDate2) generateDate(i, month.toString(), "MyDate2"); String value = month.toString() + i; region_FPR.put(date, value); } } } } public static void deleteOperation(String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); Date date = generateDate(1, "JAN", "Date"); region_FPR.destroy(date); } public static void putOperation(String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); Date date = generateDate(1, "JAN", "Date"); region_FPR.put(date, "Jan1"); } public static void putCustomerPartitionedRegion(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 40; i++) { CustId custid = new CustId(i); Customer customer = new Customer("name" + i, "Address" + i); try { partitionedregion.put(custid, customer); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putCustomerPartitionedRegion : failed while doing put operation in CustomerPartitionedRegion ", e); } LogWriterUtils.getLogWriter().info("Customer :- { " + custid + " : " + customer + " }"); } } public static void putOrderPartitionedRegion(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 40; i++) { CustId custid = new CustId(i); for (int j = 1; j <= 10; j++) { int oid = (i * 10) + j; OrderId orderId = new OrderId(oid, custid); Order order = new Order("OREDR" + oid); try { partitionedregion.put(orderId, order); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putOrderPartitionedRegion : failed while doing put operation in OrderPartitionedRegion ", e); } LogWriterUtils.getLogWriter().info("Order :- { " + orderId + " : " + order + " }"); } } } public static void putShipmentPartitionedRegion(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 40; i++) { CustId custid = new CustId(i); for (int j = 1; j <= 10; j++) { int oid = (i * 10) + j; OrderId orderId = new OrderId(oid, custid); for (int k = 1; k <= 10; k++) { int sid = (oid * 10) + k; ShipmentId shipmentId = new ShipmentId(sid, orderId); Shipment shipment = new Shipment("Shipment" + sid); try { partitionedregion.put(shipmentId, shipment); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putShipmentPartitionedRegion : failed while doing put operation in ShipmentPartitionedRegion ", e); } LogWriterUtils.getLogWriter() .info("Shipment :- { " + shipmentId + " : " + shipment + " }"); } } } } public static void putCustomerPartitionedRegion_Persistence(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 20; i++) { CustId custid = new CustId(i); Customer customer = new Customer("name" + i, "Address" + i); try { partitionedregion.put(custid, customer); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putCustomerPartitionedRegion : failed while doing put operation in CustomerPartitionedRegion ", e); } LogWriterUtils.getLogWriter().info("Customer :- { " + custid + " : " + customer + " }"); } } public static void putOrderPartitionedRegion_Persistence(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 20; i++) { CustId custid = new CustId(i); for (int j = 1; j <= 10; j++) { int oid = (i * 10) + j; OrderId orderId = new OrderId(oid, custid); Order order = new Order("OREDR" + oid); try { partitionedregion.put(orderId, order); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putOrderPartitionedRegion : failed while doing put operation in OrderPartitionedRegion ", e); } LogWriterUtils.getLogWriter().info("Order :- { " + orderId + " : " + order + " }"); } } } public static void putShipmentPartitionedRegion_Persistence(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 20; i++) { CustId custid = new CustId(i); for (int j = 1; j <= 10; j++) { int oid = (i * 10) + j; OrderId orderId = new OrderId(oid, custid); for (int k = 1; k <= 10; k++) { int sid = (oid * 10) + k; ShipmentId shipmentId = new ShipmentId(sid, orderId); Shipment shipment = new Shipment("Shipment" + sid); try { partitionedregion.put(shipmentId, shipment); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putShipmentPartitionedRegion : failed while doing put operation in ShipmentPartitionedRegion ", e); } LogWriterUtils.getLogWriter() .info("Shipment :- { " + shipmentId + " : " + shipment + " }"); } } } } public static void putCustomerPartitionedRegion_Persistence1(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 20; i++) { if (i % 2 == 0) { CustId custid = new CustId(i); Customer customer = new Customer("name" + i, "Address" + i); try { partitionedregion.put(custid, customer); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putCustomerPartitionedRegion : failed while doing put operation in CustomerPartitionedRegion ", e); } LogWriterUtils.getLogWriter().info("Customer :- { " + custid + " : " + customer + " }"); } } } public static void putOrderPartitionedRegion_Persistence1(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 20; i++) { if (i % 2 == 0) { CustId custid = new CustId(i); for (int j = 1; j <= 10; j++) { int oid = (i * 10) + j; OrderId orderId = new OrderId(oid, custid); Order order = new Order("OREDR" + oid); try { partitionedregion.put(orderId, order); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putOrderPartitionedRegion : failed while doing put operation in OrderPartitionedRegion ", e); } LogWriterUtils.getLogWriter().info("Order :- { " + orderId + " : " + order + " }"); } } } } public static void putShipmentPartitionedRegion_Persistence1(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 20; i++) { if (i % 2 == 0) { CustId custid = new CustId(i); for (int j = 1; j <= 10; j++) { int oid = (i * 10) + j; OrderId orderId = new OrderId(oid, custid); for (int k = 1; k <= 10; k++) { int sid = (oid * 10) + k; ShipmentId shipmentId = new ShipmentId(sid, orderId); Shipment shipment = new Shipment("Shipment" + sid); try { partitionedregion.put(shipmentId, shipment); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putShipmentPartitionedRegion : failed while doing put operation in ShipmentPartitionedRegion ", e); } LogWriterUtils.getLogWriter() .info("Shipment :- { " + shipmentId + " : " + shipment + " }"); } } } } } public static void putCustomerPartitionedRegion_Persistence2(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 20; i++) { if (i % 2 == 1) { CustId custid = new CustId(i); Customer customer = new Customer("name" + i, "Address" + i); try { partitionedregion.put(custid, customer); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putCustomerPartitionedRegion : failed while doing put operation in CustomerPartitionedRegion ", e); } LogWriterUtils.getLogWriter().info("Customer :- { " + custid + " : " + customer + " }"); } } } public static void putOrderPartitionedRegion_Persistence2(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 20; i++) { if (i % 2 == 1) { CustId custid = new CustId(i); for (int j = 1; j <= 10; j++) { int oid = (i * 10) + j; OrderId orderId = new OrderId(oid, custid); Order order = new Order("OREDR" + oid); try { partitionedregion.put(orderId, order); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putOrderPartitionedRegion : failed while doing put operation in OrderPartitionedRegion ", e); } LogWriterUtils.getLogWriter().info("Order :- { " + orderId + " : " + order + " }"); } } } } public static void putShipmentPartitionedRegion_Persistence2(String partitionedRegionName) { assertNotNull(cache); Region partitionedregion = cache.getRegion(Region.SEPARATOR + partitionedRegionName); assertNotNull(partitionedregion); for (int i = 1; i <= 20; i++) { if (i % 2 == 1) { CustId custid = new CustId(i); for (int j = 1; j <= 10; j++) { int oid = (i * 10) + j; OrderId orderId = new OrderId(oid, custid); for (int k = 1; k <= 10; k++) { int sid = (oid * 10) + k; ShipmentId shipmentId = new ShipmentId(sid, orderId); Shipment shipment = new Shipment("Shipment" + sid); try { partitionedregion.put(shipmentId, shipment); } catch (Exception e) { org.apache.geode.test.dunit.Assert.fail( "putShipmentPartitionedRegion : failed while doing put operation in ShipmentPartitionedRegion ", e); } LogWriterUtils.getLogWriter() .info("Shipment :- { " + shipmentId + " : " + shipment + " }"); } } } } } public static void putHAData(String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); assertNotNull(region_FPR); for (Months_DataStore month : Months_DataStore.values()) { for (int i = 10; i < 20; i++) { Date date = generateDate(i, month.toString(), "Date"); String value = month.toString() + i; region_FPR.put(date, value); } } } private static Date generateDate(int i, String month, String dateType) { String year = "2010"; String day = null; if (i > 0 && i < 10) { day = "0" + i; } else { day = Integer.toString(i); } String dateString = day + "-" + month + "-" + year; String DATE_FORMAT = "dd-MMM-yyyy"; SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT, Locale.US); try { if (StringUtils.equals(dateType, "Date")) { return sdf.parse(dateString); } else if (StringUtils.equals(dateType, "MyDate1")) { return new MyDate1(sdf.parse(dateString).getTime()); } else if (StringUtils.equals(dateType, "MyDate2")) { return new MyDate2(sdf.parse(dateString).getTime()); } else if (StringUtils.equals(dateType, "MyDate3")) { return new MyDate3(sdf.parse(dateString).getTime()); } else { return null; } } catch (ParseException e) { org.apache.geode.test.dunit.Assert.fail("Exception occurred while parsing date", e); } return null; } public static void validateAfterPutPartitionedRegion(String customerPartitionedRegionName, String orderPartitionedRegionName, String shipmentPartitionedRegionName) throws ClassNotFoundException { assertNotNull(cache); PartitionedRegion customerPartitionedregion = null; PartitionedRegion orderPartitionedregion = null; PartitionedRegion shipmentPartitionedregion = null; try { customerPartitionedregion = (PartitionedRegion) cache.getRegion(Region.SEPARATOR + customerPartitionedRegionName); orderPartitionedregion = (PartitionedRegion) cache.getRegion(Region.SEPARATOR + orderPartitionedRegionName); shipmentPartitionedregion = (PartitionedRegion) cache.getRegion(Region.SEPARATOR + shipmentPartitionedRegionName); } catch (Exception e) { org.apache.geode.test.dunit.Assert .fail("validateAfterPutPartitionedRegion : failed while getting the region", e); } assertNotNull(customerPartitionedregion); for (int i = 0; i < 10; i++) { InternalDistributedMember idmForCustomer = customerPartitionedregion.getBucketPrimary(i); InternalDistributedMember idmForOrder = orderPartitionedregion.getBucketPrimary(i); InternalDistributedMember idmForShipment = shipmentPartitionedregion.getBucketPrimary(i); // take all the keys from the shipment for each bucket Set customerKey = customerPartitionedregion.getBucketKeys(i); assertNotNull(customerKey); Iterator customerIterator = customerKey.iterator(); while (customerIterator.hasNext()) { CustId custId = (CustId) customerIterator.next(); assertNotNull(customerPartitionedregion.get(custId)); Set orderKey = orderPartitionedregion.getBucketKeys(i); assertNotNull(orderKey); Iterator orderIterator = orderKey.iterator(); while (orderIterator.hasNext()) { OrderId orderId = (OrderId) orderIterator.next(); // assertNotNull(orderPartitionedregion.get(orderId)); if (custId.equals(orderId.getCustId())) { LogWriterUtils.getLogWriter() .info(orderId + "belongs to node " + idmForCustomer + " " + idmForOrder); assertEquals(idmForCustomer, idmForOrder); } Set shipmentKey = shipmentPartitionedregion.getBucketKeys(i); assertNotNull(shipmentKey); Iterator shipmentIterator = shipmentKey.iterator(); while (shipmentIterator.hasNext()) { ShipmentId shipmentId = (ShipmentId) shipmentIterator.next(); // assertNotNull(shipmentPartitionedregion.get(shipmentId)); if (orderId.equals(shipmentId.getOrderId())) { LogWriterUtils.getLogWriter() .info(shipmentId + "belongs to node " + idmForOrder + " " + idmForShipment); } } } } } } public static void checkPrimaryData(String partitionName) { Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); if (partitionName.equals(Quarter1)) { assertEquals(27, localRegion.size()); assertTRUE_Q1(false); assertFALSE_Q2(false); assertFALSE_Q3(false); assertFALSE_Q4(false); } else if (partitionName.equals(Quarter2)) { assertEquals(27, localRegion.size()); assertFALSE_Q1(false); assertTRUE_Q2(false); assertFALSE_Q3(false); assertFALSE_Q4(false); } else if (partitionName.equals(Quarter3)) { assertEquals(27, localRegion.size()); assertFALSE_Q1(false); assertFALSE_Q2(false); assertTRUE_Q3(false); assertFALSE_Q4(false); } else if (partitionName.equals(Quarter4)) { assertEquals(27, localRegion.size()); assertFALSE_Q1(false); assertFALSE_Q2(false); assertFALSE_Q3(false); assertTRUE_Q4(false); } } public static void checkPrimaryDataPersistence(String partitionName) { Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); if (partitionName.equals(Quarter1)) { assertEquals(27 * 2, localRegion.size()); assertTRUE_Q1(false); assertTRUE_Q2(false); assertFALSE_Q3(false); assertFALSE_Q4(false); } else if (partitionName.equals(Quarter2)) { assertEquals(27 * 2, localRegion.size()); assertTRUE_Q1(false); assertTRUE_Q2(false); assertFALSE_Q3(false); assertFALSE_Q4(false); } else if (partitionName.equals(Quarter3)) { assertEquals(27, localRegion.size()); assertFALSE_Q1(false); assertFALSE_Q2(false); assertTRUE_Q3(false); assertFALSE_Q4(false); } else if (partitionName.equals(Quarter4)) { assertEquals(27, localRegion.size()); assertFALSE_Q1(false); assertFALSE_Q2(false); assertFALSE_Q3(false); assertTRUE_Q4(false); } } public static void checkPrimarySecondaryData(String partitionName, Boolean isHA) { Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); if (partitionName.equals(Quarter1)) { assertTRUE_Q1(isHA.booleanValue()); assertTRUE_Q2(isHA.booleanValue()); assertFALSE_Q3(isHA.booleanValue()); assertFALSE_Q4(isHA.booleanValue()); } else if (partitionName.equals(Quarter2)) { assertFALSE_Q1(isHA.booleanValue()); assertTRUE_Q2(isHA.booleanValue()); assertTRUE_Q3(isHA.booleanValue()); assertFALSE_Q4(isHA.booleanValue()); } else if (partitionName.equals(Quarter3)) { assertFALSE_Q1(isHA.booleanValue()); assertFALSE_Q2(isHA.booleanValue()); assertTRUE_Q3(isHA.booleanValue()); assertTRUE_Q4(isHA.booleanValue()); } else if (partitionName.equals(Quarter4)) { assertTRUE_Q1(isHA.booleanValue()); assertFALSE_Q2(isHA.booleanValue()); assertFALSE_Q3(isHA.booleanValue()); assertTRUE_Q4(isHA.booleanValue()); } } public static void checkPrimarySecondaryData_TwoSecondaries(String partitionName, Boolean isHA) { Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); if (partitionName.equals(Quarter1)) { assertTRUE_Q1(isHA.booleanValue()); assertFALSE_Q2(isHA.booleanValue()); assertTRUE_Q3(isHA.booleanValue()); assertTRUE_Q4(isHA.booleanValue()); } else if (partitionName.equals(Quarter2)) { assertFALSE_Q1(isHA.booleanValue()); assertTRUE_Q2(isHA.booleanValue()); assertTRUE_Q3(isHA.booleanValue()); assertTRUE_Q4(isHA.booleanValue()); } else if (partitionName.equals(Quarter3)) { assertTRUE_Q1(isHA.booleanValue()); assertTRUE_Q2(isHA.booleanValue()); assertTRUE_Q3(isHA.booleanValue()); assertFALSE_Q4(isHA.booleanValue()); } else if (partitionName.equals(Quarter4)) { assertTRUE_Q1(isHA.booleanValue()); assertTRUE_Q2(isHA.booleanValue()); assertFALSE_Q3(isHA.booleanValue()); assertTRUE_Q4(isHA.booleanValue()); } } public static void assertTRUE_Q1(boolean isHA) { int day = isHA ? 20 : 10; Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); for (Q1_Months month : Q1_Months.values()) { for (int i = 1; i < day; i++) { Date date = generateDate(i, month.toString(), "Date"); assertTrue(localRegion.keySet().contains(date)); } } } public static void assertTRUE_Q2(boolean isHA) { int day = isHA ? 20 : 10; Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); for (Q2_Months month : Q2_Months.values()) { for (int i = 1; i < day; i++) { Date date = generateDate(i, month.toString(), "Date"); assertTrue(localRegion.keySet().contains(date)); } } } public static void assertTRUE_Q3(boolean isHA) { int day = isHA ? 20 : 10; Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); for (Q3_Months month : Q3_Months.values()) { for (int i = 1; i < day; i++) { Date date = generateDate(i, month.toString(), "Date"); assertTrue(localRegion.keySet().contains(date)); } } } public static void assertTRUE_Q4(boolean isHA) { int day = isHA ? 20 : 10; Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); for (Q4_Months month : Q4_Months.values()) { for (int i = 1; i < day; i++) { Date date = generateDate(i, month.toString(), "Date"); assertTrue(localRegion.keySet().contains(date)); } } } public static void assertFALSE_Q1(boolean isHA) { int day = isHA ? 20 : 10; Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); for (Q1_Months month : Q1_Months.values()) { for (int i = 1; i < day; i++) { Date date = generateDate(i, month.toString(), "Date"); assertFalse(localRegion.keySet().contains(date)); } } } public static void assertFALSE_Q2(boolean isHA) { int day = isHA ? 20 : 10; Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); for (Q2_Months month : Q2_Months.values()) { for (int i = 1; i < day; i++) { Date date = generateDate(i, month.toString(), "Date"); assertFalse(localRegion.keySet().contains(date)); } } } public static void assertFALSE_Q3(boolean isHA) { int day = isHA ? 20 : 10; Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); for (Q3_Months month : Q3_Months.values()) { for (int i = 1; i < day; i++) { Date date = generateDate(i, month.toString(), "Date"); assertFalse(localRegion.keySet().contains(date)); } } } public static void assertFALSE_Q4(boolean isHA) { int day = isHA ? 20 : 10; Region localRegion = PartitionRegionHelper.getLocalData(region_FPR); for (Q4_Months month : Q4_Months.values()) { for (int i = 1; i < day; i++) { Date date = generateDate(i, month.toString(), "Date"); assertFalse(localRegion.keySet().contains(date)); } } } public static void checkPrimaryBucketsForQuarter(Integer numBuckets, Integer primaryBuckets) { HashMap localBucket2RegionMap = (HashMap) region_FPR.getDataStore().getSizeLocally(); LogWriterUtils.getLogWriter().info("Size of the " + region_FPR + " in this VM :- " + localBucket2RegionMap.size() + "List of buckets : " + localBucket2RegionMap.keySet()); assertEquals(numBuckets.intValue(), localBucket2RegionMap.size()); LogWriterUtils.getLogWriter().info("Size of primary buckets the " + region_FPR + " in this VM :- " + region_FPR.getDataStore().getNumberOfPrimaryBucketsManaged()); LogWriterUtils.getLogWriter().info("Lit of Primaries in this VM :- " + region_FPR.getDataStore().getAllLocalPrimaryBucketIds()); assertEquals(primaryBuckets.intValue(), region_FPR.getDataStore().getNumberOfPrimaryBucketsManaged()); } public static void checkPrimaryBucketsForQuarterAfterCacheClosed(Integer numBuckets, Integer primaryBuckets) { HashMap localBucket2RegionMap = (HashMap) region_FPR.getDataStore().getSizeLocally(); LogWriterUtils.getLogWriter().info("Size of the " + region_FPR + " in this VM :- " + localBucket2RegionMap.size() + "List of buckets : " + localBucket2RegionMap.keySet()); assertEquals(numBuckets.intValue(), localBucket2RegionMap.size()); LogWriterUtils.getLogWriter().info("Size of primary buckets the " + region_FPR + " in this VM :- " + region_FPR.getDataStore().getNumberOfPrimaryBucketsManaged()); LogWriterUtils.getLogWriter().info("Lit of Primaries in this VM :- " + region_FPR.getDataStore().getAllLocalPrimaryBucketIds()); assertEquals( region_FPR.getDataStore().getNumberOfPrimaryBucketsManaged() % primaryBuckets.intValue(), 0); } public static void checkPrimaryBucketsForCustomer(Integer numBuckets, Integer primaryBuckets, String customerPartitionedRegionName) { PartitionedRegion customerPartitionedregion = null; try { customerPartitionedregion = (PartitionedRegion) cache.getRegion(Region.SEPARATOR + customerPartitionedRegionName); } catch (Exception e) { org.apache.geode.test.dunit.Assert .fail("validateAfterPutPartitionedRegion : failed while getting the region", e); } HashMap localBucket2RegionMap_Customer = (HashMap) customerPartitionedregion.getDataStore().getSizeLocally(); assertEquals(numBuckets.intValue(), localBucket2RegionMap_Customer.size()); List primaryBuckets_Customer = customerPartitionedregion.getDataStore().getLocalPrimaryBucketsListTestOnly(); assertEquals(primaryBuckets.intValue(), primaryBuckets_Customer.size()); } public static void checkPrimaryBucketsForColocation(Integer numBuckets, Integer primaryBuckets, String customerPartitionedRegionName, String orderPartitionedRegionName, String shipmentPartitionedRegionName) { assertNotNull(cache); PartitionedRegion customerPartitionedregion = null; PartitionedRegion orderPartitionedregion = null; PartitionedRegion shipmentPartitionedregion = null; try { customerPartitionedregion = (PartitionedRegion) cache.getRegion(Region.SEPARATOR + customerPartitionedRegionName); orderPartitionedregion = (PartitionedRegion) cache.getRegion(Region.SEPARATOR + orderPartitionedRegionName); shipmentPartitionedregion = (PartitionedRegion) cache.getRegion(Region.SEPARATOR + shipmentPartitionedRegionName); } catch (Exception e) { org.apache.geode.test.dunit.Assert .fail("validateAfterPutPartitionedRegion : failed while getting the region", e); } HashMap localBucket2RegionMap_Customer = (HashMap) customerPartitionedregion.getDataStore().getSizeLocally(); HashMap localBucket2RegionMap_Order = (HashMap) orderPartitionedregion.getDataStore().getSizeLocally(); HashMap localBucket2RegionMap_Shipment = (HashMap) shipmentPartitionedregion.getDataStore().getSizeLocally(); assertEquals(numBuckets.intValue(), localBucket2RegionMap_Customer.size()); assertEquals(numBuckets.intValue(), localBucket2RegionMap_Order.size()); assertEquals(numBuckets.intValue(), localBucket2RegionMap_Shipment.size()); assertEquals(localBucket2RegionMap_Customer.keySet(), localBucket2RegionMap_Order.keySet()); assertEquals(localBucket2RegionMap_Customer.keySet(), localBucket2RegionMap_Shipment.keySet()); assertEquals(localBucket2RegionMap_Order.keySet(), localBucket2RegionMap_Shipment.keySet()); List primaryBuckets_Customer = customerPartitionedregion.getDataStore().getLocalPrimaryBucketsListTestOnly(); List primaryBuckets_Order = orderPartitionedregion.getDataStore().getLocalPrimaryBucketsListTestOnly(); List primaryBuckets_Shipment = shipmentPartitionedregion.getDataStore().getLocalPrimaryBucketsListTestOnly(); assertEquals(primaryBuckets.intValue(), primaryBuckets_Customer.size()); assertEquals(primaryBuckets.intValue(), primaryBuckets_Order.size()); assertEquals(primaryBuckets.intValue(), primaryBuckets_Shipment.size()); assertEquals(primaryBuckets_Customer, primaryBuckets_Order); assertEquals(primaryBuckets_Customer, primaryBuckets_Shipment); assertEquals(primaryBuckets_Order, primaryBuckets_Shipment); } public static void checkPrimaryBucketsForColocationAfterCacheClosed(Integer numBuckets, Integer primaryBuckets, String customerPartitionedRegionName, String orderPartitionedRegionName, String shipmentPartitionedRegionName) { assertNotNull(cache); PartitionedRegion customerPartitionedregion = null; PartitionedRegion orderPartitionedregion = null; PartitionedRegion shipmentPartitionedregion = null; try { customerPartitionedregion = (PartitionedRegion) cache.getRegion(Region.SEPARATOR + customerPartitionedRegionName); orderPartitionedregion = (PartitionedRegion) cache.getRegion(Region.SEPARATOR + orderPartitionedRegionName); shipmentPartitionedregion = (PartitionedRegion) cache.getRegion(Region.SEPARATOR + shipmentPartitionedRegionName); } catch (Exception e) { org.apache.geode.test.dunit.Assert .fail("validateAfterPutPartitionedRegion : failed while getting the region", e); } HashMap localBucket2RegionMap_Customer = (HashMap) customerPartitionedregion.getDataStore().getSizeLocally(); HashMap localBucket2RegionMap_Order = (HashMap) orderPartitionedregion.getDataStore().getSizeLocally(); HashMap localBucket2RegionMap_Shipment = (HashMap) shipmentPartitionedregion.getDataStore().getSizeLocally(); assertEquals(numBuckets.intValue(), localBucket2RegionMap_Customer.size()); assertEquals(numBuckets.intValue(), localBucket2RegionMap_Order.size()); assertEquals(numBuckets.intValue(), localBucket2RegionMap_Shipment.size()); assertEquals(localBucket2RegionMap_Customer.keySet(), localBucket2RegionMap_Order.keySet()); assertEquals(localBucket2RegionMap_Customer.keySet(), localBucket2RegionMap_Shipment.keySet()); assertEquals(localBucket2RegionMap_Order.keySet(), localBucket2RegionMap_Shipment.keySet()); List primaryBuckets_Customer = customerPartitionedregion.getDataStore().getLocalPrimaryBucketsListTestOnly(); List primaryBuckets_Order = orderPartitionedregion.getDataStore().getLocalPrimaryBucketsListTestOnly(); List primaryBuckets_Shipment = shipmentPartitionedregion.getDataStore().getLocalPrimaryBucketsListTestOnly(); assertEquals(primaryBuckets_Customer.size() % primaryBuckets.intValue(), 0); assertEquals(primaryBuckets_Order.size() % primaryBuckets.intValue(), 0); assertEquals(primaryBuckets_Shipment.size() % primaryBuckets.intValue(), 0); assertEquals(primaryBuckets_Customer, primaryBuckets_Order); assertEquals(primaryBuckets_Customer, primaryBuckets_Shipment); assertEquals(primaryBuckets_Order, primaryBuckets_Shipment); } public static void checkFPR(String regionName) { region_FPR = (PartitionedRegion) cache.getRegion(regionName); PartitionedRegion colocatedRegion = (PartitionedRegion) cache.getRegion(region_FPR.getColocatedWith()); List<FixedPartitionAttributesImpl> childFPAs = region_FPR.getFixedPartitionAttributesImpl(); List<FixedPartitionAttributesImpl> parentFPAs = colocatedRegion.getFixedPartitionAttributesImpl(); assertEquals(parentFPAs, childFPAs); } public static void checkStartingBucketIDs() { assertEquals(region_FPR.getDataStore().getAllLocalPrimaryBucketIds().size() % 3, 0); } public static void checkStartingBucketIDs_Nodedown() { assertEquals(region_FPR.getDataStore().getAllLocalPrimaryBucketIds().size() % 3, 0); } public static void checkStartingBucketIDs_Nodeup() { assertEquals(region_FPR.getDataStore().getAllLocalPrimaryBucketIds().size() % 3, 0); } public static void setPRObserverBeforeCalculateStartingBucketId() { PartitionedRegion.BEFORE_CALCULATE_STARTING_BUCKET_FLAG = true; origObserver = PartitionedRegionObserverHolder.setInstance(new PartitionedRegionObserverAdapter() { public void beforeCalculatingStartingBucketId() { WaitCriterion wc = new WaitCriterion() { String excuse; public boolean done() { Region prRoot = PartitionedRegionHelper.getPRRoot(cache); PartitionRegionConfig regionConfig = (PartitionRegionConfig) prRoot.get("#Quarter"); if (regionConfig == null) { return false; } else { if (!regionConfig.isFirstDataStoreCreated()) { return true; } else { return false; } } } public String description() { return excuse; } }; Wait.waitForCriterion(wc, 20000, 500, false); LogWriterUtils.getLogWriter().info("end of beforeCalculatingStartingBucketId"); } }); } public static void resetPRObserverBeforeCalculateStartingBucketId() throws Exception { PartitionedRegion.BEFORE_CALCULATE_STARTING_BUCKET_FLAG = false; } @Override public final void preTearDown() throws Exception { try { closeCache(); member1.invoke(() -> FixedPartitioningTestBase.closeCache()); member2.invoke(() -> FixedPartitioningTestBase.closeCache()); member3.invoke(() -> FixedPartitioningTestBase.closeCache()); member4.invoke(() -> FixedPartitioningTestBase.closeCache()); } finally { // locally destroy all root regions and close the cache remoteTearDown(); // Now invoke it in every VM for (int h = 0; h < Host.getHostCount(); h++) { Host host = Host.getHost(h); for (int v = 0; v < host.getVMCount(); v++) { VM vm = host.getVM(v); vm.invoke(() -> FixedPartitioningTestBase.remoteTearDown()); } } } } /** * Local destroy all root regions and close the cache. */ protected synchronized static void remoteTearDown() { try { if (cache != null && !cache.isClosed()) { // try to destroy the root regions first so that // we clean up any persistent files. for (Iterator itr = cache.rootRegions().iterator(); itr.hasNext();) { Region root = (Region) itr.next(); // String name = root.getName(); // for colocated regions you can't locally destroy a partitioned // region. if (root.isDestroyed() || root instanceof HARegion || root instanceof PartitionedRegion) { continue; } try { root.localDestroyRegion("teardown"); } catch (VirtualMachineError e) { SystemFailure.initiateFailure(e); throw e; } catch (Throwable t) { LogWriterUtils.getLogWriter().error(t); } } } } finally { try { closeCache(); } catch (VirtualMachineError e) { SystemFailure.initiateFailure(e); throw e; } catch (Throwable t) { LogWriterUtils.getLogWriter().error("Error in closing the cache ", t); } } try { cleanDiskDirs(); } catch (IOException e) { LogWriterUtils.getLogWriter().error("Error cleaning disk dirs", e); } } public static void cleanDiskDirs() throws IOException { FileUtil.delete(getDiskDir()); } public static void closeCache() { System.clearProperty(DistributionConfig.GEMFIRE_PREFIX + "DISABLE_MOVE_PRIMARIES_ON_STARTUP"); // System.setProperty("gemfire.DISABLE_MOVE_PRIMARIES_ON_STARTUP", "false"); if (cache != null && !cache.isClosed()) { cache.close(); cache.getDistributedSystem().disconnect(); } } }