----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/50715/ -----------------------------------------------------------
(Updated Aug. 17, 2016, 11:12 p.m.) Review request for geode, Darrel Schneider, Eric Shu, Scott Jewell, Kirk Lund, and Dan Smith. Changes ------- Refactored the managment of the missingChildren list in the logger object and reformatted the warning messages on missing children. Changes to handling missingChildren removes the need for the logger to be a RegionListener. Each region that has missing child regions anywhere in the colocation hierarchy that it is the root of has an instance of the ColocationLogger that runs as a separate thread. ColocationHelper.hasOfflineColocatedChildRegions determines if there are missing colocated regions (no change here). When it finds any new calls are made to add them to the missingChildren list for the region's logger instance. The logger will write warning messages peridocally as long as there are missing colocated regions. Each region in the missingChildren list is verified as still missing prior to including it in the warning message. If a region is no longer missing, then it's removed from the list. When persistent data recovery is complete for a region or the missingChildren list is empty, then the logger thread terminates. A missing region will be included in the warning for each region above it in a colcation hierarchy. Message format shown in the following example taking from a DUnit test. [vm_0][warn 2016/08/17 15:30:19.663 PDT <ColocationLogger for Parent> tid=88] Persistent data recovery for region /Parent is prevented by offline colocated regions [vm_0] /Gen1_C2 [vm_0] /Gen2_C1_1 [vm_0] /Gen2_C1_2 [vm_0][warn 2016/08/17 15:30:19.676 PDT <ColocationLogger for Gen1_C1> tid=91] Persistent data recovery for region /Gen1_C1 is prevented by offline colocated regions [vm_0] /Gen2_C1_1 [vm_0] /Gen2_C1_2 Repository: geode Description ------- Test for missing parent regions on child region creates and throw IllegalStateException Log warnings about missing colocated child regions. Create Unit and DUnit tests for new exceptions and warnings There are two cases of missing colocated regions, 1) The 'parent' region hasn't been created when a region specifies it in the 'colocated-with' attribute 2) A persistent child region does not exist. For (1), this condition can be determined in ColocationHelper.getColocatedRegion(). The core product currently does not test for this which results in an NPE being thrown without any logging to indicate the reason. There are two variations of this state. 1a) When starting a region with non-null 'colocated'with', a reference to the parent region configuration is obtained through the configuration root. When the reference obtained is null (the region doesn't exist in the root configuration) the NPE ends up getting thrown. The fix for this is to immediately throw an IllegalStateException with a message to note the missing colocated-with region. 1b) The parent region configuration may exist in the root configuration (the parent PR has been created on another member) but does not exist on the local member. In this case the null comes about when obtaining the local region (PartitionedRegion.getPRFromId()). The fix here is the same as (1a) - throw an IllegalStateException. For (2), missing child regions: This state will always exist for an indeterminate period because the parent is always created before the child region. There currently isn't any indication in the logs of this condition, even it if persists indefinitely, other than a failure to recover the PR's persistent data. The fix for this is starting a logging thread (similar to the RedundancyLogger) when a child region is found missing. The condition will be periodically logged (set initially to 30 secs) until the region is created. There is a delay before the first log message to allow time for the normal sequencing of region creations. Diffs (updated) ----- geode-core/src/main/java/com/gemstone/gemfire/internal/cache/ColocationHelper.java 012a77f geode-core/src/main/java/com/gemstone/gemfire/internal/cache/ColocationLogger.java PRE-CREATION geode-core/src/main/java/com/gemstone/gemfire/internal/cache/PartitionRegionConfig.java 6d7c1ca geode-core/src/main/java/com/gemstone/gemfire/internal/cache/PartitionedRegion.java 9ac95a1 geode-core/src/main/java/com/gemstone/gemfire/internal/cache/partitioned/RedundancyLogger.java f7e8621 geode-core/src/main/java/com/gemstone/gemfire/internal/i18n/LocalizedStrings.java 443fe78 geode-core/src/test/java/com/gemstone/gemfire/internal/cache/ColocationHelperTest.java PRE-CREATION geode-core/src/test/java/com/gemstone/gemfire/internal/cache/partitioned/PersistentColocatedPartitionedRegionDUnitTest.java d8b3514 geode-core/src/test/java/com/gemstone/gemfire/internal/cache/partitioned/PersistentPartitionedRegionTestBase.java 692378c Diff: https://reviews.apache.org/r/50715/diff/ Testing ------- precheckin in progress Thanks, Ken Howe