/** * returns a map of keys->versiontags for the test region */ private static Map<String, VersionTag<VersionSource<?>>> getCCRegionVersions() { Map<String, VersionTag<VersionSource<?>>> result = new HashMap<>(); @SuppressWarnings("unchecked") Map<String, Object> regionAsMap = (Map<String, Object>) CCRegion; for (String key : regionAsMap.keySet()) { result.put(key, CCRegion.getRegionEntry(key).getVersionStamp().asVersionTag()); } return result; }
protected HashMap<String, VersionTag> saveVersionTags(LocalRegion region) { HashMap<String, VersionTag> tagmap = new HashMap<String, VersionTag>(); Iterator entryItr = region.entrySet().iterator(); while (entryItr.hasNext()) { RegionEntry entry = ((NonTXEntry) entryItr.next()).getRegionEntry(); String key = (String) entry.getKey(); VersionTag tag = entry.getVersionStamp().asVersionTag(); tagmap.put(key, tag); } return tagmap; }
private void copyRecoveredEntry(RegionEntry oldRe, RegionEntry newRe) { if (newRe.getVersionStamp() != null) { newRe.getVersionStamp().setMemberID(oldRe.getVersionStamp().getMemberID()); newRe.getVersionStamp().setVersions(oldRe.getVersionStamp().asVersionTag()); } if (newRe instanceof AbstractOplogDiskRegionEntry) { ((AbstractOplogDiskRegionEntry) newRe).setDiskId(oldRe); _getOwner().getDiskRegion().replaceIncompatibleEntry((DiskEntry) oldRe, (DiskEntry) newRe); } getEntryMap().put(newRe.getKey(), newRe); }
private void givenExistingEntryWithNoVersionStamp() { when(existingRegionEntry.getVersionStamp()).thenReturn(null); }
@Override public void run() { assertThat(CCRegion.get(loadKey)).isEqualTo("loadedValue"); assertThat((CCRegion.getRegionEntry(loadKey)).getVersionStamp().getEntryVersion()) .isEqualTo( (long) 3); } });
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); }
private void givenExistingEntry(boolean miss) { if (miss) { when(regionMap.getEntry(event)).thenReturn(null).thenReturn(existingRegionEntry); } else { when(regionMap.getEntry(event)).thenReturn(existingRegionEntry); } when(regionMap.putEntryIfAbsent(KEY, newRegionEntry)).thenReturn(existingRegionEntry); if (withConcurrencyChecks) { when(existingRegionEntry.getVersionStamp()).thenReturn(mock(VersionStamp.class)); } }
private void givenExistingEntryWithValue(Object value) throws RegionClearedException { if (value == Token.TOMBSTONE) { givenExistingTombstone(); } else { when(existingRegionEntry.getValue()).thenReturn(value); } when(regionMap.getEntry(event)).thenReturn(value == null ? null : existingRegionEntry); when(regionMap.putEntryIfAbsent(eq(KEY), any())).thenReturn(existingRegionEntry); if (withConcurrencyChecks) { when(existingRegionEntry.getVersionStamp()).thenReturn(mock(VersionStamp.class)); } }
@Before public void setup() { initMocks(this); VersionStamp versionStamp = mock(VersionStamp.class); when(versionStamp.asVersionTag()).thenReturn(existingVersionTag); when(existingRegionEntry.getVersionStamp()).thenReturn(versionStamp); when(existingRegionEntry.getKey()).thenReturn(key); when(factoryRegionEntry.getKey()).thenReturn(key); when(oldRegionEntry.getKey()).thenReturn(key); when(keyInfo.getKey()).thenReturn(key); when(txId.getMemberId()).thenReturn(myId); }
/** * Test hook - returns the version stamp for an entry in the form of a version tag * * @return the entry version information */ public VersionTag getVersionTag(Object key) { Region.Entry entry = getEntry(key, true); VersionTag tag = null; if (entry != null && entry instanceof EntrySnapshot) { tag = ((EntrySnapshot) entry).getVersionTag(); } else if (entry != null && entry instanceof NonTXEntry) { tag = ((NonTXEntry) entry).getRegionEntry().getVersionStamp().asVersionTag(); } return tag; }
private void scheduleTombstone(RegionEntry entry, VersionTag destroyedVersion, boolean reschedule) { if (destroyedVersion == null) { throw new NullPointerException("destroyed version tag cannot be null"); } if (!reschedule) { incTombstoneCount(1); } if (logger.isTraceEnabled(LogMarker.TOMBSTONE_COUNT_VERBOSE)) { logger.trace(LogMarker.TOMBSTONE_COUNT_VERBOSE, "{} tombstone for {} version={} count is {} entryMap size is {}", reschedule ? "rescheduling" : "scheduling", entry.getKey(), entry.getVersionStamp().asVersionTag(), this.tombstoneCount.get(), this.entries.size()/* , new Exception("stack trace") */); } getGemFireCache().getTombstoneService().scheduleTombstone(this, entry, destroyedVersion); }
@Test public void updateRecoveredEntry_givenExistingNonTombstoneAndSettingToTombstone_callsUpdateSizeOnRemove() { RecoveredEntry recoveredEntry = mock(RecoveredEntry.class); RegionEntry regionEntry = mock(RegionEntry.class); when(regionEntry.isTombstone()).thenReturn(false).thenReturn(true); when(regionEntry.getVersionStamp()).thenReturn(mock(VersionStamp.class)); TestableAbstractRegionMap arm = new TestableAbstractRegionMap(false, null, null, regionEntry); arm.updateRecoveredEntry(KEY, recoveredEntry); verify(arm._getOwner(), times(1)).updateSizeOnRemove(eq(KEY), anyInt()); }
@Test public void txApplyDestroy_givenExistingNonTombstone_callsUpdateSizeOnRemove() { RegionEntry regionEntry = mock(RegionEntry.class); when(regionEntry.isTombstone()).thenReturn(false); when(regionEntry.getVersionStamp()).thenReturn(mock(VersionStamp.class)); TXId txId = mock(TXId.class); when(txId.getMemberId()).thenReturn(mock(InternalDistributedMember.class)); TestableAbstractRegionMap arm = new TestableAbstractRegionMap(false, null, null, regionEntry); arm.txApplyDestroy(KEY, txId, null, false, false, null, null, null, new ArrayList<>(), null, null, false, null, null, 0); verify(arm._getOwner(), times(1)).updateSizeOnRemove(eq(KEY), anyInt()); }
@Test public void txApplyDestroy_givenExistingDestroyedOrRemovedEntry_neverCallsUpdateSizeOnRemove() { RegionEntry regionEntry = mock(RegionEntry.class); when(regionEntry.isTombstone()).thenReturn(false); when(regionEntry.isDestroyedOrRemoved()).thenReturn(true); when(regionEntry.getVersionStamp()).thenReturn(mock(VersionStamp.class)); TXId txId = mock(TXId.class); when(txId.getMemberId()).thenReturn(mock(InternalDistributedMember.class)); TestableAbstractRegionMap arm = new TestableAbstractRegionMap(false, null, null, regionEntry); arm.txApplyDestroy(KEY, txId, null, false, false, null, null, null, new ArrayList<>(), null, null, false, null, null, 0); verify(arm._getOwner(), never()).updateSizeOnRemove(any(), anyInt()); }
@Test public void updateRecoveredEntry_givenExistingDestroyedOrRemovedAndSettingToTombstone_neverCallsUpdateSizeOnRemove() { RecoveredEntry recoveredEntry = mock(RecoveredEntry.class); RegionEntry regionEntry = mock(RegionEntry.class); when(regionEntry.isTombstone()).thenReturn(false).thenReturn(true); when(regionEntry.isDestroyedOrRemoved()).thenReturn(true); when(regionEntry.getVersionStamp()).thenReturn(mock(VersionStamp.class)); TestableAbstractRegionMap arm = new TestableAbstractRegionMap(false, null, null, regionEntry); arm.updateRecoveredEntry(KEY, recoveredEntry); verify(arm._getOwner(), never()).updateSizeOnRemove(any(), anyInt()); }
@Test public void txApplyDestroy_givenPutIfAbsentReturningNonTombstone_callsUpdateSizeOnRemove() throws RegionClearedException { ConcurrentMapWithReusableEntries map = mock(ConcurrentMapWithReusableEntries.class); RegionEntry entry = mock(RegionEntry.class); when(entry.getKey()).thenReturn(KEY); when(entry.isTombstone()).thenReturn(false); VersionStamp versionStamp = mock(VersionStamp.class); when(entry.getVersionStamp()).thenReturn(versionStamp); when(versionStamp.asVersionTag()).thenReturn(mock(VersionTag.class)); when(map.putIfAbsent(eq(KEY), any())).thenReturn(entry).thenReturn(null); TXId txId = mock(TXId.class); when(txId.getMemberId()).thenReturn(mock(InternalDistributedMember.class)); TestableAbstractRegionMap arm = new TestableAbstractRegionMap(false, map, null); when(arm._getOwner().getConcurrencyChecksEnabled()).thenReturn(true); arm.txApplyDestroy(KEY, txId, null, false, false, null, null, null, new ArrayList<>(), null, null, false, null, null, 0); verify(arm._getOwner(), times(1)).updateSizeOnRemove(eq(KEY), anyInt()); }
@Test public void putReturnsNull_ifReplaceOnClientAndTombstoneAndVersionTag() throws RegionClearedException { ifOld = true; givenReplaceOnClient(); givenExistingRegionEntry(); when(existingRegionEntry.isTombstone()).thenReturn(true); when(existingRegionEntry.getVersionStamp()).thenReturn(mock(VersionStamp.class)); when(event.getVersionTag()).thenReturn(mock(VersionTag.class)); RegionEntry result = doPut(); assertThat(result).isNull(); verify(existingRegionEntry, times(1)).setValue(internalRegion, Token.TOMBSTONE); verify(internalRegion, times(1)).rescheduleTombstone(same(existingRegionEntry), any()); }
/** local regions do not perform versioning */ protected boolean shouldGenerateVersionTag(RegionEntry entry, EntryEventImpl event) { if (this.getDataPolicy().withPersistence()) { return true; } else { return this.getConcurrencyChecksEnabled() && (entry.getVersionStamp().hasValidVersion() || this.getDataPolicy().withReplication()); } }
@Test public void putIgnoresRegionClearedException_ifReplaceOnClientAndTombstoneAndVersionTag() throws RegionClearedException { ifOld = true; givenReplaceOnClient(); givenExistingRegionEntry(); when(existingRegionEntry.isTombstone()).thenReturn(true); when(existingRegionEntry.getVersionStamp()).thenReturn(mock(VersionStamp.class)); when(event.getVersionTag()).thenReturn(mock(VersionTag.class)); doThrow(RegionClearedException.class).when(existingRegionEntry).setValue(internalRegion, Token.TOMBSTONE); RegionEntry result = doPut(); assertThat(result).isNull(); verify(existingRegionEntry, times(1)).setValue(internalRegion, Token.TOMBSTONE); verify(internalRegion, times(1)).rescheduleTombstone(same(existingRegionEntry), any()); }
@Override public void handleRegionEntry(RegionEntry regionEntry) { DiskEntry de = (DiskEntry) regionEntry; synchronized (de) { DiskId id = de.getDiskId(); if (id != null && regionEntry.isTombstone()) { VersionStamp stamp = regionEntry.getVersionStamp(); if (getRegionVersionVector().isTombstoneTooOld(stamp.getMemberID(), stamp.getRegionVersion())) { drs.destroyRecoveredEntry(de.getKey()); } } } } });