[
https://issues.apache.org/jira/browse/GEODE-6859?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16862571#comment-16862571
]
Barry Oglesby commented on GEODE-6859:
--------------------------------------
As a work-around, the region can be altered to remove the original sender
before it is destroyed:
{noformat}
create gateway-sender --id=mysender --remote-distributed-system-id=2
--enable-persistence --parallel
create region --name=test --gateway-sender-id=mysender
--type=PARTITION_PERSISTENT
create gateway-sender --id=mysender2 --remote-distributed-system-id=4
--enable-persistence --parallel
-> alter region --name=test --gateway-sender-id=''
destroy gateway-sender --id=mysender
alter region --name=test --gateway-sender-id=mysender2
put --region=test --key="3" --value="3"
list gateways
{noformat}
List gateway shows a queued event with this work-around:
{noformat}
GatewaySender Id | Member | Remote Cluster Id | Type | Status | Queued Events |
Receiver Location
---------------- | ----------------------------------- | ----------------- |
-------- | ------- | ------------- | -----------------
mysender2 | 192.168.1.2(server:34608)<v1>:41001 | 4 | Parallel | Running | 1 |
{noformat}
> Destroying a parallel gateway sender attached to a region causes other
> senders attached to that same region to no longer queue events
> -------------------------------------------------------------------------------------------------------------------------------------
>
> Key: GEODE-6859
> URL: https://issues.apache.org/jira/browse/GEODE-6859
> Project: Geode
> Issue Type: Bug
> Components: wan
> Reporter: Barry Oglesby
> Priority: Major
>
> This scenario causes the event to not be put into the queue:
> - create gateway sender sender1
> - create region attached to sender1
> - create gateway sender sender2
> - alter region to be attached to sender2
> - destroy sender1
> - put an entry into region
> Here are the steps using gfsh:
> {noformat}
> gfsh>create gateway-sender --id=mysender --remote-distributed-system-id=2
> --enable-persistence --parallel
> gfsh>create region --name=test --gateway-sender-id=mysender
> --type=PARTITION_PERSISTENT
> gfsh>create gateway-sender --id=mysender2 --remote-distributed-system-id=4
> --enable-persistence --parallel
> gfsh>alter region --name=test --gateway-sender-id=mysender2
> gfsh>destroy gateway-sender --id=mysender
> gfsh>put --region=test --key="3" --value="3"
> {noformat}
> Debug logging shows:
> {noformat}
> [debug 2019/06/11 17:45:03.678 PDT <Function Execution Processor2> tid=0x3a]
> ParallelGatewaySenderOrderedQueue not putting key 164 : Value :
> GatewaySenderEventImpl[id=EventID[192.168.1.2(server)<v1>:41001;threadID=0x1010033|2;sequenceID=125;bucketID=51];action=0;operation=CREATE;region=/test;key=3;value=3;...]
> as shadowPR bucket is destroyed.
> {noformat}
> It comes down to this call in ParallelGatewaySenderQueue.put:
> {noformat}
> thisbucketDestroyed =
> ((PartitionedRegion) prQ.getColocatedWithRegion()).getRegionAdvisor()
> .getBucketAdvisor(bucketId).getShadowBucketDestroyed() || brq.isDestroyed();
> {noformat}
> The first condition is true.
> Here is a stack that shows where shadowBucketDestroyed is set to true:
> {noformat}
> [warn 2019/06/12 16:32:47.066 PDT <Function Execution Processor2> tid=0x3a]
> XXX BucketAdvisor.setShadowBucketDestroyed destroyed=true
> java.lang.Exception
> at
> org.apache.geode.internal.cache.BucketAdvisor.setShadowBucketDestroyed(BucketAdvisor.java:2820)
> at
> org.apache.geode.internal.cache.PartitionedRegionDataStore.cleanUp(PartitionedRegionDataStore.java:1417)
> at
> org.apache.geode.internal.cache.PartitionedRegion.destroyPartitionedRegionLocally(PartitionedRegion.java:7520)
> at
> org.apache.geode.internal.cache.PartitionedRegion.destroyPartitionedRegionGlobally(PartitionedRegion.java:7376)
> at
> org.apache.geode.internal.cache.PartitionedRegion.destroyPartitionedRegion(PartitionedRegion.java:7301)
> at
> org.apache.geode.internal.cache.PartitionedRegion.postDestroyRegion(PartitionedRegion.java:7630)
> at
> org.apache.geode.internal.cache.LocalRegion.recursiveDestroyRegion(LocalRegion.java:2732)
> at
> org.apache.geode.internal.cache.LocalRegion.basicDestroyRegion(LocalRegion.java:6299)
> at
> org.apache.geode.internal.cache.LocalRegion.basicDestroyRegion(LocalRegion.java:6251)
> at
> org.apache.geode.internal.cache.PartitionedRegion.destroyRegion(PartitionedRegion.java:7077)
> at
> org.apache.geode.internal.cache.AbstractRegion.destroyRegion(AbstractRegion.java:453)
> at
> org.apache.geode.internal.cache.wan.AbstractGatewaySender.destroy(AbstractGatewaySender.java:599)
> at
> org.apache.geode.internal.cache.wan.AbstractGatewaySender.destroy(AbstractGatewaySender.java:555)
> at
> org.apache.geode.management.internal.cli.functions.GatewaySenderDestroyFunction.execute(GatewaySenderDestroyFunction.java:60)
> at
> org.apache.geode.internal.cache.MemberFunctionStreamingMessage.process(MemberFunctionStreamingMessage.java:193)
> at
> org.apache.geode.distributed.internal.DistributionMessage.scheduleAction(DistributionMessage.java:369)
> at
> org.apache.geode.distributed.internal.DistributionMessage$1.run(DistributionMessage.java:435)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> at
> org.apache.geode.distributed.internal.ClusterDistributionManager.runUntilShutdown(ClusterDistributionManager.java:960)
> at
> org.apache.geode.distributed.internal.ClusterDistributionManager.doFunctionExecutionThread(ClusterDistributionManager.java:814)
> at
> org.apache.geode.internal.logging.LoggingThreadFactory.lambda$newThread$0(LoggingThreadFactory.java:121)
> at java.lang.Thread.run(Thread.java:745)
> {noformat}
> PartitionedRegionDataStore.cleanUp is doing this:
> {noformat}
> // Fix for defect #49012
> if (buk instanceof AbstractBucketRegionQueue
> && buk.getPartitionedRegion().isShadowPR()) {
> if (buk.getPartitionedRegion().getColocatedWithRegion() != null) {
> buk.getPartitionedRegion().getColocatedWithRegion().getRegionAdvisor()
> .getBucketAdvisor(bucketId).setShadowBucketDestroyed(true);
> }
> }
> {noformat}
> The \{{buk.getPartitionedRegion().getColocatedWithRegion()}} is the data
> region. It can have more than one shadow region.
> So, either this code has to check whether there are other shadow regions
> before making the call to setShadowBucketDestroyed or the BucketAdvisor
> shadowBucketDestroyed has to be maintained per shadow region rather than be a
> single boolean.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)