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); } }
updateLocalVersion(version); } else {
@Test public void doesNothingIfVersionsAreSame() throws Exception { VersionSource<InternalDistributedMember> ownerId = mock(VersionSource.class); long oldVersion = 2; long sameVersion = 2; RegionVersionVector rvv = new TestableRegionVersionVector(ownerId, oldVersion); rvv.updateLocalVersion(sameVersion); assertThat(rvv.getVersionForMember(ownerId)).isEqualTo(oldVersion); }
@Test public void usesNewVersionIfGreaterThanOldVersion() throws Exception { VersionSource<InternalDistributedMember> ownerId = mock(VersionSource.class); long oldVersion = 1; long newVersion = 2; RegionVersionVector rvv = new TestableRegionVersionVector(ownerId, oldVersion); rvv.updateLocalVersion(newVersion); assertThat(rvv.getVersionForMember(ownerId)).isEqualTo(newVersion); }
@Test public void usesOldVersionIfGreaterThanNewVersion() throws Exception { VersionSource<InternalDistributedMember> ownerId = mock(VersionSource.class); long oldVersion = 2; long newVersion = 1; RegionVersionVector rvv = new TestableRegionVersionVector(ownerId, oldVersion); rvv.updateLocalVersion(newVersion); assertThat(rvv.getVersionForMember(ownerId)).isEqualTo(oldVersion); }
@Test public void doesNotHangIfOtherThreadChangedVersion() throws Exception { VersionSource<InternalDistributedMember> ownerId = mock(VersionSource.class); long oldVersion = 1; long newVersion = 2; RegionVersionVector rvv = new VersionRaceConditionRegionVersionVector(ownerId, oldVersion); Future<Void> result = executorServiceRule.runAsync(() -> rvv.updateLocalVersion(newVersion)); assertThatCode(() -> result.get(2, SECONDS)).doesNotThrowAnyException(); assertThat(rvv.getVersionForMember(ownerId)).isEqualTo(newVersion); }
rv1.updateLocalVersion(10); rv1.recordVersion(server2, 1); rv1.recordVersion(server2, 5);