Bill Burcham created GEODE-8298:
-----------------------------------
Summary: member version comparison sense inconsistent when
deciding on multicast
Key: GEODE-8298
URL: https://issues.apache.org/jira/browse/GEODE-8298
Project: Geode
Issue Type: Bug
Components: membership
Reporter: Bill Burcham
Since about 2014 when we introduced the {{Version}} class to replace use of
{{short}}s all over the place for serialization versions, these two loops in
{{GMSMembership.processView()}} have used comparisons that disagree in sense:
{code}
// We perform the update under a global lock so that other
// incoming events will not be lost in terms of our global view.
latestViewWriteLock.lock();
try {
// first determine the version for multicast message serialization
VersionOrdinal version = Version.CURRENT;
for (final Entry<ID, Long> internalIDLongEntry : surpriseMembers
.entrySet()) {
ID mbr = internalIDLongEntry.getKey();
final VersionOrdinal itsVersion = mbr.getVersionObject();
if (itsVersion != null && version.compareTo(itsVersion) < 0) {
version = itsVersion;
}
}
for (ID mbr : newView.getMembers()) {
final VersionOrdinal itsVersion = mbr.getVersionObject();
if (itsVersion != null && itsVersion.compareTo(version) < 0) {
version = mbr.getVersionObject();
}
}
disableMulticastForRollingUpgrade = !version.equals(Version.CURRENT);
{code}
The goal here is to find the oldest version and if that version is older than
our local version we disable multicast. So we want to put the minimum into
{{version}}. So the first loop's comparison is wrong and the second one is
right.
While we are in here let's combine the two loops using a {{Iterable}}
combinator like Guava's {{Iterables.concat()}} or Apache Commons Collections
{{IterableUtils.chainedIterable()}} to combine the two iterables:
{{surpriseMembers}} and {{newView.getMembers()}} into one iterable. If we don't
want to introduce either of those two libraries into the product we can write
our own {{concat()}} utility like the one described here:
https://www.baeldung.com/java-combine-multiple-collections
Once we have the combined {{Iterable}} we can use something like
{{Collections.min()}} to find the minimum in one swell foop and this whole
thing collapses to one or two declarative expressions.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)