EventDispatcher(InternalCacheEvent event, EnumListenerEvent op) { if (LocalRegion.this.offHeap && event instanceof EntryEventImpl) { // Make a copy that has its own off-heap refcount so fix bug 48837 event = new EntryEventImpl((EntryEventImpl) event); } this.event = event; this.op = op; }
/** * Creates and returns an EntryEventImpl. Generates and assigns a bucket id to the EntryEventImpl * if the region parameter is a PartitionedRegion. */ @Retained public static EntryEventImpl create(InternalRegion region, Operation op, Object key, boolean originRemote, DistributedMember distributedMember, boolean generateCallbacks, boolean fromRILocalDestroy) { return new EntryEventImpl(region, op, key, originRemote, distributedMember, generateCallbacks, fromRILocalDestroy); }
/** * Creates and returns an EntryEventImpl. Generates and assigns a bucket id to the EntryEventImpl * if the region parameter is a PartitionedRegion. * * This creator does not specify the oldValue as this will be filled in later as part of an * operation on the region, or lets it default to null. */ @Retained public static EntryEventImpl create(final InternalRegion region, Operation op, Object key, @Retained(ENTRY_EVENT_NEW_VALUE) Object newVal, Object callbackArgument, boolean originRemote, DistributedMember distributedMember, boolean generateCallbacks, boolean initializeId) { return new EntryEventImpl(region, op, key, newVal, callbackArgument, originRemote, distributedMember, generateCallbacks, initializeId); }
/** * Creates and returns an EntryEventImpl. Generates and assigns a bucket id to the EntryEventImpl * if the region parameter is a PartitionedRegion. * * Called by BridgeEntryEventImpl to use existing EventID */ @Retained public static EntryEventImpl create(InternalRegion region, Operation op, Object key, @Retained(ENTRY_EVENT_NEW_VALUE) Object newValue, Object callbackArgument, boolean originRemote, DistributedMember distributedMember, boolean generateCallbacks, EventID eventID) { return new EntryEventImpl(region, op, key, newValue, callbackArgument, originRemote, distributedMember, generateCallbacks, eventID); }
if (r.isSingleHop()) { result = new EntryEventImpl(r); result.setOriginRemote(true); result = new EntryEventImpl(r); result.setOperation(Operation.UPDATE); } else if (op == Operation.PUT_IF_ABSENT) { if (result == r) result = new EntryEventImpl(r); result.setOperation(Operation.CREATE); } else if (op == Operation.REMOVE) { if (result == r) result = new EntryEventImpl(r); result.setOperation(Operation.DESTROY);
public void enqueueEvent(EnumListenerEvent operation, EntryEvent event, Object substituteValue, int index) throws CacheException, IOException { // Get the appropriate gateway SerialGatewaySenderEventProcessor serialProcessor = this.processors.get(index); if (sender.getOrderPolicy() == OrderPolicy.KEY || sender.getOrderPolicy() == OrderPolicy.PARTITION) { // Create copy since the event id will be changed, otherwise the same // event will be changed for multiple gateways. Fix for bug 44471. @Released EntryEventImpl clonedEvent = new EntryEventImpl((EntryEventImpl) event); try { setModifiedEventId(clonedEvent, index); serialProcessor.enqueueEvent(operation, clonedEvent, substituteValue); } finally { clonedEvent.release(); } } else { serialProcessor.enqueueEvent(operation, event, substituteValue); } }
@Retained EntryEventImpl createEventForPR(EntryEventImpl sourceEvent) { EntryEventImpl e2 = new EntryEventImpl(sourceEvent); boolean returned = false; try { e2.setRegion(this.partitionedRegion); if (FORCE_LOCAL_LISTENERS_INVOCATION) { e2.setInvokePRCallbacks(true); } else { e2.setInvokePRCallbacks(sourceEvent.getInvokePRCallbacks()); } DistributedMember dm = this.getDistributionManager().getDistributionManagerId(); e2.setOriginRemote(!e2.getDistributedMember().equals(dm)); returned = true; return e2; } finally { if (!returned) { e2.release(); } } }
EntryEventImpl event = new EntryEventImpl((Object) null); try { event.setEventId(eventId);
InternalDistributedMember member1 = mock(InternalDistributedMember.class); EntryEventImpl entryEvent1 = new EntryEventImpl(); entryEvent1 = Mockito.spy(entryEvent1); entryEvent1.setRegion(lr);
@Test public void whenPrepareValueForCacheCalledWithOffHeapEntryHasNewCachedSerializedValue() throws RegionClearedException, IOException, ClassNotFoundException { LocalRegion lr = mock(LocalRegion.class); RegionEntryContext regionEntryContext = mock(RegionEntryContext.class); OutOfOffHeapMemoryListener ooohml = mock(OutOfOffHeapMemoryListener.class); OffHeapMemoryStats stats = mock(OffHeapMemoryStats.class); SlabImpl slab = new SlabImpl(1024); // 1k MemoryAllocatorImpl ma = MemoryAllocatorImpl.createForUnitTest(ooohml, stats, new SlabImpl[] {slab}); try { when(regionEntryContext.getOffHeap()).thenReturn(true); String value = "value"; AbstractRegionEntry re = new TestableRegionEntry(lr, value); assertEquals(value, re.getValueField()); EntryEventImpl entryEvent = new EntryEventImpl(); StoredObject valueForCache = (StoredObject) re.prepareValueForCache(regionEntryContext, value, entryEvent, true); final byte[] cachedSerializedNewValue = entryEvent.getCachedSerializedNewValue(); assertNotNull(cachedSerializedNewValue); valueForCache.checkDataEquals(cachedSerializedNewValue); DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(cachedSerializedNewValue)); Object o = DataSerializer.readObject(dataInputStream); assertEquals(o, value); } finally { MemoryAllocatorImpl.freeOffHeapMemory(); } }
/** * create a new EntryEvent to be used in notifying listeners, cache servers, etc. Caller must * release result if it is != to sourceEvent */ @Retained EntryEventImpl createListenerEvent(EntryEventImpl sourceEvent, PartitionedRegion r, InternalDistributedMember member) { final EntryEventImpl e2; if (this.notificationOnly && this.bridgeContext == null) { e2 = sourceEvent; } else { e2 = new EntryEventImpl(sourceEvent); if (this.bridgeContext != null) { e2.setContext(this.bridgeContext); } } e2.setRegion(r); e2.setOriginRemote(true); e2.setInvokePRCallbacks(!notificationOnly); if (this.filterInfo != null) { e2.setLocalFilterInfo(this.filterInfo.getFilterInfo(member)); } if (this.versionTag != null) { this.versionTag.replaceNullIDs(getSender()); e2.setVersionTag(this.versionTag); } return e2; }
EntryEventImpl clonedEvent = new EntryEventImpl(event, false); boolean freeClonedEvent = true; try {
@Test public void applyingGatewayEventsFromDifferentDSShouldAcceptBiggerTimestamp() { // create 2 gateway events: // tag1 with smaller distributed system ids (DSIDs) and bigger timestamp // tag2 with bigger DSID and smaller timestamp // set tag2 into stamp. Apply event with tag1 should pass // i.e. We compare timestamp first, then DSID GemFireCacheImpl cache = mock(GemFireCacheImpl.class); LocalRegion lr = mock(LocalRegion.class); String value = "value"; AbstractRegionEntry re = new TestableRegionEntry(lr, value); InternalDistributedMember member1 = mock(InternalDistributedMember.class); EntryEventImpl entryEvent1 = new EntryEventImpl(); entryEvent1.setRegion(lr); when(lr.getCache()).thenReturn(cache); when(cache.getGatewayConflictResolver()).thenReturn(null); VersionTag tag1 = VersionTag.create(member1); tag1.setVersionTimeStamp(2); tag1.setDistributedSystemId(1); tag1.setIsGatewayTag(true); VersionTag tag2 = VersionTag.create(member1); tag2.setVersionTimeStamp(1); tag2.setDistributedSystemId(2); tag2.setIsGatewayTag(true); ((TestableRegionEntry) re).setVersions(tag2); assertEquals(2, ((TestableRegionEntry) re).getDistributedSystemId()); // apply tag1 with bigger timestamp should pass entryEvent1.setVersionTag(tag1); re.processVersionTag(entryEvent1); }
InternalDistributedMember member1 = mock(InternalDistributedMember.class); EntryEventImpl entryEvent1 = new EntryEventImpl(); entryEvent1.setRegion(lr); when(lr.getCache()).thenReturn(cache);
@Test public void applyingGatewayEventsFromSmallerDSWithSameTimestampShouldThrowCMEIfNoResolver() { // create 2 gateway events with different distributed system ids (DSIDs), with same timestamp // set the one with bigger DSID into stamp. // Apply the one with smaller DSID show throw CME GemFireCacheImpl cache = mock(GemFireCacheImpl.class); LocalRegion lr = mock(LocalRegion.class); String value = "value"; AbstractRegionEntry re = new TestableRegionEntry(lr, value); InternalDistributedMember member1 = mock(InternalDistributedMember.class); EntryEventImpl entryEvent1 = new EntryEventImpl(); entryEvent1.setRegion(lr); when(lr.getCache()).thenReturn(cache); when(cache.getGatewayConflictResolver()).thenReturn(null); VersionTag tag1 = VersionTag.create(member1); tag1.setVersionTimeStamp(1); tag1.setDistributedSystemId(1); tag1.setIsGatewayTag(true); VersionTag tag2 = VersionTag.create(member1); tag2.setVersionTimeStamp(1); tag2.setDistributedSystemId(2); tag2.setIsGatewayTag(true); ((TestableRegionEntry) re).setVersions(tag2); assertEquals(2, ((TestableRegionEntry) re).getDistributedSystemId()); // apply tag1 with smaller timestamp should throw CME entryEvent1.setVersionTag(tag1); expectedException.expect(ConcurrentCacheModificationException.class); expectedException.expectMessage("conflicting WAN event detected"); re.processVersionTag(entryEvent1); }
@Test public void stampWithoutDSIDShouldAcceptAnyTag() { GemFireCacheImpl cache = mock(GemFireCacheImpl.class); LocalRegion lr = mock(LocalRegion.class); String value = "value"; AbstractRegionEntry re = new TestableRegionEntry(lr, value); InternalDistributedMember member1 = mock(InternalDistributedMember.class); EntryEventImpl entryEvent1 = new EntryEventImpl(); entryEvent1.setRegion(lr); when(lr.getCache()).thenReturn(cache); when(cache.getGatewayConflictResolver()).thenReturn(null); VersionTag tag1 = VersionTag.create(member1); tag1.setVersionTimeStamp(1); tag1.setDistributedSystemId(-1); tag1.setIsGatewayTag(true); VersionTag tag2 = VersionTag.create(member1); tag2.setVersionTimeStamp(2); tag2.setDistributedSystemId(2); tag2.setIsGatewayTag(true); ((TestableRegionEntry) re).setVersions(tag1); assertEquals(tag1.getVersionTimeStamp(), re.getVersionStamp().asVersionTag().getVersionTimeStamp()); assertEquals(-1, ((TestableRegionEntry) re).getDistributedSystemId()); // apply tag2 should be accepted entryEvent1.setVersionTag(tag2); re.processVersionTag(entryEvent1); }
e2 = sourceEvent; } else { e2 = new EntryEventImpl(sourceEvent); if (this.bridgeContext != null) { e2.setContext(this.bridgeContext);
@Test public void gatewayEventsFromSameDSInCorrectOrderOfTimestampShouldPass() { // create 2 gateway events with the same dsid, but different timestamp // apply them in correct order, it should pass GemFireCacheImpl cache = mock(GemFireCacheImpl.class); LocalRegion lr = mock(LocalRegion.class); String value = "value"; AbstractRegionEntry re = new TestableRegionEntry(lr, value); InternalDistributedMember member1 = mock(InternalDistributedMember.class); EntryEventImpl entryEvent1 = new EntryEventImpl(); entryEvent1.setRegion(lr); when(lr.getCache()).thenReturn(cache); when(cache.getGatewayConflictResolver()).thenReturn(null); VersionTag tag1 = VersionTag.create(member1); tag1.setVersionTimeStamp(1); tag1.setDistributedSystemId(3); tag1.setIsGatewayTag(true); VersionTag tag2 = VersionTag.create(member1); tag2.setVersionTimeStamp(2); tag2.setDistributedSystemId(3); tag2.setIsGatewayTag(true); ((TestableRegionEntry) re).setVersions(tag1); assertEquals(tag1.getVersionTimeStamp(), re.getVersionStamp().asVersionTag().getVersionTimeStamp()); assertEquals(3, ((TestableRegionEntry) re).getDistributedSystemId()); // apply tag2 should be accepted entryEvent1.setVersionTag(tag2); re.processVersionTag(entryEvent1); }