private RegionVersionHolder createHolder(boolean useBitSet) { if (useBitSet) { return new RegionVersionHolder("id"); } return new RegionVersionHolder(0l); }
private boolean isGCVersionDominatedByOtherHolder(Long gcVersion, RegionVersionHolder<T> otherHolder) { if (gcVersion == null || gcVersion.longValue() == 0) { return true; } else { RegionVersionHolder<T> holder = new RegionVersionHolder<T>(gcVersion.longValue()); return !holder.isNewerThanOrCanFillExceptionsFor(otherHolder); } }
@VisibleForTesting RegionVersionVector(T ownerId, LocalRegion owner, long version) { this.myId = ownerId; this.isLiveVector = true; this.region = owner; this.localExceptions = new RegionVersionHolder<T>(0); this.memberToVersion = new ConcurrentHashMap<>(INITIAL_CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL); this.memberToGCVersion = new ConcurrentHashMap<>(INITIAL_CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL); this.localVersion.set(version); }
/** * 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)); }
@Override public synchronized RegionVersionHolder<T> clone() { RegionVersionHolder<T> clone = new RegionVersionHolder<T>(this.version); clone.id = this.id; clone.isDepartedMember = this.isDepartedMember; if (this.exceptions != null) { clone.exceptions = new LinkedList<RVVException>(); for (RVVException e : this.exceptions) { clone.exceptions.add(e.clone()); } } if (this.bitSet != null) { clone.bitSet = (BitSet) this.bitSet.clone(); clone.bitSetVersion = this.bitSetVersion; clone.mergeBitSet(); } return clone; }
@Override public void fromData(DataInput in) throws IOException, ClassNotFoundException { this.myId = readMember(in); int flags = in.readInt(); this.singleMember = ((flags & 0x01) == 0x01); this.localVersion.set(in.readLong()); this.localGCVersion.set(in.readLong()); int numHolders = in.readInt(); for (int i = 0; i < numHolders; i++) { T key = readMember(in); RegionVersionHolder<T> holder = new RegionVersionHolder<T>(in); holder.id = key; this.memberToVersion.put(key, holder); } int numGCVersions = in.readInt(); for (int i = 0; i < numGCVersions; i++) { T key = readMember(in); RegionVersionHolder<T> holder = this.memberToVersion.get(key); if (holder != null) { key = holder.id; } // else it could go in canonicalIds, but that's not used in copies of RVVs long value = in.readLong(); this.memberToGCVersion.put(key, value); } this.localExceptions = new RegionVersionHolder<T>(in); }
this.hasHolderToSend = in.readBoolean(); if (this.hasHolderToSend) { this.holderToSend = new RegionVersionHolder(in);
if (holder == null) { mbr = getCanonicalId(mbr); holder = new RegionVersionHolder<T>(mbr); memberToVersion.put(holder.id, holder);
&& !mbr.equals(otherVector.getOwnerId())) { RegionVersionHolder holder = this.memberToVersion.get(mbr); initializeVersionHolder(mbr, new RegionVersionHolder(0)); initializeVersionHolder(myId, new RegionVersionHolder(0));
/** * Construct a region version holder that matches the seen revisions passed in the bit set. * */ private RegionVersionHolder buildHolder(BitSet bs) { // Createa version holder RegionVersionHolder vh = new RegionVersionHolder(member); // Record all of the version in the holder recordVersions(vh, bs); // Make sure the holder looks matches the bitset. compareWithBitSet(bs, vh); return vh; }
@Test public void isRvvGcDominatedByRequesterRvvReturnsTrueIfRequesterRvvForLostMemberDominates() throws Exception { InternalDistributedMember lostMember = mock(InternalDistributedMember.class); ConcurrentHashMap<InternalDistributedMember, Long> memberToGcVersion = new ConcurrentHashMap<>(); memberToGcVersion.put(lostMember, new Long(1) /* lostMemberGcVersion */); RegionVersionVector providerRvv = new VMRegionVersionVector(lostMember, null, 0, memberToGcVersion, 0, true, null); ConcurrentHashMap<InternalDistributedMember, RegionVersionHolder<InternalDistributedMember>> memberToRegionVersionHolder = new ConcurrentHashMap<>(); RegionVersionHolder regionVersionHolder = new RegionVersionHolder(lostMember); regionVersionHolder.setVersion(2); memberToRegionVersionHolder.put(lostMember, regionVersionHolder); RegionVersionVector requesterRvv = new VMRegionVersionVector(lostMember, memberToRegionVersionHolder, 0, null, 0, true, null); assertThat(providerRvv.isRVVGCDominatedBy(requesterRvv)).isTrue(); }
@Test public void isRvvGcDominatedByRequesterRvvReturnsFalseIfRequesterRvvForLostMemberDominates() throws Exception { InternalDistributedMember lostMember = mock(InternalDistributedMember.class); ConcurrentHashMap<InternalDistributedMember, Long> memberToGcVersion = new ConcurrentHashMap<>(); memberToGcVersion.put(lostMember, new Long(1) /* lostMemberGcVersion */); RegionVersionVector providerRvv = new VMRegionVersionVector(lostMember, null, 0, memberToGcVersion, 0, true, null); ConcurrentHashMap<InternalDistributedMember, RegionVersionHolder<InternalDistributedMember>> memberToRegionVersionHolder = new ConcurrentHashMap<>(); RegionVersionHolder regionVersionHolder = new RegionVersionHolder(lostMember); regionVersionHolder.setVersion(0); memberToRegionVersionHolder.put(lostMember, regionVersionHolder); RegionVersionVector requesterRvv = new VMRegionVersionVector(lostMember, memberToRegionVersionHolder, 0, null, 0, true, null); assertThat(providerRvv.isRVVGCDominatedBy(requesterRvv)).isFalse(); }
@Test public void isRvvGcDominatedByRequesterRvvReturnsFalseIfRequesterRvvDominates() throws Exception { final String local = getIPLiteral(); InternalDistributedMember provider = new InternalDistributedMember(local, 101); InternalDistributedMember requester = new InternalDistributedMember(local, 102); ConcurrentHashMap<InternalDistributedMember, Long> memberToGcVersion = new ConcurrentHashMap<>(); memberToGcVersion.put(requester, new Long(3)); RegionVersionHolder pRegionVersionHolder = new RegionVersionHolder(provider); pRegionVersionHolder.setVersion(4); RegionVersionVector providerRvv = new VMRegionVersionVector(provider, null, 1, memberToGcVersion, 1, false, pRegionVersionHolder); ConcurrentHashMap<InternalDistributedMember, RegionVersionHolder<InternalDistributedMember>> memberToRegionVersionHolder = new ConcurrentHashMap<>(); RegionVersionHolder regionVersionHolder = new RegionVersionHolder(provider); regionVersionHolder.setVersion(2); memberToRegionVersionHolder.put(provider, regionVersionHolder); RegionVersionVector requesterRvv = new VMRegionVersionVector(requester, memberToRegionVersionHolder, 2, null, 0, false, regionVersionHolder); assertThat(providerRvv.isRVVGCDominatedBy(requesterRvv)).isFalse(); }
@Test public void isRvvGcDominatedByRequesterRvvReturnsTrueIfRequesterRvvDominates() throws Exception { final String local = getIPLiteral(); InternalDistributedMember provider = new InternalDistributedMember(local, 101); InternalDistributedMember requester = new InternalDistributedMember(local, 102); ConcurrentHashMap<InternalDistributedMember, Long> memberToGcVersion = new ConcurrentHashMap<>(); memberToGcVersion.put(requester, new Long(1)); RegionVersionVector providerRvv = new VMRegionVersionVector(provider, null, 1, memberToGcVersion, 1, false, null); ConcurrentHashMap<InternalDistributedMember, RegionVersionHolder<InternalDistributedMember>> memberToRegionVersionHolder = new ConcurrentHashMap<>(); RegionVersionHolder regionVersionHolder = new RegionVersionHolder(provider); regionVersionHolder.setVersion(2); memberToRegionVersionHolder.put(provider, regionVersionHolder); RegionVersionVector requesterRvv = new VMRegionVersionVector(requester, memberToRegionVersionHolder, 2, null, 0, false, regionVersionHolder); assertThat(providerRvv.isRVVGCDominatedBy(requesterRvv)).isTrue(); }
@Test public void isRvvGcDominatedByRequesterRvvReturnsTrueIfRequesterRvvDominatesWithNoGcVersion() throws Exception { final String local = getIPLiteral(); InternalDistributedMember provider = new InternalDistributedMember(local, 101); InternalDistributedMember requester = new InternalDistributedMember(local, 102); ConcurrentHashMap<InternalDistributedMember, Long> memberToGcVersion = new ConcurrentHashMap<>(); RegionVersionVector providerRvv = new VMRegionVersionVector(provider, null, 1, memberToGcVersion, 1, false, null); ConcurrentHashMap<InternalDistributedMember, RegionVersionHolder<InternalDistributedMember>> memberToRegionVersionHolder = new ConcurrentHashMap<>(); RegionVersionHolder regionVersionHolder = new RegionVersionHolder(provider); regionVersionHolder.setVersion(2); memberToRegionVersionHolder.put(provider, regionVersionHolder); RegionVersionVector requesterRvv = new VMRegionVersionVector(requester, memberToRegionVersionHolder, 0, null, 0, false, null); assertThat(providerRvv.isRVVGCDominatedBy(requesterRvv)).isTrue(); }
@Test public void isRvvGcDominatedByRequesterRvvReturnsFalseIfRequesterRvvDominatesProvider() throws Exception { final String local = getIPLiteral(); InternalDistributedMember provider = new InternalDistributedMember(local, 101); InternalDistributedMember requester = new InternalDistributedMember(local, 102); RegionVersionVector providerRvv = new VMRegionVersionVector(provider, null, 1, null, 1, false, null); ConcurrentHashMap<InternalDistributedMember, RegionVersionHolder<InternalDistributedMember>> memberToRegionVersionHolder = new ConcurrentHashMap<>(); RegionVersionHolder regionVersionHolder = new RegionVersionHolder(provider); regionVersionHolder.setVersion(0); memberToRegionVersionHolder.put(provider, regionVersionHolder); RegionVersionVector requesterRvv = new VMRegionVersionVector(requester, memberToRegionVersionHolder, 0, null, 0, false, null); assertThat(providerRvv.isRVVGCDominatedBy(requesterRvv)).isFalse(); }
@Test public void isRvvGcDominatedByRequesterRvvReturnsFalseIfProviderRvvIsNotPresent() throws Exception { final String local = getIPLiteral(); InternalDistributedMember provider = new InternalDistributedMember(local, 101); InternalDistributedMember requester = new InternalDistributedMember(local, 102); RegionVersionVector providerRvv = new VMRegionVersionVector(provider, null, 1, null, 1, false, null); ConcurrentHashMap<InternalDistributedMember, RegionVersionHolder<InternalDistributedMember>> memberToRegionVersionHolder = new ConcurrentHashMap<>(); RegionVersionHolder regionVersionHolder = new RegionVersionHolder(provider); regionVersionHolder.setVersion(0); // memberToRegionVersionHolder.put(provider, regionVersionHolder); RegionVersionVector requesterRvv = new VMRegionVersionVector(requester, memberToRegionVersionHolder, 0, null, 0, false, null); assertThat(providerRvv.isRVVGCDominatedBy(requesterRvv)).isFalse(); }
@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()); } }
RegionVersionHolder vh2 = new RegionVersionHolder(member); vh2.initializeFrom(vh1);
RegionVersionHolder vh1 = new RegionVersionHolder(member()); RegionVersionHolder vh2 = new RegionVersionHolder(member());