/** * Get a map of the member to the version and exception list for that member, including the local * member. */ public Map<T, RegionVersionHolder<T>> getMemberToVersion() { RegionVersionHolder<T> myExceptions; myExceptions = this.localExceptions.clone(); HashMap<T, RegionVersionHolder<T>> results = new HashMap<T, RegionVersionHolder<T>>(memberToVersion); results.put(getOwnerId(), myExceptions); return results; }
/** * Retrieve a vector that can be sent to another member. This clones all of the version * information to protect against concurrent modification during serialization */ public RegionVersionVector<T> getCloneForTransmission() { Map<T, RegionVersionHolder<T>> liveHolders; liveHolders = new HashMap<T, RegionVersionHolder<T>>(this.memberToVersion); ConcurrentHashMap<T, RegionVersionHolder<T>> clonedHolders = new ConcurrentHashMap<T, RegionVersionHolder<T>>(liveHolders.size(), LOAD_FACTOR, CONCURRENCY_LEVEL); for (Map.Entry<T, RegionVersionHolder<T>> entry : liveHolders.entrySet()) { clonedHolders.put(entry.getKey(), entry.getValue().clone()); } ConcurrentHashMap<T, Long> gcVersions = new ConcurrentHashMap<T, Long>( this.memberToGCVersion.size(), LOAD_FACTOR, CONCURRENCY_LEVEL); gcVersions.putAll(this.memberToGCVersion); RegionVersionHolder<T> clonedLocalHolder; clonedLocalHolder = this.localExceptions.clone(); // Make sure the holder that we send to the peer does // have an accurate RegionVersionHolder for our local version return createCopy(this.myId, clonedHolders, this.localVersion.get(), gcVersions, this.localGCVersion.get(), false, clonedLocalHolder); }
/** * Retrieve a vector that can be sent to another member. This clones only the version information * for the given ID. * <p> * The clone returned by this method does not have distributed garbage-collection information. */ public RegionVersionVector<T> getCloneForTransmission(T mbr) { Map<T, RegionVersionHolder<T>> liveHolders; liveHolders = new HashMap<T, RegionVersionHolder<T>>(this.memberToVersion); RegionVersionHolder<T> holder = liveHolders.get(mbr); if (holder == null) { holder = new RegionVersionHolder<T>(-1); } else { holder = holder.clone(); } return createCopy(this.myId, new ConcurrentHashMap<T, RegionVersionHolder<T>>(Collections.singletonMap(mbr, holder)), 0, new ConcurrentHashMap<T, Long>(INITIAL_CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL), 0, true, new RegionVersionHolder<T>(-1)); }
justification = "sync on localExceptions guards concurrent modification but this is a replacement") public void initRecoveredVersion(T member, RegionVersionHolder<T> v, boolean latestOplog) { RegionVersionHolder<T> recovered = v.clone();
public void initializeVersionHolder(T mbr, RegionVersionHolder<T> otherHolder) { RegionVersionHolder<T> h = this.memberToVersion.get(mbr); if (h == null) { if (!mbr.equals(this.myId)) { h = otherHolder.clone(); h.makeReadyForRecording(); this.memberToVersion.put(mbr, h); } else { RegionVersionHolder<T> vh = otherHolder; long version = vh.version; updateLocalVersion(version); this.localExceptions.initializeFrom(vh); } } else { // holders must be modified under synchronization h.initializeFrom(otherHolder); } }
RegionVersionHolder<T> other = source.clone();
RegionVersionHolder<T> other = source.clone(); other.mergeBitSet();
@Test public void test48066_1() { RegionVersionHolder vh1 = new RegionVersionHolder(member); for (int i = 1; i <= 3; i++) { vh1.recordVersion(i); } System.out.println("vh1=" + vh1); RegionVersionHolder vh2 = vh1.clone(); System.out.println("after clone, vh2=" + vh2); { RegionVersionHolder vh3 = new RegionVersionHolder(member); for (int i = 1; i <= 10; i++) { vh3.recordVersion(i); } // create special exception 10(3-11), bitsetVerson=3 vh3.initializeFrom(vh2); System.out.println("after init, vh3=" + vh3); assertEquals(3, vh3.getVersion()); // to make bsv3,bs=[0,1] vh3.recordVersion(4); System.out.println("after record 4, vh3="); assertEquals(4, vh3.getVersion()); vh3.recordVersion(7); System.out.println("after record 7, vh3=" + vh3); assertEquals(7, vh3.getVersion()); } }
compareWithBitSet(bs1, vh2); RegionVersionHolder vh4 = vh2.clone(); assertEquals(105, vh4.version); assertEquals(100, vh4.getVersion());
rgn.getVersionVector().getHolderForMember(this.lostMemberVersionID); if (rvh != null) { holderToSync = rvh.clone();
RegionVersionHolder clone = vh.clone(); System.out.println("clone: \t\t" + clone); assertTrue("Expected a version greater than 7746 but got this: " + clone,