@Override
  public int compareTo(MemberData o, boolean compareUUIDs, boolean compareViewIds) {
    if (o == this) {
      return 0;
    }
    // obligatory type check
    if (o == null) {
      throw new ClassCastException(
          "GMSMember.compareTo(): comparison between different classes");
    }
    byte[] myAddr = inetAddr.getAddress();
    GMSMemberData his = (GMSMemberData) o;
    byte[] hisAddr = his.inetAddr.getAddress();
    if (myAddr != hisAddr) {
      for (int idx = 0; idx < myAddr.length; idx++) {
        if (idx >= hisAddr.length) {
          return 1;
        } else if (myAddr[idx] > hisAddr[idx]) {
          return 1;
        } else if (myAddr[idx] < hisAddr[idx]) {
          return -1;
        }
      }
      // After checking both addresses we have only gone up to myAddr.length, their address could be
      // longer
      if (hisAddr.length > myAddr.length) {
        return -1;
      }
    }
    if (udpPort < his.udpPort) {
      return -1;
    }
    if (his.udpPort < udpPort) {
      return 1;
    }
    int result = 0;

    // bug #41983, address of kill-9'd member is reused
    // before it can be ejected from membership
    if (compareViewIds && vmViewId >= 0 && his.vmViewId >= 0) {
      if (vmViewId < his.vmViewId) {
        result = -1;
      } else if (his.vmViewId < vmViewId) {
        result = 1;
      }
    }
    if (compareUUIDs && result == 0 && uuidMSBs != 0 && his.uuidMSBs != 0) {
      if (uuidMSBs < his.uuidMSBs) {
        result = -1;
      } else if (his.uuidMSBs < uuidMSBs) {
        result = 1;
      } else if (uuidLSBs < his.uuidLSBs) {
        result = -1;
      } else if (his.uuidLSBs < uuidLSBs) {
        result = 1;
      }
    }
    return result;
  }
return the jgroups logical address for this member, if it's been established
geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSMemberData.java