/** * test hook<p> * The lead member is the eldest member with partition detection enabled.<p> * If no members have partition detection enabled, there will be no * lead member and this method will return null. * @return the lead member associated with the latest view */ public DistributedMember getLeadMember() { latestViewLock.readLock().lock(); try { return latestView == null? null : latestView.getLeadMember(); } finally { latestViewLock.readLock().unlock(); } }
private boolean calculateQuorum() { // quorum check int weight = getWeight(this.lastView.getMembers(), this.lastView.getLeadMember()); int ackedWeight = getWeight(receivedAcks, this.lastView.getLeadMember()); int lossThreshold = (int) Math.round((weight * this.partitionThreshold) / 100.0); if (isDebugEnabled) { logger.debug("quorum check: contacted {} processes with {} member weight units. Threshold for a quorum is {}", receivedAcks.size(), ackedWeight, lossThreshold); } return (ackedWeight >= lossThreshold); }
/** * Print a membership view (list of {@link InternalDistributedMember}s) * * @param v the list * @return String */ static public String printView(NetView v) { if (v == null) return "null"; StringBuffer sb = new StringBuffer(); Object leadObj = v.getLeadMember(); InternalDistributedMember lead = leadObj==null? null : new InternalDistributedMember((JGroupMember)v.getLeadMember()); sb.append("["); Iterator it = v.iterator(); while (it.hasNext()) { InternalDistributedMember m = (InternalDistributedMember)it.next(); sb.append(m.toString()); if (lead != null && lead.equals(m)) { sb.append("{lead}"); } if (it.hasNext()) sb.append(", "); } sb.append("]"); return sb.toString(); }
public String toString() { InternalDistributedMember lead = getLeadMember();
/** * returns the weight of the members in this membership view */ public int memberWeight() { int result = 0; InternalDistributedMember lead = getLeadMember(); for (InternalDistributedMember mbr : this.members) { result += mbr.getNetMember().getMemberWeight(); switch (mbr.getVmKind()) { case DistributionManager.NORMAL_DM_TYPE: result += 10; if (lead != null && mbr.equals(lead)) { result += 5; } break; case DistributionManager.LOCATOR_DM_TYPE: result += 3; break; case DistributionManager.ADMIN_ONLY_DM_TYPE: break; default: throw new IllegalStateException("Unknown member type: " + mbr.getVmKind()); } } return result; }
/** * logs the weight of failed members wrt the given previous * view */ public void logCrashedMemberWeights(NetView oldView, Logger log) { InternalDistributedMember lead = oldView.getLeadMember(); for (InternalDistributedMember mbr : this.crashedMembers) { if (!oldView.contains(mbr)) { continue; } int mbrWeight = mbr.getNetMember().getMemberWeight(); switch (mbr.getVmKind()) { case DistributionManager.NORMAL_DM_TYPE: if (lead != null && mbr.equals(lead)) { mbrWeight += 15; } else { mbrWeight += 10; } break; case DistributionManager.LOCATOR_DM_TYPE: mbrWeight += 3; break; case DistributionManager.ADMIN_ONLY_DM_TYPE: break; default: throw new IllegalStateException("Unknown member type: " + mbr.getVmKind()); } log.info(" " + mbr + " had a weight of " + mbrWeight); } }
/** * returns the weight of crashed members in this membership view * with respect to the given previous view */ public int getCrashedMemberWeight(NetView oldView) { int result = 0; InternalDistributedMember lead = oldView.getLeadMember(); for (InternalDistributedMember mbr : this.crashedMembers) { if (!oldView.contains(mbr)) { continue; } result += mbr.getNetMember().getMemberWeight(); switch (mbr.getVmKind()) { case DistributionManager.NORMAL_DM_TYPE: result += 10; if (lead != null && mbr.equals(lead)) { result += 5; } break; case DistributionManager.LOCATOR_DM_TYPE: result += 3; break; case DistributionManager.ADMIN_ONLY_DM_TYPE: break; default: throw new IllegalStateException("Unknown member type: " + mbr.getVmKind()); } } return result; }
result.setLeadMember(v.getLeadMember()); return result;