/** * Remove any exceptions for the given member that are older than the given version. This is used * after a synchronization operation to get rid of unneeded history. * */ public void removeExceptionsFor(DistributedMember mbr, long version) { RegionVersionHolder<T> holder = this.memberToVersion.get(mbr); if (holder != null) { synchronized (holder) { holder.removeExceptionsOlderThan(version); } } }
/** * Remove an exceptions that are older than the current GC version for each member in the RVV. */ public void pruneOldExceptions() { Set<T> members; members = new HashSet<T>(memberToGCVersion.keySet()); for (T member : members) { Long gcVersion = memberToGCVersion.get(member); RegionVersionHolder<T> holder; holder = memberToVersion.get(member); if (holder != null && gcVersion != null) { synchronized (holder) { holder.removeExceptionsOlderThan(gcVersion); } } } localExceptions.removeExceptionsOlderThan(localGCVersion.get()); }
/** * This is used by clear() while version generation is locked to remove old exceptions and update * the GC vector to be the same as the current version vector */ public void removeOldVersions() { synchronized (this.memberToVersion) { long currentVersion = getCurrentVersion(); for (Map.Entry<T, RegionVersionHolder<T>> entry : this.memberToVersion.entrySet()) { RegionVersionHolder<T> holder = entry.getValue(); T id = entry.getKey(); holder.removeExceptionsOlderThan(holder.version); this.memberToGCVersion.put(id, Long.valueOf(holder.version)); } this.localGCVersion.set(getCurrentVersion()); if (this.localExceptions != null) { synchronized (this.localExceptions) { this.localExceptions.removeExceptionsOlderThan(currentVersion); } } } }
recovered.removeExceptionsOlderThan(gcVersion);
vh.recordVersion(7746); System.out.println("updated:\t" + vh); vh.removeExceptionsOlderThan(8712); System.out.println("after GC:\t" + vh);