@Override public void basicDestroy(final EntryEventImpl event, final boolean cacheWrite, Object expectedOldValue) throws EntryNotFoundException, CacheWriterException, TimeoutException { try { super.basicDestroy(event, cacheWrite, expectedOldValue); } finally { GatewaySenderEventImpl.release(event.getRawOldValue()); } }
/** * Add the cache event's old value to this message. We must propagate the old value when the * receiver is doing GII and has listeners (CQs) that require the old value. * * @since GemFire 5.5 * @param event the entry event that contains the old value */ public void appendOldValueToMessage(EntryEventImpl event) { @Unretained Object val = event.getRawOldValue(); if (val == null || val == Token.NOT_AVAILABLE || val == Token.REMOVED_PHASE1 || val == Token.REMOVED_PHASE2 || val == Token.DESTROYED || val == Token.TOMBSTONE) { return; } event.exportOldValue(this); }
@Override public boolean virtualPut(EntryEventImpl event, boolean ifNew, boolean ifOld, Object expectedOldValue, boolean requireOldValue, long lastModified, boolean overwriteDestroyed) throws TimeoutException, CacheWriterException { try { boolean success = super.virtualPut(event, ifNew, ifOld, expectedOldValue, requireOldValue, lastModified, overwriteDestroyed); if (success) { if (logger.isDebugEnabled()) { logger.debug("Key : ----> {}", event.getKey()); } } else { GatewaySenderEventImpl.release(event.getRawNewValue()); } return success; } finally { GatewaySenderEventImpl.release(event.getRawOldValue()); } }
@Override public void afterUpdate(EntryEvent event) { EntryEventImpl ee = (EntryEventImpl) event; logger.debug("BucketListener: o={}, r={}, k={}, ov={}, nv={}, dm={}", event.getOperation(), event.getRegion().getFullPath(), event.getKey(), ee.getRawOldValue(), ee.getRawNewValue(), event.getDistributedMember()); }
@Test public void putWithExpectedOldValueReturnsNull_ifExistingValueIsNotExpected() { givenAnOperationThatGuaranteesOldValue(); expectedOldValue = "expectedOldValue"; when(event.getRawOldValue()).thenReturn("unexpectedValue"); RegionEntry result = doPut(); assertThat(result).isNull(); }
@Override public boolean virtualPut(EntryEventImpl event, boolean ifNew, boolean ifOld, Object expectedOldValue, boolean requireOldValue, long lastModified, boolean overwriteDestroyed) throws TimeoutException, CacheWriterException { try { boolean success = super.virtualPut(event, ifNew, ifOld, expectedOldValue, requireOldValue, lastModified, overwriteDestroyed); if (!success) { // release offheap reference if GatewaySenderEventImpl is not put into // the region queue GatewaySenderEventImpl.release(event.getRawNewValue()); } return success; } finally { // GatewaySenderQueue probably only adding new events into the queue. // Add the finally block just in case if there actually is an update // in the sender queue or occurs in the the future. GatewaySenderEventImpl.release(event.getRawOldValue()); } } }
@Test public void putWithExpectedOldValueReturnsRegionEntry_ifExistingValueIsExpected() { givenAnOperationThatGuaranteesOldValue(); expectedOldValue = "expectedOldValue"; when(event.getRawOldValue()).thenReturn(expectedOldValue); RegionEntry result = doPut(); assertThat(result).isSameAs(createdRegionEntry); }
@Test public void putWithExpectedOldValueReturnsRegionEntry_ifExistingValueIsNotExpectedButIsReplaceOnClient() { givenAnOperationThatGuaranteesOldValue(); expectedOldValue = "expectedOldValue"; when(event.getRawOldValue()).thenReturn("unexpectedValue"); givenReplaceOnClient(); RegionEntry result = doPut(); assertThat(result).isSameAs(createdRegionEntry); }
@Test public void cacheWriteBeforePutCalledWithExpectedOldValue_givenRequireOldValueTrue() { givenPutNeedsToDoCacheWrite(); when(internalRegion.isInitialized()).thenReturn(true); givenAnOperationThatGuaranteesOldValue(); givenExistingRegionEntry(); when(existingRegionEntry.getValueRetain(same(internalRegion), eq(true))).thenReturn(null); expectedOldValue = "expectedOldValue"; when(event.getRawOldValue()).thenReturn(expectedOldValue); doPut(); verify(internalRegion, times(1)).cacheWriteBeforePut(same(event), any(), any(), anyBoolean(), same(expectedOldValue)); }
@Test public void txApplyDestroySetsOldValueOnEventToNotAvailable_givenFactoryRegionEntry() { givenLocalRegion(); givenConcurrencyChecks(); givenFactoryRegionEntry(); doTxApplyDestroy(); EntryEventImpl event = pendingCallbacks.get(0); assertThat(event.getRawOldValue()).isSameAs(Token.NOT_AVAILABLE); }
@Test public void txApplyDestroySetsOldValueOnEventToNotAvailable_givenOldRegionEntry() { givenLocalRegion(); givenConcurrencyChecks(); givenOldRegionEntry(); doTxApplyDestroy(); EntryEventImpl event = pendingCallbacks.get(0); assertThat(event.getRawOldValue()).isSameAs(Token.NOT_AVAILABLE); }
GatewaySenderEventImpl.release(event.getRawOldValue());
public void basicDestroy(final EntryEventImpl event, final boolean cacheWrite, Object expectedOldValue, boolean forceBasicDestroy) throws EntryNotFoundException, CacheWriterException, TimeoutException { boolean indexEntryFound = true; if (getPartitionedRegion().isConflationEnabled()) { indexEntryFound = containsKey(event.getKey()) && removeIndex((Long) event.getKey()); } try { if (indexEntryFound || forceBasicDestroy) { super.basicDestroy(event, cacheWrite, expectedOldValue); } else { throw new EntryNotFoundException(event.getKey().toString()); } } finally { GatewaySenderEventImpl.release(event.getRawOldValue()); } // Primary buckets should already remove the key while peeking if (!this.getBucketAdvisor().isPrimary()) { if (logger.isDebugEnabled()) { logger.debug(" removing the key {} from eventSeqNumQueue", event.getKey()); } this.eventSeqNumDeque.remove(event.getKey()); } }
private boolean checkExpectedOldValuePrecondition() { // replace is propagated to server, so no need to check // satisfiesOldValue on client final EntryEventImpl event = getEvent(); if (getExpectedOldValue() != null && !isReplaceOnClient()) { assert event.getOperation().guaranteesOldValue(); // We already called setOldValueInEvent so the event will have the old value. @Unretained Object v = event.getRawOldValue(); // Note that v will be null instead of INVALID because setOldValue // converts INVALID to null. // But checkExpectedOldValue handle this and says INVALID equals null. if (!AbstractRegionEntry.checkExpectedOldValue(getExpectedOldValue(), v, event.getRegion())) { return false; } } return true; }
Object old = event.getRawOldValue(); if (old instanceof byte[]) { this.oldValueIsSerialized = false;
/** * 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()); }
final Object ov = getRawOldValue(); if (ov instanceof StoredObject) { final StoredObject so = (StoredObject) ov;