private void txHandleWANEvent(final LocalRegion owner, EntryEventImpl callbackEvent, TXEntryState txEntryState) { owner.handleWANEvent(callbackEvent); if (txEntryState != null) { txEntryState.setTailKey(callbackEvent.getTailKey()); } }
/** * Removes the EntryEventImpl, whose tailKey matches with the provided tailKey, from * tmpQueueEvents. * */ public boolean removeFromTempQueueEvents(Object tailKey) { synchronized (this.queuedEventsSync) { Iterator<TmpQueueEvent> itr = this.tmpQueuedEvents.iterator(); while (itr.hasNext()) { TmpQueueEvent event = itr.next(); if (tailKey.equals(event.getEvent().getTailKey())) { if (logger.isDebugEnabled()) { logger.debug( "shadowKey {} is found in tmpQueueEvents at AbstractGatewaySender level. Removing from there..", tailKey); } event.release(); itr.remove(); return true; } } return false; } }
@Override public void enqueueEvent(EnumListenerEvent operation, EntryEvent event, Object substituteValue) throws IOException, CacheException { GatewaySenderEventImpl gatewayQueueEvent = null; Region region = event.getRegion(); if (!(region instanceof DistributedRegion) && ((EntryEventImpl) event).getTailKey() == -1) { // In case of parallel sender, we don't expect the key to be not set. // If it is the case then the event must be coming from notificationOnly message. // Don't enqueue the event and return from here only. // Fix for #49081 and EntryDestroyedException in #49367. if (logger.isDebugEnabled()) { logger.debug( "ParallelGatewaySenderEventProcessor not enqueing the following event since tailKey is not set. {}", event); } return; } // TODO: Looks like for PDX region bucket id is set to -1. EventID eventID = ((EntryEventImpl) event).getEventId(); // while merging 42004, kept substituteValue as it is(it is barry's // change 42466). bucketID is merged with eventID.getBucketID gatewayQueueEvent = new GatewaySenderEventImpl(operation, event, substituteValue, true, eventID.getBucketID()); enqueueEvent(gatewayQueueEvent); }
Atomics.setIfGreater(this.eventSeqNum, event.getTailKey()); if (logger.isDebugEnabled()) { logger.debug("WAN: On secondary bucket {}, setting the seq number as {}", getId(), event.getTailKey());
@Override public void toData(DataOutput out) throws IOException { super.toData(out); DataSerializer.writeObject(this.eventId, out); DataSerializer.writeObject(this.key, out); DataSerializer.writeBoolean(Boolean.TRUE, out); DataSerializer.writeLong(this.event.getTailKey(), out); }
@Override protected void registerEventDroppedInPrimaryQueue(EntryEventImpl droppedEvent) { if (queue == null) { return; } ConcurrentParallelGatewaySenderQueue cpgsq = (ConcurrentParallelGatewaySenderQueue) queue; PartitionedRegion prQ = cpgsq.getRegion(droppedEvent.getRegion().getFullPath()); if (prQ == null) { if (logger.isDebugEnabled()) { logger.debug("shadow partitioned region " + droppedEvent.getRegion().getFullPath() + " is not created yet."); } return; } int bucketId = PartitionedRegionHelper.getHashKey((EntryOperation) droppedEvent); long shadowKey = droppedEvent.getTailKey(); ParallelGatewaySenderQueue pgsq = (ParallelGatewaySenderQueue) cpgsq.getQueueByBucket(bucketId); boolean isPrimary = prQ.getRegionAdvisor().getBucketAdvisor(bucketId).isPrimary(); if (isPrimary) { pgsq.sendQueueRemovalMesssageForDroppedEvent(prQ, bucketId, shadowKey); this.sender.getStatistics().incEventsDroppedDueToPrimarySenderNotRunning(); if (logger.isDebugEnabled()) { logger.debug("register dropped event for primary queue. BucketId is " + bucketId + ", shadowKey is " + shadowKey + ", prQ is " + prQ.getFullPath()); } } }
@Override public void toData(DataOutput out) throws IOException { super.toData(out); DataSerializer.writeObject(this.eventId, out); DataSerializer.writeObject(this.key, out); DistributedRegion region = (DistributedRegion) this.event.getRegion(); if (region instanceof BucketRegion) { PartitionedRegion pr = region.getPartitionedRegion(); if (pr.isParallelWanEnabled()) { DataSerializer.writeBoolean(Boolean.TRUE, out); DataSerializer.writeLong(this.event.getTailKey(), out); } else { DataSerializer.writeBoolean(Boolean.FALSE, out); } } else if (((LocalRegion) region).isUsedForSerialGatewaySenderQueue()) { DataSerializer.writeBoolean(Boolean.TRUE, out); DataSerializer.writeLong(this.event.getTailKey(), out); } else { DataSerializer.writeBoolean(Boolean.FALSE, out); } }
@Override public void toData(DataOutput out) throws IOException { super.toData(out); DataSerializer.writeObject(this.eventId, out); DataSerializer.writeObject(this.key, out); DistributedRegion region = (DistributedRegion) this.event.getRegion(); if (region instanceof BucketRegion) { PartitionedRegion pr = region.getPartitionedRegion(); if (pr.isParallelWanEnabled()) { DataSerializer.writeBoolean(Boolean.TRUE, out); DataSerializer.writeLong(this.event.getTailKey(), out); } else { DataSerializer.writeBoolean(Boolean.FALSE, out); } } else if (((LocalRegion) region).isUsedForSerialGatewaySenderQueue()) { DataSerializer.writeBoolean(Boolean.TRUE, out); DataSerializer.writeLong(this.event.getTailKey(), out); } else { DataSerializer.writeBoolean(Boolean.FALSE, out); } } }
} else { out.writeBoolean(true); out.writeLong(this.event.getTailKey());
removeAllPRData[i].setTailKey(ev.getTailKey()); if (!didRemove) { // make sure the region hasn't gone away r.checkReadiness();
putAllPRData[i].setTailKey(ev.getTailKey()); if (!didPut) { // make sure the region hasn't gone away r.checkReadiness();
/** * Constructor to use when preparing to send putall data out */ public RemoveAllEntryData(EntryEventImpl event) { this.key = event.getKey(); Object oldValue = event.getRawOldValue(); if (oldValue == Token.NOT_AVAILABLE || Token.isRemoved(oldValue)) { this.oldValue = null; } else { this.oldValue = oldValue; } this.op = event.getOperation(); this.eventID = event.getEventId(); this.tailKey = event.getTailKey(); this.versionTag = event.getVersionTag(); setNotifyOnly(!event.getInvokePRCallbacks()); setCallbacksInvoked(event.callbacksInvoked()); setPossibleDuplicate(event.isPossibleDuplicate()); setInhibitDistribution(event.getInhibitDistribution()); setRedestroyedEntry(event.getIsRedestroyedEntry()); }
/** * Constructor to use when preparing to send putall data out */ public PutAllEntryData(EntryEventImpl event) { this.key = event.getKey(); this.value = event.getRawNewValueAsHeapObject(); Object oldValue = event.getRawOldValueAsHeapObject(); if (oldValue == Token.NOT_AVAILABLE || Token.isRemoved(oldValue)) { this.oldValue = null; } else { this.oldValue = oldValue; } this.op = event.getOperation(); this.eventID = event.getEventId(); this.tailKey = event.getTailKey(); this.versionTag = event.getVersionTag(); setNotifyOnly(!event.getInvokePRCallbacks()); setCallbacksInvoked(event.callbacksInvoked()); setPossibleDuplicate(event.isPossibleDuplicate()); setInhibitDistribution(event.getInhibitDistribution()); }
@Test public void addsCallbackEvent_givenNoRegionEntryNotInTokenModeNoConcurrencyChecks_andBucket() { givenBucketRegion(); givenNoRegionEntry(); givenNotInTokenMode(); givenNoConcurrencyChecks(); when(partitionedRegion.generateEventID()).thenReturn(true); when(keyInfo.getCallbackArg()).thenReturn(aCallbackArgument); doTxApplyDestroy(); verify(owner, times(1)).handleWANEvent(any()); verify(txEntryState, times(1)).setTailKey(tailKey); assertThat(pendingCallbacks).hasSize(1); EntryEventImpl callbackEvent = pendingCallbacks.get(0); // noinspection Duplicates assertSoftly(softly -> { softly.assertThat(callbackEvent.getRegion()).isSameAs(partitionedRegion); softly.assertThat(callbackEvent.getOperation()).isSameAs(operation); softly.assertThat(callbackEvent.getKey()).isSameAs(key); softly.assertThat(callbackEvent.getNewValue()).isNull(); softly.assertThat(callbackEvent.getTransactionId()).isSameAs(txId); softly.assertThat(callbackEvent.getEventId()).isSameAs(eventId); softly.assertThat(callbackEvent.getCallbackArgument()).isSameAs(aCallbackArgument); softly.assertThat(callbackEvent.getLocalFilterInfo()).isSameAs(filterRoutingInfo); softly.assertThat(callbackEvent.getContext()).isSameAs(bridgeContext); softly.assertThat(callbackEvent.isOriginRemote()).isEqualTo(isOriginRemote); softly.assertThat(callbackEvent.getVersionTag()).isEqualTo(versionTag); softly.assertThat(callbackEvent.getTailKey()).isEqualTo(tailKey); }); }
setShadowKey(event.getTailKey());
@Test public void txApplyDestroySetCorrectPendingCallback_givenNoRegionEntryNotInTokenModeNoConcurrencyChecks() { givenLocalRegion(); givenNoRegionEntry(); givenNotInTokenMode(); givenNoConcurrencyChecks(); when(owner.generateEventID()).thenReturn(true); when(keyInfo.getCallbackArg()).thenReturn(aCallbackArgument); doTxApplyDestroy(); assertThat(pendingCallbacks).hasSize(1); EntryEventImpl callbackEvent = pendingCallbacks.get(0); // noinspection Duplicates assertSoftly(softly -> { softly.assertThat(callbackEvent.getRegion()).isSameAs(owner); softly.assertThat(callbackEvent.getOperation()).isSameAs(operation); softly.assertThat(callbackEvent.getKey()).isSameAs(key); softly.assertThat(callbackEvent.getNewValue()).isNull(); softly.assertThat(callbackEvent.getTransactionId()).isSameAs(txId); softly.assertThat(callbackEvent.getEventId()).isSameAs(eventId); softly.assertThat(callbackEvent.getCallbackArgument()).isSameAs(aCallbackArgument); softly.assertThat(callbackEvent.getLocalFilterInfo()).isSameAs(filterRoutingInfo); softly.assertThat(callbackEvent.getContext()).isSameAs(bridgeContext); softly.assertThat(callbackEvent.isOriginRemote()).isEqualTo(isOriginRemote); softly.assertThat(callbackEvent.getVersionTag()).isEqualTo(versionTag); softly.assertThat(callbackEvent.getTailKey()).isEqualTo(tailKey); }); }
@Test public void addsCallbackEvent_givenOldRegionEntryWithInTokenModeAndInRI() { givenLocalRegion(); givenConcurrencyChecks(); givenOldRegionEntry(); inTokenMode = true; inRI = true; when(owner.generateEventID()).thenReturn(true); when(keyInfo.getCallbackArg()).thenReturn(aCallbackArgument); doTxApplyDestroy(); assertThat(pendingCallbacks).hasSize(1); EntryEventImpl callbackEvent = pendingCallbacks.get(0); // noinspection Duplicates assertSoftly(softly -> { softly.assertThat(callbackEvent.getRegion()).isSameAs(owner); softly.assertThat(callbackEvent.getOperation()).isSameAs(operation); softly.assertThat(callbackEvent.getKey()).isSameAs(key); softly.assertThat(callbackEvent.getNewValue()).isNull(); softly.assertThat(callbackEvent.getTransactionId()).isSameAs(txId); softly.assertThat(callbackEvent.getEventId()).isSameAs(eventId); softly.assertThat(callbackEvent.getCallbackArgument()).isSameAs(aCallbackArgument); softly.assertThat(callbackEvent.getLocalFilterInfo()).isSameAs(filterRoutingInfo); softly.assertThat(callbackEvent.getContext()).isSameAs(bridgeContext); softly.assertThat(callbackEvent.isOriginRemote()).isEqualTo(isOriginRemote); softly.assertThat(callbackEvent.getVersionTag()).isEqualTo(versionTag); softly.assertThat(callbackEvent.getTailKey()).isEqualTo(tailKey); softly.assertThat(callbackEvent.getRegionEntry()).isSameAs(oldRegionEntry); softly.assertThat(callbackEvent.getOldValue()).isNull(); }); }
@Test public void addsCallbackEvent_givenOldRegionEntryAndBucket() { givenBucketRegion(); givenConcurrencyChecks(); givenOldRegionEntry(); when(partitionedRegion.generateEventID()).thenReturn(true); when(keyInfo.getCallbackArg()).thenReturn(aCallbackArgument); doTxApplyDestroy(); EntryEventImpl callbackEvent = pendingCallbacks.get(0); // noinspection Duplicates assertSoftly(softly -> { softly.assertThat(callbackEvent.getRegion()).isSameAs(partitionedRegion); softly.assertThat(callbackEvent.getOperation()).isSameAs(operation); softly.assertThat(callbackEvent.getKey()).isSameAs(key); softly.assertThat(callbackEvent.getNewValue()).isNull(); softly.assertThat(callbackEvent.getTransactionId()).isSameAs(txId); softly.assertThat(callbackEvent.getEventId()).isSameAs(eventId); softly.assertThat(callbackEvent.getCallbackArgument()).isSameAs(aCallbackArgument); softly.assertThat(callbackEvent.getLocalFilterInfo()).isSameAs(filterRoutingInfo); softly.assertThat(callbackEvent.getContext()).isSameAs(bridgeContext); softly.assertThat(callbackEvent.isOriginRemote()).isEqualTo(isOriginRemote); softly.assertThat(callbackEvent.getVersionTag()).isEqualTo(versionTag); softly.assertThat(callbackEvent.getTailKey()).isEqualTo(tailKey); softly.assertThat(callbackEvent.getRegionEntry()).isSameAs(oldRegionEntry); softly.assertThat(callbackEvent.getOldValue()).isNull(); }); }