@Override public String toString() { if (this.isLiveVector) { return "RegionVersionVector{rv"+this.localVersion+" gc"+this.localGCVersion+"}"; } else { return fullToString(); } }
/** initializes a new version vector for this region */ protected void createVersionVector() { this.versionVector = RegionVersionVector.create(getVersionMember(), this); if (dataPolicy.withPersistence()) { //copy the versions that we have recovered from disk into //the version vector. RegionVersionVector diskVector = this.diskRegion.getRegionVersionVector(); this.versionVector.recordVersions(diskVector.getCloneForTransmission()); } else if (!dataPolicy.withStorage()) { // version vectors are currently only necessary in empty regions for // tracking canonical member IDs this.versionVector.turnOffRecordingForEmptyRegion(); } if (this.srp != null) { this.versionVector.setIsClientVector(); } this.cache.getDistributionManager().addMembershipListener(this.versionVector); }
for (Map.Entry<T, RegionVersionHolder<T>> entry: otherVector.getMemberToVersion().entrySet()) { T mbr = entry.getKey(); RegionVersionHolder<T> otherHolder = entry.getValue(); initializeVersionHolder(mbr, otherHolder); otherVector.syncLocalVersion(); initializeVersionHolder(otherVector.getOwnerId(), otherVector.localExceptions); if (otherVector.getCurrentVersion() > 0 && !this.memberToVersion.containsKey(otherVector.getOwnerId())) { recordVersion(otherVector.getOwnerId(), otherVector.getCurrentVersion()); if (!otherVector.memberToVersion.containsKey(mbr) && !mbr.equals(otherVector.getOwnerId())) { RegionVersionHolder holder = this.memberToVersion.get(mbr); initializeVersionHolder(mbr, new RegionVersionHolder(0)); if (!otherVector.memberToVersion.containsKey(myId) && !myId.equals(otherVector.getOwnerId())) { initializeVersionHolder(myId, new RegionVersionHolder(0)); for (Map.Entry<T, Long> entry: otherVector.getMemberToGCVersion().entrySet()) { T member = entry.getKey(); Long value = entry.getValue();
private long getRegionVersionForMember(RegionVersionVector rvv, DiskStoreID member, boolean isRVVGC) { long ret = 0; if (isRVVGC) { ret = rvv.getGCVersion(member); } else { ret = rvv.getVersionForMember(member); } return (ret == -1? 0: ret); }
/** * Update the on disk GC version for the given member, only if the disk has * actually recorded all of the updates including that member. * * @param diskRVV * the RVV for what has been persisted * @param inMemoryRVV * the RVV of what is in memory * @param member * The member we're trying to update */ private void updateDiskGCRVV(RegionVersionVector diskRVV, RegionVersionVector inMemoryRVV, VersionSource member) { long diskVersion = diskRVV.getVersionForMember(member); long memoryGCVersion = inMemoryRVV.getGCVersion(member); // If the GC version is less than what we have on disk, go ahead // and record it. if (memoryGCVersion <= diskVersion) { diskRVV.recordGCVersion(member, memoryGCVersion); } }
HashMap<DiskStoreID, RegionVersionHolder<DiskStoreID>> getAllMemberToVersion(RegionVersionVector rvv) { HashMap<DiskStoreID, RegionVersionHolder<DiskStoreID>> allMemberToVersion = new HashMap(rvv.getMemberToVersion()); RegionVersionHolder localHolder = rvv.getLocalExceptions().clone(); localHolder.setVersion(rvv.getCurrentVersion()); allMemberToVersion.put((DiskStoreID)rvv.getOwnerId(), localHolder); return allMemberToVersion; }
rv1.recordVersion(server2, 1); rv1.recordVersion(server2, 5); rv1.recordVersion(server2, 8); getLogWriter().info("for test (a) formed this RVV: " + rv1.fullToString()); assertEquals(8, rv1.getVersionForMember(server2)); assertEquals(2, rv1.getExceptionCount(server2)); rv1.recordVersion(server2, 3); getLogWriter().info("for test (a) RVV is now: " + rv1.fullToString()); assertEquals(8, rv1.getVersionForMember(server2)); assertEquals(2, rv1.getExceptionCount(server2)); rv1.recordVersion(server2, 4); rv1.recordVersion(server2, 2); getLogWriter().info("for test (a) RVV is now: " + rv1.fullToString()); assertEquals(1, rv1.getExceptionCount(server2)); rv1.recordVersion(server2, 6); rv1.recordVersion(server2, 7); getLogWriter().info("for test (a) RVV is now: " + rv1.fullToString()); assertEquals(0, rv1.getExceptionCount(server2)); rv1.recordVersion(server2, 1); rv1.recordVersion(server2, 5); rv1.recordVersion(server2, 8); rv1.recordVersion(server2, 10); getLogWriter().info("for test (b) formed this RVV: " + rv1.fullToString()); assertTrue(rv1.contains(server2, 1)); assertTrue(rv1.contains(server2, 5)); assertTrue(rv1.contains(server2, 8)); assertTrue(rv1.contains(server2, 10));
m.versionVector = this.region.getVersionVector().getCloneForTransmission(lostMemberVersionID); m.lostMemberVersionID = lostMemberVersionID; m.lostMemberID = lostMember; } else { m.versionVector = this.region.getVersionVector().getCloneForTransmission(); long hisVersion = this.region.getVersionVector().getVersionForMember(lostMemberVersionID); this.region.getVersionVector().removeExceptionsFor(target, hisVersion); RegionVersionHolder holder = this.region.getVersionVector().getHolderForMember(lostMemberVersionID); if (this.rcvd_holderToSync != null && this.rcvd_holderToSync.isNewerThanOrCanFillExceptionsFor(holder)) { logger.info("synchronizeWith detected mismatch region version holder for lost member {}. Old is {}, new is {}", lostMemberVersionID, holder, this.rcvd_holderToSync); this.region.getVersionVector().initializeVersionHolder(lostMemberVersionID, this.rcvd_holderToSync);
if (this.versionVector.isForSynchronization() && !rgn.getConcurrencyChecksEnabled()) { if (isGiiDebugEnabled) { logger.trace(LogMarker.GII, "ignoring synchronization request as this region has no version vector"); logger.debug("checking version vector against region's ({})", rgn.getVersionVector().fullToString()); if ( !rgn.getVersionVector().isNewerThanOrCanFillExceptionsFor(this.versionVector) ) { logger.trace(LogMarker.GII, "version vector reports that I have nothing that the requester hasn't already seen"); replyNoData(dm, true, rgn.getVersionVector().getMemberToGCVersion()); sendFailureMessage = false; return; RegionVersionHolder rvh = rgn.getVersionVector().getHolderForMember(this.lostMemberVersionID); if (rvh != null) { holderToSync = rvh.clone(); RegionVersionHolder holderOfRequest = this.versionVector.getHolderForMember(this.lostMemberVersionID); if (holderToSync.isNewerThanOrCanFillExceptionsFor(holderOfRequest)) { logger.trace(LogMarker.GII, "synchronizeWith detected mismatch region version holder for lost member {}. Old is {}, new is {}", RegionVersionVector rvv = rgn.getVersionVector().getCloneForTransmission(); RegionStateMessage.send(dm, getSender(), this.processorId, rvv, false);
if (this.region.getDataPolicy().withPersistence() && localRVV.isNewerThanOrCanFillExceptionsFor(remoteRVV)) { id = myId; if (!remoteRVV.contains(id, stamp.getRegionVersion())) { remoteRVV.recordVersion(id, stamp.getRegionVersion());
if (logger.isTraceEnabled(LogMarker.PERSIST_WRITES)) { logger.trace(LogMarker.PERSIST_WRITES, "serializeRVVs: isGCRVV={} drId={} rvv={} oplog#{}", gcRVV, diskRegionID, rvv .fullToString(), getOplogId()); Map<VersionSource, Long> memberToVersion = rvv.getMemberToGCVersion(); InternalDataSerializer.writeUnsignedVL(memberToVersion.size(), out); for (Entry<VersionSource, Long> memberEntry : memberToVersion.entrySet()) { Map<VersionSource, RegionVersionHolder> memberToVersion = rvv.getMemberToVersion(); InternalDataSerializer.writeUnsignedVL(memberToVersion.size(), out); for (Map.Entry<VersionSource, RegionVersionHolder> memberEntry : memberToVersion.entrySet()) {
void cmnClearRegion(RegionEventImpl regionEvent, boolean cacheWrite, boolean useRVV) { RegionVersionVector rvv = null; if (useRVV && this.dataPolicy.withReplication() && this.concurrencyChecksEnabled) { rvv = this.versionVector.getCloneForTransmission(); } clearRegionLocally(regionEvent, cacheWrite, rvv); }
if (this.versionVector.isForSynchronization() && !rgn.getConcurrencyChecksEnabled()) { if (TRACE_GII) { logger.info(LocalizedStrings.DEBUG, "ignoring synchronization request as this region has no version vector"); +rgn.getVersionVector().fullToString()+")"); if ( !rgn.getVersionVector().isNewerThanOrCanFillExceptionsFor(this.versionVector) ) { RegionVersionHolder rvh = rgn.getVersionVector().getHolderForMember(this.lostMemberVersionID); if (rvh != null) { holderToSync = rvh.clone(); RegionVersionHolder holderOfRequest = this.versionVector.getHolderForMember(this.lostMemberVersionID); if (holderToSync.isNewerThanOrCanFillExceptionsFor(holderOfRequest)) { logger.info(LocalizedStrings.DEBUG, "synchronizeWith detected mismatch region version holder for lost member "
/** * return the next local version number */ private final long getNextVersion(boolean checkLocked, EntryEventImpl event) { 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 LogWriterI18n log = getLoggerI18n(); if (log != null && log.fineEnabled()) { log.fine("generating a version tag when version generation is locked by " + this.lockOwner, new Exception("Stack trace")); } } long new_version = localVersion.incrementAndGet(); // since there could be special exception, we have to use recordVersion() recordVersion(getOwnerId(), new_version, event); return new_version; }
updateDiskGCRVV(diskRVV, inMemoryRVV, diskRVV.getOwnerId()); for (VersionSource member : (Collection<VersionSource>) inMemoryRVV .getMemberToGCVersion().keySet()) { updateDiskGCRVV(diskRVV, inMemoryRVV, member); diskRVV.pruneOldExceptions();
rvv.recordVersion(rvv.getOwnerId(),nextRegionVersion); if (logger.isDebugEnabled()) { logger.debug("recorded region version {}; region={}", nextRegionVersion, region.getFullPath()); tag.setRegionVersion(region.getVersionVector().getNextVersion());
private boolean verifyExceptionList(final DiskStoreID member, final long regionversion, final RegionVersionVector rvv, final long[] exceptionList) { boolean exceptionListVerified = true; if (exceptionList != null) { for (long i:exceptionList) { exceptionListVerified = !rvv.contains(member, i); if (!exceptionListVerified) { getLogWriter().finer("DeltaGII:missing exception "+i+":"+rvv); break; } } } else { // expect no exceptionlist for (long i = 1; i<=regionversion; i++) { if (!rvv.contains(member, i)) { exceptionListVerified = false; getLogWriter().finer("DeltaGII:unexpected exception "+i); break; } } } return exceptionListVerified; }
/** * return the next local version number for a clear() operation, * bypassing lock checks */ public long getNextVersionWhileLocked() { return getNextVersion(false); }
protected void saveReceivedRVV(RegionVersionVector rvv) { assert rvv != null; // Make sure the RVV is at least as current as // the provider's was when the GII began. This ensures that a // concurrent clear() doesn't prevent the new region's RVV from being // initialized and that any vector entries that are no longer represented // by stamps in the region are not lost if (logger.isTraceEnabled(LogMarker.GII)) { logger.trace(LogMarker.GII, "Applying received version vector {} to {}", rvv.fullToString(), region.getName()); } //TODO - RVV - Our current RVV might reflect some operations //that are concurrent updates. We want to keep those updates. However //it might also reflect things that we recovered from disk that we are going //to remove. We'll need to remove those from the RVV somehow. region.getVersionVector().recordVersions(rvv); if(region.getDataPolicy().withPersistence()) { region.getDiskRegion().writeRVV(region, false); region.getDiskRegion().writeRVVGC(region); } if (logger.isTraceEnabled(LogMarker.GII)) { logger.trace(LogMarker.GII, "version vector is now {}", region.getVersionVector().fullToString()); } }
&& !rvv.contains(tag.getMemberID(), tag.getRegionVersion())) { if (needsSync == null) { needsSync = new HashSet<VersionSource>(); rvv.recordVersion(tag.getMemberID(), tag.getRegionVersion());