private void processVersionTagForGII(RegionEntry re, LocalRegion owner, VersionTag entryVersion, boolean isTombstone, InternalDistributedMember sender, boolean checkConflicts) { re.getVersionStamp().processVersionTag(_getOwner(), entryVersion, isTombstone, false, owner.getMyId(), sender, checkConflicts); }
@Test public void initialImagePut_givenPutIfAbsentReturnsNullAndProcessVersionTagThrowsConcurrentCacheModificationException_createdEntryRemovedFromMapAndNotInitialImageInit() throws RegionClearedException { ConcurrentMapWithReusableEntries map = mock(ConcurrentMapWithReusableEntries.class); when(map.putIfAbsent(eq(KEY), any())).thenReturn(null); RegionEntryFactory factory = mock(RegionEntryFactory.class); VersionStamp mockVersionStamp = mock(VersionStamp.class); doThrow(new ConcurrentCacheModificationException()).when(mockVersionStamp) .processVersionTag(any(), any(), anyBoolean(), anyBoolean(), any(), any(), anyBoolean()); RegionEntry createdEntry = mock(RegionEntry.class); when(createdEntry.getVersionStamp()).thenReturn(mockVersionStamp); when(factory.createEntry(any(), any(), any())).thenReturn(createdEntry); final TestableAbstractRegionMap arm = new TestableAbstractRegionMap(false, map, factory); when(arm._getOwner().getConcurrencyChecksEnabled()).thenReturn(true); when(arm._getOwner().getServerProxy()).thenReturn(mock(ServerRegionProxy.class)); VersionTag versionTag = mock(VersionTag.class); when(versionTag.getMemberID()).thenReturn(mock(VersionSource.class)); arm.initialImagePut(KEY, 0, Token.TOMBSTONE, false, false, versionTag, null, false); verify(map, times(1)).remove(eq(KEY), eq(createdEntry)); verify(createdEntry, never()).initialImageInit(any(), anyLong(), any(), anyBoolean(), anyBoolean(), anyBoolean()); }
@Test public void initialImagePut_givenPutIfAbsentReturningRegionEntryAndProcessVersionTagThrowsConcurrentCacheModificationException_createdEntryRemovedFromMapAndNotInitialImageInit() throws RegionClearedException { ConcurrentMapWithReusableEntries map = mock(ConcurrentMapWithReusableEntries.class); RegionEntry entry = mock(RegionEntry.class); when(entry.isTombstone()).thenReturn(false); when(entry.isDestroyedOrRemoved()).thenReturn(false); when(entry.initialImagePut(any(), anyLong(), any(), anyBoolean(), anyBoolean())) .thenReturn(true); VersionStamp versionStamp = mock(VersionStamp.class); when(entry.getVersionStamp()).thenReturn(versionStamp); when(versionStamp.asVersionTag()).thenReturn(mock(VersionTag.class)); doThrow(new ConcurrentCacheModificationException()).when(versionStamp).processVersionTag(any(), any(), anyBoolean(), anyBoolean(), any(), any(), anyBoolean()); RegionEntry createdEntry = mock(RegionEntry.class); when(createdEntry.getVersionStamp()).thenReturn(versionStamp); RegionEntryFactory factory = mock(RegionEntryFactory.class); when(factory.createEntry(any(), any(), any())).thenReturn(createdEntry); TestableAbstractRegionMap arm = new TestableAbstractRegionMap(false, map, factory); when(map.putIfAbsent(eq(KEY), any())).thenReturn(entry); when(arm._getOwner().getConcurrencyChecksEnabled()).thenReturn(true); when(arm._getOwner().getServerProxy()).thenReturn(mock(ServerRegionProxy.class)); VersionTag versionTag = mock(VersionTag.class); when(versionTag.getMemberID()).thenReturn(mock(VersionSource.class)); arm.initialImagePut(KEY, 0, Token.TOMBSTONE, false, false, versionTag, null, false); verify(map, times(1)).remove(eq(KEY), eq(createdEntry)); verify(entry, never()).initialImagePut(any(), anyLong(), any(), anyBoolean(), anyBoolean()); }
/** * Process an incoming version tag for concurrent operation detection. This must be done before * modifying the region entry. * * @param regionEntry the entry that is to be modified * @param event the modification to the entry * @throws InvalidDeltaException if the event contains a delta that cannot be applied * @throws ConcurrentCacheModificationException if the event is in conflict with a previously * applied change */ @Override public void processVersionTag(RegionEntry regionEntry, EntryEventImpl event) { if (regionEntry.getVersionStamp() != null) { regionEntry.getVersionStamp().processVersionTag(event); // during initialization we record version tag info to detect ops the // image provider hasn't seen VersionTag<?> tag = event.getVersionTag(); if (tag != null && !event.getRegion().isInitialized()) { ImageState is = event.getRegion().getImageState(); if (is != null && !event.getRegion().isUsedForPartitionedRegionBucket()) { if (logger.isTraceEnabled()) { logger.trace("recording version tag in image state: {}", tag); } is.addVersionTag(event.getKey(), tag); } } } }
stamp.processVersionTag(event);