@Test public void testRecordedBit() { assertEquals(false, vt.isRecorded()); vt.setRecorded(); assertEquals(true, vt.isRecorded()); }
/** * 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); } } } }
/** * 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); }
/** * 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(); } }
&& !event.getVersionTag().isRecorded()) { getVersionVector().recordVersion((InternalDistributedMember) event.getDistributedMember(), event.getVersionTag());
&& !ev.getVersionTag().isRecorded()) { rgn.getVersionVector().recordVersion( (InternalDistributedMember) ev.getDistributedMember(), ev.getVersionTag());
this.appliedOperation = false; } finally { if (ev.hasValidVersionTag() && !ev.getVersionTag().isRecorded()) { if (rgn.getVersionVector() != null) { rgn.getVersionVector().recordVersion(getSender(), ev.getVersionTag());