public boolean hasBridgeContext() { if (this.event != null) { return this.event.getContext() != null; } return false; }
@Override public boolean hasClientOrigin() { return getContext() != null; }
@Override protected CacheOperationMessage createMessage() { if (this.event.hasClientOrigin()) { InvalidateWithContextMessage msgwithContxt = new InvalidateWithContextMessage(); msgwithContxt.context = ((EntryEventImpl) this.event).getContext(); return msgwithContxt; } else { return new InvalidateMessage(); } }
@Override protected CacheOperationMessage createMessage() { EntryEventImpl event = getBaseEvent(); RemoveAllMessage msg = new RemoveAllMessage(); msg.eventId = event.getEventId(); msg.context = event.getContext(); return msg; }
@Override protected CacheOperationMessage createMessage() { if (this.event.hasClientOrigin()) { DestroyWithContextMessage msgwithContxt = new DestroyWithContextMessage(event); msgwithContxt.context = ((EntryEventImpl) this.event).getContext(); return msgwithContxt; } else { return new DestroyMessage(event); } }
@Override protected CacheOperationMessage createMessage() { EntryEventImpl event = getBaseEvent(); PutAllMessage msg = new PutAllMessage(); msg.eventId = event.getEventId(); msg.context = event.getContext(); return msg; }
private void givenEventWithClientOrigin() { when(event.getContext()).thenReturn(mock(ClientProxyMembershipID.class)); when(event.isBridgeEvent()).thenReturn(true); when(event.hasClientOrigin()).thenReturn(true); if (event.getVersionTag() != null) { when(event.isFromBridgeAndVersioned()).thenReturn(true); } }
@Override protected CacheOperationMessage createMessage() { EntryEventImpl ev = getEvent(); if (ev.isBridgeEvent()) { UpdateWithContextMessage mssgwithContxt = new UpdateWithContextMessage(); // getContext is not in EntryEvent interface because it exposes a private // class mssgwithContxt.clientID = ev.getContext(); return mssgwithContxt; } else { return new UpdateMessage(); } }
/** * Create RemoveAllPRMessage for notify only (to adjunct nodes) * * @param bucketId create message to send to this bucket */ public RemoveAllPRMessage createPRMessagesNotifyOnly(int bucketId) { final EntryEventImpl event = getBaseEvent(); RemoveAllPRMessage prMsg = new RemoveAllPRMessage(bucketId, removeAllDataSize, true, event.isPossibleDuplicate(), !event.isGenerateCallbacks(), event.getCallbackArgument()); if (event.getContext() != null) { prMsg.setBridgeContext(event.getContext()); } // will not recover event id here for (int i = 0; i < removeAllDataSize; i++) { prMsg.addEntry(removeAllData[i]); } return prMsg; }
/** * Create PutAllPRMessage for notify only (to adjunct nodes) * * @param bucketId create message to send to this bucket */ public PutAllPRMessage createPRMessagesNotifyOnly(int bucketId) { final EntryEventImpl event = getBaseEvent(); PutAllPRMessage prMsg = new PutAllPRMessage(bucketId, putAllDataSize, true, event.isPossibleDuplicate(), !event.isGenerateCallbacks(), event.getCallbackArgument()); if (event.getContext() != null) { prMsg.setBridgeContext(event.getContext()); } // will not recover event id here for (int i = 0; i < putAllDataSize; i++) { prMsg.addEntry(putAllData[i]); } return prMsg; }
@Override public void invalidateExistingEntry(final EntryEventImpl event, boolean invokeCallbacks, boolean forceNewEntry) { if (bridgeContext == null) { bridgeContext = event.getContext(); } if (hasSeenEvent(event)) { return; } TXEntryState tx = txWriteExistingEntry(event, null); assert invokeCallbacks && !forceNewEntry; tx.invalidate(event); recordEvent(event); }
protected DestroyMessage(Set recipients, boolean notifyOnly, int regionId, DirectReplyProcessor processor, EntryEventImpl event, Object expectedOldValue) { super(recipients, regionId, processor, event); this.expectedOldValue = expectedOldValue; this.key = event.getKey(); this.cbArg = event.getRawCallbackArgument(); this.op = event.getOperation(); this.notificationOnly = notifyOnly; this.bridgeContext = event.getContext(); this.eventId = event.getEventId(); this.versionTag = event.getVersionTag(); }
protected RemoteDestroyMessage(DistributedMember recipient, String regionPath, DirectReplyProcessor processor, EntryEventImpl event, Object expectedOldValue, boolean useOriginRemote, boolean possibleDuplicate) { super((InternalDistributedMember) recipient, regionPath, processor); this.expectedOldValue = expectedOldValue; this.key = event.getKey(); this.cbArg = event.getRawCallbackArgument(); this.op = event.getOperation(); this.bridgeContext = event.getContext(); this.eventId = event.getEventId(); this.useOriginRemote = useOriginRemote; this.possibleDuplicate = possibleDuplicate; this.versionTag = event.getVersionTag(); Assert.assertTrue(this.eventId != null); // added for old value if available sent over the wire for cache servers. if (event.hasOldValue()) { this.hasOldValue = true; event.exportOldValue(this); } }
@Override public void destroyExistingEntry(final EntryEventImpl event, final boolean cacheWrite, Object expectedOldValue) { if (bridgeContext == null) { bridgeContext = event.getContext(); } if (hasSeenEvent(event)) { return; } TXEntryState tx = txWriteExistingEntry(event, expectedOldValue); final InternalRegion region = event.getRegion(); if (tx.destroy(event, cacheWrite, isOriginRemoteForEvents())) { Object key = event.getKey(); LocalRegion rr = region.getDataRegionForRead(event.getKeyInfo()); txReadRegion(rr).rmEntryUserAttr(key); recordEvent(event); } }
@Override public void run() { InternalDistributedMember myId = theRegion.getDistributionManager().getDistributionManagerId(); for (int i = 0; i < op.removeAllDataSize; ++i) { @Released EntryEventImpl ev = RemoveAllPRMessage.getEventFromEntry(theRegion, myId, myId, i, op.removeAllData, false, op.getBaseEvent().getContext(), false, !op.getBaseEvent().isGenerateCallbacks()); ev.setRemoveAllOperation(op); try { theRegion.basicDestroy(ev, true/* should we invoke cacheWriter? */, null); } catch (EntryNotFoundException ignore) { } finally { ev.release(); } successfulOps.addKeyAndVersion(op.removeAllData[i].key, null); } } }, op.getBaseEvent().getEventId());
@Override public void run() { // final boolean requiresRegionContext = theRegion.keyRequiresRegionContext(); InternalDistributedMember myId = theRegion.getDistributionManager().getDistributionManagerId(); for (int i = 0; i < putallOp.putAllDataSize; ++i) { @Released EntryEventImpl ev = PutAllPRMessage.getEventFromEntry(theRegion, myId, myId, i, putallOp.putAllData, false, putallOp.getBaseEvent().getContext(), false, !putallOp.getBaseEvent().isGenerateCallbacks()); try { ev.setPutAllOperation(putallOp); if (theRegion.basicPut(ev, false, false, null, false)) { successfulPuts.addKeyAndVersion(putallOp.putAllData[i].key, null); } } finally { ev.release(); } } } }, putallOp.getBaseEvent().getEventId());
@Retained protected static EntryEventImpl createRemoveAllEvent(DistributedRemoveAllOperation op, InternalRegion region, Object entryKey) { @Retained EntryEventImpl e; final Operation entryOp = Operation.REMOVEALL_DESTROY; if (op != null) { EntryEventImpl event = op.getBaseEvent(); if (event.isBridgeEvent()) { e = EntryEventImpl.create(region, entryOp, entryKey, null, event.getRawCallbackArgument(), false, event.distributedMember, event.isGenerateCallbacks()); e.setContext(event.getContext()); } else { e = EntryEventImpl.create(region, entryOp, entryKey, null, event.getCallbackArgument(), false, region.getMyId(), event.isGenerateCallbacks()); } } else { e = EntryEventImpl.create(region, entryOp, entryKey, null, null, false, region.getMyId(), true); } e.removeAllOp = op; return e; }
@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); }); }
@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_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(); }); }