@Override public void recordVersion(DiskStoreID member, long version) { // TODO - RVV - This is a temporary check to make sure we get // an exception if we try to add a non disk store id to this vector super.recordVersion(member, version); }
/** * return the next local version number */ private long getNextVersion(boolean checkLocked) { if (checkLocked && this.locked) { // this should never be the case. If version generation is locked and we get here // then the path to this point is not protected by getting the version generation // lock from the RVV but it should be if (logger.isDebugEnabled()) { logger.debug("Generating a version tag when version generation is locked by {}", this.lockOwner); } } long new_version = localVersion.incrementAndGet(); // since there could be special exception, we have to use recordVersion() recordVersion(getOwnerId(), new_version); return new_version; }
recordVersion(mbr, regionVersion); if (mbr == null || mbr.equals(this.myId)) { boolean succeeded;
public void recordRecoveredVersionTag(VersionTag tag) { this.versionVector.recordVersion(tag.getMemberID(), tag.getRegionVersion()); }
private static boolean checkIfToUpdateAfterCreateFailed(LocalRegion rgn, EntryEventImpl ev) { // Try to create is failed due to found the entry exist, double check if should update boolean doUpdate = true; if (ev.oldValueIsDestroyedToken()) { if (rgn.getVersionVector() != null && ev.getVersionTag() != null) { rgn.getVersionVector().recordVersion( (InternalDistributedMember) ev.getDistributedMember(), ev.getVersionTag()); } doUpdate = false; } if (ev.isConcurrencyConflict()) { if (logger.isDebugEnabled()) { logger.debug("basicUpdate failed with CME, not to retry:" + ev); } doUpdate = false; } return doUpdate; }
@Override public void recordRecoveredVersionTag(VersionTag tag) { if (this.getConcurrencyChecksEnabled()) { this.versionVector.recordVersion(tag.getMemberID(), tag.getRegionVersion()); DiskRegion region = this.getDiskRegion(); // We also need to update the RVV that represents what we have persisted on disk if (region != null) { region.recordRecoveredVersionTag(tag); } } }
/** * Ensure that a version tag has been recorded in the region's version vector. This makes note * that the event has been received and processed but probably didn't affect the cache's state * or it would have been recorded earlier. * * @param tag the version information * @param r the affected region */ public void checkVersionIsRecorded(VersionTag tag, LocalRegion r) { if (tag != null && !tag.isRecorded()) { // oops - someone forgot to record the event if (r != null) { RegionVersionVector v = r.getVersionVector(); if (v != null) { VersionSource mbr = tag.getMemberID(); if (mbr == null) { mbr = getSender(); } if (logger.isTraceEnabled()) { logger.trace( "recording version tag in RVV in basicProcess since it wasn't done earlier"); } v.recordVersion(mbr, tag); } } } }
rvv.recordVersion(id, stamp.getRegionVersion());
rvv.recordVersion(tag.getMemberID(), tag.getRegionVersion());
remoteRVV.recordVersion(id, stamp.getRegionVersion());
/** * Records a received region-version. These are transmitted in VersionTags in messages between * peers and from servers to clients. * * @param tag the version information */ public void recordVersion(T mbr, VersionTag<T> tag) { tag.setRecorded(); assert tag.isRecorded(); T member = tag.getMemberID(); if (member == null) { member = mbr; } if (this.myId.equals(member)) { // We can be asked to record a version for the local member if a persistent // member is restarted and an event is replayed after the persistent member // recovers. So we can only assert that the local member has already seen // the replayed event. synchronized (localExceptions) { if (this.localVersion.get() < tag.getRegionVersion() && region != null && region.isInitialized() && region.getDataPolicy().withPersistence()) { Assert.fail( "recordVersion invoked for a local version tag that is higher than our local version. rvv=" + this + ", tag=" + tag + " " + region.getName()); } } } recordVersion(member, tag.getRegionVersion()); }
void basicUpdateEntryVersion(EntryEventImpl event) throws EntryNotFoundException { if (hasSeenEvent(event)) { if (logger.isTraceEnabled(LogMarker.DM_VERBOSE)) { logger.trace(LogMarker.DM_VERBOSE, "LR.basicDestroy: this cache has already seen this event {}", event); } if (this.getConcurrencyChecksEnabled() && event.getVersionTag() != null && !event.getVersionTag().isRecorded()) { getVersionVector().recordVersion((InternalDistributedMember) event.getDistributedMember(), event.getVersionTag()); } return; } getDataView().updateEntryVersion(event); }
@Test public void testRecordVersionDuringRegionInit() { LocalRegion mockRegion = mock(LocalRegion.class); when(mockRegion.isInitialized()).thenReturn(false); final String local = getIPLiteral(); InternalDistributedMember ownerId = new InternalDistributedMember(local, 101); VMVersionTag tag = new VMVersionTag(); tag.setRegionVersion(1L); RegionVersionVector rvv = createRegionVersionVector(ownerId, mockRegion); rvv.recordVersion(ownerId, tag); assertEquals(1, rvv.getVersionForMember(ownerId)); }
@Test public void recordVersionIntoLocalMemberShouldPassfRegionIsNonPersistent() { LocalRegion mockRegion = mock(LocalRegion.class); when(mockRegion.isInitialized()).thenReturn(true); when(mockRegion.getDataPolicy()).thenReturn(DataPolicy.REPLICATE); final String local = getIPLiteral(); InternalDistributedMember ownerId = new InternalDistributedMember(local, 101); RegionVersionVector rvv = createRegionVersionVector(ownerId, mockRegion); VMVersionTag tag = new VMVersionTag(); tag.setRegionVersion(1); tag.setMemberID(ownerId); rvv.recordVersion(ownerId, tag); assertEquals(1, rvv.getLocalExceptions().version); assertEquals(2, rvv.getNextVersion()); }
/** * basicInvalidate is overridden in HARegion to abort expiry of Events which have key as Long , if * it is not able to destroy from availableIDs * * @param forceNewEntry true if we are a mirror and still in the initialization phase. Called from * InvalidateOperation.InvalidateMessage */ void basicInvalidate(final EntryEventImpl event, boolean invokeCallbacks, final boolean forceNewEntry) throws EntryNotFoundException { if (!event.isOriginRemote() && !event.isDistributed() && getScope().isDistributed() && getDataPolicy().withReplication() && invokeCallbacks) { // catches case where being called by (distributed) invalidateRegion throw new IllegalStateException( "Cannot do a local invalidate on a replicated region"); } if (hasSeenEvent(event)) { if (logger.isTraceEnabled(LogMarker.DM_VERBOSE)) { logger.trace(LogMarker.DM_VERBOSE, "LR.basicInvalidate: this cache has already seen this event {}", event); } if (this.getConcurrencyChecksEnabled() && event.getVersionTag() != null && !event.getVersionTag().isRecorded()) { getVersionVector().recordVersion((InternalDistributedMember) event.getDistributedMember(), event.getVersionTag()); } return; } discoverJTA(); getDataView().invalidateExistingEntry(event, invokeCallbacks, forceNewEntry); }
/** * Does the "put" of one entry for a "putall" operation. Note it calls back to * AbstractUpdateOperation.UpdateMessage#basicOperationOnRegion * * @param entry the entry being put * @param rgn the region the entry is put in */ public void doEntryPut(PutAllEntryData entry, DistributedRegion rgn) { @Released EntryEventImpl ev = PutAllMessage.createEntryEvent(entry, getSender(), this.context, rgn, this.possibleDuplicate, this.needsRouting, this.callbackArg, true, skipCallbacks); // we don't need to set old value here, because the msg is from remote. local old value will // get from next step try { super.basicOperateOnRegion(ev, rgn); } finally { if (ev.hasValidVersionTag() && !ev.getVersionTag().isRecorded()) { if (rgn.getVersionVector() != null) { rgn.getVersionVector().recordVersion(getSender(), ev.getVersionTag()); } } ev.release(); } }
getVersionVector().recordVersion((InternalDistributedMember) event.getDistributedMember(), event.getVersionTag());
rvv.recordVersion(tag.getMemberID(), tag.getRegionVersion());
rv1.recordVersion(server2, 1); rv1.recordVersion(server2, 5); rv1.recordVersion(server2, 8); rv1.recordVersion(server3, 1); rv1.recordVersion(server3, 3); RegionVersionVector singletonRVV = rv1.getCloneForTransmission(server2); assertTrue(singletonRVV.isForSynchronization());
if (ev.hasValidVersionTag() && !ev.getVersionTag().isRecorded()) { if (rgn.getVersionVector() != null) { rgn.getVersionVector().recordVersion(getSender(), ev.getVersionTag());