/** * 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); }
@Test public void verifyExportOldValueWithUnserializedStoredObject() { LocalRegion region = mock(LocalRegion.class); when(region.getOffHeap()).thenReturn(true); StoredObject oldValue = mock(StoredObject.class); byte[] oldValueBytes = new byte[] {1, 2, 3}; when(oldValue.getValueAsHeapByteArray()).thenReturn(oldValueBytes); OldValueImporter ovImporter = mock(OldValueImporter.class); EntryEventImpl e = createEntryEvent(region, null); e.setOldValue(oldValue); e.exportOldValue(ovImporter); verify(ovImporter).importOldBytes(oldValueBytes, false); }
@Test public void verifyExportOldValueWithCacheDeserializableByteArray() { LocalRegion region = mock(LocalRegion.class); CachedDeserializable oldValue = mock(CachedDeserializable.class); byte[] oldValueBytes = new byte[] {1, 2, 3}; when(oldValue.getValue()).thenReturn(oldValueBytes); OldValueImporter ovImporter = mock(OldValueImporter.class); EntryEventImpl e = createEntryEvent(region, null); e.setOldValue(oldValue); e.exportOldValue(ovImporter); verify(ovImporter).importOldBytes(oldValueBytes, true); }
@Test public void verifyExportOldValueWithCacheDeserializableString() { LocalRegion region = mock(LocalRegion.class); CachedDeserializable oldValue = mock(CachedDeserializable.class); Object oldValueObj = "oldValueObj"; when(oldValue.getValue()).thenReturn(oldValueObj); OldValueImporter ovImporter = mock(OldValueImporter.class); EntryEventImpl e = createEntryEvent(region, null); e.setOldValue(oldValue); e.exportOldValue(ovImporter); verify(ovImporter).importOldObject(oldValueObj, true); }
/** Send an ack */ public static void send(InternalDistributedMember recipient, int processorId, ReplySender dm, boolean result, Operation op, ReplyException ex, RemotePutMessage sourceMessage, EntryEventImpl event) { Assert.assertTrue(recipient != null, "PutReplyMessage NULL recipient"); PutReplyMessage m = new PutReplyMessage(processorId, result, op, ex, null, event != null ? event.getVersionTag() : null); if (sourceMessage.requireOldValue && event != null) { event.exportOldValue(m); } m.setRecipient(recipient); dm.putOutgoing(m); }
@Test public void verifyExportOldValueWithByteArray() { LocalRegion region = mock(LocalRegion.class); byte[] oldValue = new byte[] {1, 2, 3}; OldValueImporter ovImporter = mock(OldValueImporter.class); EntryEventImpl e = createEntryEvent(region, null); e.setOldValue(oldValue); e.exportOldValue(ovImporter); verify(ovImporter).importOldBytes(oldValue, false); }
@Test public void verifyExportOldValueWithCacheDeserializableOk() { LocalRegion region = mock(LocalRegion.class); CachedDeserializable oldValue = mock(CachedDeserializable.class); Object oldValueObj = "oldValueObj"; when(oldValue.getValue()).thenReturn(oldValueObj); OldValueImporter ovImporter = mock(OldValueImporter.class); when(ovImporter.isCachedDeserializableValueOk()).thenReturn(true); EntryEventImpl e = createEntryEvent(region, null); e.setOldValue(oldValue); e.exportOldValue(ovImporter); verify(ovImporter).importOldObject(oldValue, true); }
/** Send an ack */ public static void send(InternalDistributedMember recipient, int processorId, ReplySender dm, boolean result, Operation op, ReplyException ex, PutMessage sourceMessage, EntryEventImpl ev) { Assert.assertTrue(recipient != null, "PutReplyMessage NULL reply message"); PutReplyMessage m = new PutReplyMessage(processorId, result, op, ex, null, ev.getVersionTag()); if (!sourceMessage.notificationOnly && sourceMessage.requireOldValue) { ev.exportOldValue(m); } m.setRecipient(recipient); dm.putOutgoing(m); }
@Test public void verifyExportOldValuePrefersOldValueBytes() { LocalRegion region = mock(LocalRegion.class); OldValueImporter ovImporter = mock(OldValueImporter.class); when(ovImporter.prefersOldSerialized()).thenReturn(true); EntryEventImpl e = createEntryEvent(region, null); byte[] oldValueBytes = new byte[] {1, 2, 3}; e.setSerializedOldValue(oldValueBytes); e.exportOldValue(ovImporter); verify(ovImporter).importOldBytes(oldValueBytes, true); }
@Test public void verifyExportOldValueWithSerializedStoredObject() { LocalRegion region = mock(LocalRegion.class); when(region.getOffHeap()).thenReturn(true); StoredObject oldValue = mock(StoredObject.class); when(oldValue.isSerialized()).thenReturn(true); Object oldValueDeserialized = "newValueDeserialized"; when(oldValue.getValueAsDeserializedHeapObject()).thenReturn(oldValueDeserialized); OldValueImporter ovImporter = mock(OldValueImporter.class); EntryEventImpl e = createEntryEvent(region, null); e.setOldValue(oldValue); e.exportOldValue(ovImporter); verify(ovImporter).importOldObject(oldValueDeserialized, true); }
@Test public void verifyExportOldValueWithSerializedStoredObjectAndImporterPrefersSerialized() { LocalRegion region = mock(LocalRegion.class); when(region.getOffHeap()).thenReturn(true); StoredObject oldValue = mock(StoredObject.class); when(oldValue.isSerialized()).thenReturn(true); byte[] oldValueBytes = new byte[] {1, 2, 3}; when(oldValue.getValueAsHeapByteArray()).thenReturn(oldValueBytes); OldValueImporter ovImporter = mock(OldValueImporter.class); when(ovImporter.prefersOldSerialized()).thenReturn(true); EntryEventImpl e = createEntryEvent(region, null); e.setOldValue(oldValue); e.exportOldValue(ovImporter); verify(ovImporter).importOldBytes(oldValueBytes, true); }
@Test public void verifyExportOldValueWithSerializedStoredObjectAndUnretainedOldReferenceOk() { LocalRegion region = mock(LocalRegion.class); when(region.getOffHeap()).thenReturn(true); StoredObject oldValue = mock(StoredObject.class); when(oldValue.isSerialized()).thenReturn(true); Object oldValueDeserialized = "oldValueDeserialized"; when(oldValue.getValueAsDeserializedHeapObject()).thenReturn(oldValueDeserialized); OldValueImporter ovImporter = mock(OldValueImporter.class); when(ovImporter.isUnretainedOldReferenceOk()).thenReturn(true); EntryEventImpl e = createEntryEvent(region, null); e.setOldValue(oldValue); e.exportOldValue(ovImporter); verify(ovImporter).importOldObject(oldValue, true); }
@Test public void verifyExportOldValueWithStringIgnoresOldValueBytes() { LocalRegion region = mock(LocalRegion.class); String oldValue = "oldValue"; OldValueImporter ovImporter = mock(OldValueImporter.class); when(ovImporter.prefersOldSerialized()).thenReturn(true); EntryEventImpl e = createEntryEvent(region, null); byte[] oldValueBytes = new byte[] {1, 2, 3}; e.setSerializedOldValue(oldValueBytes); e.setOldValue(oldValue); e.exportOldValue(ovImporter); verify(ovImporter).importOldObject(oldValue, true); }
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); } }
event.exportOldValue(this);