/** * @return if there's no valid version tag for this event */ public boolean hasValidVersionTag() { return this.versionTag != null && this.versionTag.hasValidVersion(); }
@Override public boolean hasValidVersion() { return this.versionTag != null && this.versionTag.hasValidVersion(); }
private RemoveAllEntryData[] selectVersionedEntries() { int resultSize = 0; for (int i = 0; i < this.removeAllData.length; i++) { RemoveAllEntryData p = this.removeAllData[i]; if (p == null || p.isInhibitDistribution()) { continue; // skip blanks } else if (p.versionTag != null && p.versionTag.hasValidVersion()) { resultSize++; } } RemoveAllEntryData[] result = new RemoveAllEntryData[resultSize]; int ri = 0; for (int i = 0; i < this.removeAllData.length; i++) { RemoveAllEntryData p = this.removeAllData[i]; if (p == null || p.isInhibitDistribution()) { continue; // skip blanks } else if (p.versionTag != null && p.versionTag.hasValidVersion()) { result[ri++] = p; } } return result; }
private PutAllEntryData[] selectVersionedEntries() { int resultSize = 0; for (int i = 0; i < this.putAllData.length; i++) { PutAllEntryData p = this.putAllData[i]; if (p == null || p.isInhibitDistribution()) { continue; // skip blanks } else if (p.versionTag != null && p.versionTag.hasValidVersion()) { resultSize++; } } PutAllEntryData[] result = new PutAllEntryData[resultSize]; int ri = 0; for (int i = 0; i < this.putAllData.length; i++) { PutAllEntryData p = this.putAllData[i]; if (p == null || p.isInhibitDistribution()) { continue; // skip blanks } else if (p.versionTag != null && p.versionTag.hasValidVersion()) { result[ri++] = p; } } return result; }
private RemoveAllEntryData[] selectVersionlessEntries() { int resultSize = this.removeAllData.length; for (int i = 0; i < this.removeAllData.length; i++) { RemoveAllEntryData p = this.removeAllData[i]; if (p == null || p.isInhibitDistribution()) { resultSize--; } else if (p.versionTag != null && p.versionTag.hasValidVersion()) { resultSize--; } } RemoveAllEntryData[] result = new RemoveAllEntryData[resultSize]; int ri = 0; for (int i = 0; i < this.removeAllData.length; i++) { RemoveAllEntryData p = this.removeAllData[i]; if (p == null || p.isInhibitDistribution()) { continue; // skip blanks } else if (p.versionTag != null && p.versionTag.hasValidVersion()) { continue; // skip versioned } // what remains is versionless result[ri++] = p; } return result; }
private PutAllEntryData[] selectVersionlessEntries() { int resultSize = this.putAllData.length; for (int i = 0; i < this.putAllData.length; i++) { PutAllEntryData p = this.putAllData[i]; if (p == null || p.isInhibitDistribution()) { resultSize--; } else if (p.versionTag != null && p.versionTag.hasValidVersion()) { resultSize--; } } PutAllEntryData[] result = new PutAllEntryData[resultSize]; int ri = 0; for (int i = 0; i < this.putAllData.length; i++) { PutAllEntryData p = this.putAllData[i]; if (p == null || p.isInhibitDistribution()) { continue; // skip blanks } else if (p.versionTag != null && p.versionTag.hasValidVersion()) { continue; // skip versioned } // what remains is versionless result[ri++] = p; } return result; }
private void givenEventWithVersionTag() { when(owner.getVersionVector()).thenReturn(mock(RegionVersionVector.class)); @SuppressWarnings("rawtypes") VersionTag versionTag = mock(VersionTag.class); when(versionTag.hasValidVersion()).thenReturn(true); when(event.getVersionTag()).thenReturn(versionTag); }
if (logger.isTraceEnabled(LogMarker.TOMBSTONE_VERBOSE)) { VersionTag stampTag = stamp.asVersionTag(); if (stampTag.hasValidVersion() && checkForConflict) {
@Test public void destroyWithEmptyRegionWithConcurrencyChecksAddsATombstone() { final TestableAbstractRegionMap arm = new TestableAbstractRegionMap(true); RegionVersionVector versionVector = mock(RegionVersionVector.class); when(arm._getOwner().getVersionVector()).thenReturn(versionVector); final EntryEventImpl event = createEventForDestroy(arm._getOwner()); VersionTag versionTag = mock(VersionTag.class); when(versionTag.hasValidVersion()).thenReturn(true); event.setVersionTag(versionTag); event.setOriginRemote(true); final Object expectedOldValue = null; final boolean inTokenMode = false; final boolean duringRI = false; assertThat(arm.destroy(event, inTokenMode, duringRI, false, false, expectedOldValue, false)) .isTrue(); assertThat(arm.getEntryMap().containsKey(event.getKey())).isTrue(); RegionEntry re = (RegionEntry) arm.getEntryMap().get(event.getKey()); assertThat(re.getValueAsToken()).isEqualTo(Token.TOMBSTONE); boolean invokeCallbacks = true; verify(arm._getOwner(), times(1)).basicDestroyPart2(any(), eq(event), eq(inTokenMode), eq(false), eq(duringRI), eq(invokeCallbacks)); verify(arm._getOwner(), times(1)).basicDestroyPart3(any(), eq(event), eq(inTokenMode), eq(duringRI), eq(invokeCallbacks), eq(expectedOldValue)); }
@Test public void destroyOfExistingTombstoneWithConcurrencyChecksAndRemoveRecoveredEntryDoesRemove() { final TestableAbstractRegionMap arm = new TestableAbstractRegionMap(true); RegionVersionVector<?> versionVector = mock(RegionVersionVector.class); when(arm._getOwner().getVersionVector()).thenReturn(versionVector); final EntryEventImpl event = createEventForDestroy(arm._getOwner()); VersionTag<?> versionTag = mock(VersionTag.class); when(versionTag.hasValidVersion()).thenReturn(true); event.setVersionTag(versionTag); addEntry(arm, Token.TOMBSTONE); final Object expectedOldValue = null; final boolean inTokenMode = false; final boolean duringRI = false; final boolean removeRecoveredEntry = true; assertThat(arm.destroy(event, inTokenMode, duringRI, false, false, expectedOldValue, removeRecoveredEntry)).isTrue(); assertThat(arm.getEntryMap().containsKey(event.getKey())).isFalse(); boolean invokeCallbacks = true; verify(arm._getOwner(), times(1)).basicDestroyPart2(any(), eq(event), eq(inTokenMode), eq(false), eq(duringRI), eq(invokeCallbacks)); verify(arm._getOwner(), times(1)).basicDestroyPart3(any(), eq(event), eq(inTokenMode), eq(duringRI), eq(invokeCallbacks), eq(expectedOldValue)); }
@Test public void destroyOfExistingTombstoneWithConcurrencyChecksThrowsEntryNotFound() { final TestableAbstractRegionMap arm = new TestableAbstractRegionMap(true); RegionVersionVector<?> versionVector = mock(RegionVersionVector.class); when(arm._getOwner().getVersionVector()).thenReturn(versionVector); final EntryEventImpl event = createEventForDestroy(arm._getOwner()); VersionTag<?> versionTag = mock(VersionTag.class); when(versionTag.hasValidVersion()).thenReturn(true); event.setVersionTag(versionTag); addEntry(arm, Token.TOMBSTONE); final Object expectedOldValue = null; final boolean inTokenMode = false; final boolean duringRI = false; assertThatThrownBy( () -> arm.destroy(event, inTokenMode, duringRI, false, false, expectedOldValue, false)) .isInstanceOf(EntryNotFoundException.class); }
@Test public void destroyOfExistingEntryWithConcurrencyChecksAddsTombstone() { final TestableAbstractRegionMap arm = new TestableAbstractRegionMap(true); RegionVersionVector versionVector = mock(RegionVersionVector.class); when(arm._getOwner().getVersionVector()).thenReturn(versionVector); addEntry(arm); final EntryEventImpl event = createEventForDestroy(arm._getOwner()); VersionTag versionTag = mock(VersionTag.class); when(versionTag.hasValidVersion()).thenReturn(true); event.setVersionTag(versionTag); final Object expectedOldValue = null; final boolean inTokenMode = false; final boolean duringRI = false; assertThat(arm.destroy(event, inTokenMode, duringRI, false, false, expectedOldValue, false)) .isTrue(); assertThat(arm.getEntryMap().containsKey(event.getKey())).isTrue(); RegionEntry re = (RegionEntry) arm.getEntryMap().get(event.getKey()); assertThat(re.getValueAsToken()).isEqualTo(Token.TOMBSTONE); boolean invokeCallbacks = true; verify(arm._getOwner(), times(1)).basicDestroyPart2(any(), eq(event), eq(inTokenMode), eq(false), eq(duringRI), eq(invokeCallbacks)); verify(arm._getOwner(), times(1)).basicDestroyPart3(any(), eq(event), eq(inTokenMode), eq(duringRI), eq(invokeCallbacks), eq(expectedOldValue)); }
@Test public void destroyOfExistingTombstoneInTokenModeWithConcurrencyChecksDoesNothing() { final TestableAbstractRegionMap arm = new TestableAbstractRegionMap(true); RegionVersionVector<?> versionVector = mock(RegionVersionVector.class); when(arm._getOwner().getVersionVector()).thenReturn(versionVector); final EntryEventImpl event = createEventForDestroy(arm._getOwner()); VersionTag<?> versionTag = mock(VersionTag.class); when(versionTag.hasValidVersion()).thenReturn(true); event.setVersionTag(versionTag); addEntry(arm, Token.TOMBSTONE); final Object expectedOldValue = null; final boolean inTokenMode = true; final boolean duringRI = false; assertThat(arm.destroy(event, inTokenMode, duringRI, false, false, expectedOldValue, false)) .isTrue(); assertThat(arm.getEntryMap().containsKey(event.getKey())).isTrue(); RegionEntry re = (RegionEntry) arm.getEntryMap().get(event.getKey()); // why not DESTROY token? assertThat(re.getValueAsToken()).isEqualTo(Token.TOMBSTONE); // since it was already destroyed why do we do the parts? boolean invokeCallbacks = true; verify(arm._getOwner(), times(1)).basicDestroyPart2(any(), eq(event), eq(inTokenMode), eq(false), eq(duringRI), eq(invokeCallbacks)); verify(arm._getOwner(), times(1)).basicDestroyPart3(any(), eq(event), eq(inTokenMode), eq(duringRI), eq(invokeCallbacks), eq(expectedOldValue)); }
@Test public void evictDestroyOfExistingEntryWithConcurrencyChecksAddsTombstone() { final TestableVMLRURegionMap arm = new TestableVMLRURegionMap(true); RegionVersionVector<?> versionVector = mock(RegionVersionVector.class); when(arm._getOwner().getVersionVector()).thenReturn(versionVector); addEntry(arm); final EntryEventImpl event = createEventForDestroy(arm._getOwner()); VersionTag<?> versionTag = mock(VersionTag.class); when(versionTag.hasValidVersion()).thenReturn(true); event.setVersionTag(versionTag); final Object expectedOldValue = null; final boolean inTokenMode = false; final boolean duringRI = false; final boolean evict = true; assertThat(arm.destroy(event, inTokenMode, duringRI, false, evict, expectedOldValue, false)) .isTrue(); assertThat(arm.getEntryMap().containsKey(event.getKey())).isTrue(); RegionEntry re = (RegionEntry) arm.getEntryMap().get(event.getKey()); assertThat(re.getValueAsToken()).isEqualTo(Token.TOMBSTONE); boolean invokeCallbacks = true; verify(arm._getOwner(), times(1)).basicDestroyPart2(any(), eq(event), eq(inTokenMode), eq(false), eq(duringRI), eq(invokeCallbacks)); verify(arm._getOwner(), times(1)).basicDestroyPart3(any(), eq(event), eq(inTokenMode), eq(duringRI), eq(invokeCallbacks), eq(expectedOldValue)); }
@Test public void destroyOfExistingRemovePhase2WithConcurrencyChecksAndRemoveRecoveredEntryDoesRetryAndThrowsEntryNotFound() { final TestableAbstractRegionMap arm = new TestableAbstractRegionMap(true); RegionVersionVector<?> versionVector = mock(RegionVersionVector.class); when(arm._getOwner().getVersionVector()).thenReturn(versionVector); final EntryEventImpl event = createEventForDestroy(arm._getOwner()); VersionTag<?> versionTag = mock(VersionTag.class); when(versionTag.hasValidVersion()).thenReturn(true); event.setVersionTag(versionTag); addEntry(arm, Token.REMOVED_PHASE2); final Object expectedOldValue = null; final boolean inTokenMode = false; final boolean duringRI = false; final boolean removeRecoveredEntry = true; assertThatThrownBy(() -> arm.destroy(event, inTokenMode, duringRI, false, false, expectedOldValue, removeRecoveredEntry)).isInstanceOf(EntryNotFoundException.class); }
@Test public void testConcurrencyTrueTagInvalid() { // case 3: concurrencyCheckEanbled = true, version tag is invalid: not to distribute DistributedRegion region = prepare(true, false); EntryEventImpl event = createDummyEvent(region); VersionTag tag = createVersionTag(false); event.setVersionTag(tag); assertFalse(tag.hasValidVersion()); doTest(region, event, 0); }
@Test public void testConcurrencyTrueTagValid() { // case 4: concurrencyCheckEanbled = true, version tag is valid: distribute DistributedRegion region = prepare(true, false); EntryEventImpl event = createDummyEvent(region); VersionTag tag = createVersionTag(true); event.setVersionTag(tag); assertTrue(tag.hasValidVersion()); doTest(region, event, 1); } }
protected void initMessage(CacheOperationMessage msg, DirectReplyProcessor p) { msg.regionPath = getRegion().getFullPath(); msg.processorId = p == null ? 0 : p.getProcessorId(); msg.processor = p; if (this.event.getOperation().isEntry()) { EntryEventImpl entryEvent = getEvent(); msg.callbackArg = entryEvent.getRawCallbackArgument(); msg.possibleDuplicate = entryEvent.isPossibleDuplicate(); VersionTag tag = entryEvent.getVersionTag(); msg.setInhibitNotificationsBit(entryEvent.inhibitAllNotifications()); if (tag != null && tag.hasValidVersion()) { msg.setVersionTag(tag); } } else { msg.callbackArg = ((RegionEventImpl) this.event).getRawCallbackArgument(); } msg.op = this.event.getOperation(); msg.owner = this; msg.regionAllowsConflation = getRegion().getEnableAsyncConflation(); }
if (event.getVersionTag() != null && event.getVersionTag().hasValidVersion()) { this.versionTimeStamp = event.getVersionTag().getVersionTimeStamp();
if (v == null || !v.hasValidVersion()) { removeEntry = v == null || !v.hasValidVersion(); } else { removeEntry = true;