/** * Creates clone of source {@code MemberMap} additionally including new members. * * @param source source map * @param newMembers new members to add * @return clone map */ static MemberMap cloneAdding(MemberMap source, MemberImpl... newMembers) { Map<Address, MemberImpl> addressMap = new LinkedHashMap<Address, MemberImpl>(source.addressToMemberMap); Map<String, MemberImpl> uuidMap = new LinkedHashMap<String, MemberImpl>(source.uuidToMemberMap); for (MemberImpl member : newMembers) { putMember(addressMap, uuidMap, member); } return new MemberMap(source.version + newMembers.length, addressMap, uuidMap); }
void addMembersRemovedInNotJoinableState(Collection<MemberImpl> members) { clusterServiceLock.lock(); try { MemberMap m = membersRemovedInNotJoinableStateRef.get(); m = MemberMap.cloneAdding(m, members.toArray(new MemberImpl[0])); m = MemberMap.cloneExcluding(m, clusterService.getLocalMember()); membersRemovedInNotJoinableStateRef.set(m); } finally { clusterServiceLock.unlock(); } }
boolean isMemberRemovedInNotJoinableState(Address target) { MemberMap membersRemovedInNotJoinableState = membersRemovedInNotJoinableStateRef.get(); return membersRemovedInNotJoinableState.contains(target); }
void removeMembersDeadInNotJoinableState() { clusterServiceLock.lock(); try { MemberMap membersRemovedInNotJoinableState = membersRemovedInNotJoinableStateRef.get(); Collection<MemberImpl> members = membersRemovedInNotJoinableState.getMembers(); membersRemovedInNotJoinableStateRef.set(MemberMap.empty()); for (MemberImpl member : members) { onMemberRemove(member); } } finally { clusterServiceLock.unlock(); } }
MemberImpl member = memberMap.getMember(address, uuid); if (member == null) { throw new IllegalStateException(uuid + "/" + address + " is not a member!"); return memberMap.toMembersView(); MemberImpl[] members = memberMap.getMembers().toArray(new MemberImpl[0]); for (int i = 0; i < members.length; i++) { if (member.equals(members[i])) { MemberMap newMemberMap = MemberMap.createNew(memberMap.getVersion() + 1, members); setMembers(newMemberMap); sendMemberListToOthers(); node.partitionService.memberAdded(member); clusterService.printMemberList(); return newMemberMap.toMembersView(); } finally { clusterServiceLock.unlock();
for (MemberInfo memberInfo : membersView.getMembers()) { Address address = memberInfo.getAddress(); MemberImpl member = currentMemberMap.getMember(address); for (MemberImpl member : currentMemberMap.getMembers()) { if (!newMemberMap.contains(member.getAddress())) { removedMembers.add(member); setMembers(MemberMap.createNew(membersView.getVersion(), members)); sendMembershipEvents(currentMemberMap.getMembers(), addedMembers); membersRemovedInNotJoinableStateRef.set(MemberMap.cloneExcluding(membersRemovedInNotJoinableState, members));
String memberListString() { MemberMap memberMap = getMemberMap(); Collection<MemberImpl> members = memberMap.getMembers(); StringBuilder sb = new StringBuilder("\n\nMembers {") .append("size:").append(members.size()).append(", ") .append("ver:").append(memberMap.getVersion()) .append("} ["); for (Member member : members) { sb.append("\n\t").append(member); } sb.append("\n]\n"); return sb.toString(); }
if (memberMap.getVersion() < callerMemberListVersion) { int newVersion = callerMemberListVersion + 1; logger.info("Updating local member list version: " + memberMap.getVersion() + " to " + newVersion + " because of split brain merge caller: " + caller + " with member list version: " + callerMemberListVersion); MemberImpl[] members = memberMap.getMembers().toArray(new MemberImpl[0]); MemberMap newMemberMap = MemberMap.createNew(newVersion, members); setMembers(newMemberMap); sendMemberListToOthers();
MemberMap memberMap = clusterService.getMembershipManager().getMemberMap(); MembersView newMembersView = MembersView.cloneAdding(memberMap.toMembersView(), joiningMembers.values()); invokeClusterOp(op, member.getAddress()); for (MemberImpl member : memberMap.getMembers()) { if (member.localMember() || joiningMembers.containsKey(member.getAddress())) { continue;
@SuppressWarnings("unchecked") public Set<Member> getMemberSet() { return (Set) memberMapRef.get().getMembers(); }
/** * Creates clone of source {@code MemberMap}, excluding given members. * If source is empty, same map instance will be returned. If excluded members are empty or not present in * source, a new map will be created containing the same members with source. * * @param source source map * @param excludeMembers members to exclude * @return clone map */ static MemberMap cloneExcluding(MemberMap source, MemberImpl... excludeMembers) { if (source.size() == 0) { return source; } Map<Address, MemberImpl> addressMap = new LinkedHashMap<Address, MemberImpl>(source.addressToMemberMap); Map<String, MemberImpl> uuidMap = new LinkedHashMap<String, MemberImpl>(source.uuidToMemberMap); for (MemberImpl member : excludeMembers) { MemberImpl removed = addressMap.remove(member.getAddress()); if (removed != null) { uuidMap.remove(removed.getUuid()); } removed = uuidMap.remove(member.getUuid()); if (removed != null) { addressMap.remove(removed.getAddress()); } } return new MemberMap(source.version + excludeMembers.length, addressMap, uuidMap); }
private boolean shouldProcessMemberUpdate(MembersView membersView) { int memberListVersion = membershipManager.getMemberListVersion(); if (memberListVersion > membersView.getVersion()) { if (logger.isFineEnabled()) { logger.fine("Received an older member update, ignoring... Current version: " + memberListVersion + ", Received version: " + membersView.getVersion()); } return false; } if (memberListVersion == membersView.getVersion()) { if (ASSERTION_ENABLED) { MemberMap memberMap = membershipManager.getMemberMap(); Collection<Address> currentAddresses = memberMap.getAddresses(); Collection<Address> newAddresses = membersView.getAddresses(); assert currentAddresses.size() == newAddresses.size() && newAddresses.containsAll(currentAddresses) : "Member view versions are same but new member view doesn't match the current!" + " Current: " + memberMap.toMembersView() + ", New: " + membersView; } if (logger.isFineEnabled()) { logger.fine("Received a periodic member update, ignoring... Version: " + memberListVersion); } return false; } return true; }
if (currentMembers.getMember(member.getAddress(), member.getUuid()) == null) { if (logger.isFineEnabled()) { logger.fine("No need to remove " + member + ", not a member."); clusterService.getClusterHeartbeatManager().removeMember(member); MemberMap newMembers = MemberMap.cloneExcluding(currentMembers, member); setMembers(newMembers);
MemberImpl member = memberMap.getMember(target); if (member == null) { if (logger.isFineEnabled()) { MembersUpdateOp op = new MembersUpdateOp(member.getUuid(), memberMap.toMembersView(), clusterService.getClusterTime(), null, false); op.setCallerUuid(clusterService.getThisUuid());
Collection<Member> getCurrentMembersAndMembersRemovedInNotJoinableState() { clusterServiceLock.lock(); try { MemberMap membersRemovedInNotJoinableState = membersRemovedInNotJoinableStateRef.get(); if (membersRemovedInNotJoinableState.size() == 0) { return getMemberSet(); } Collection<MemberImpl> removedMembers = membersRemovedInNotJoinableState.getMembers(); Collection<MemberImpl> members = memberMapRef.get().getMembers(); Collection<Member> allMembers = new ArrayList<Member>(members.size() + removedMembers.size()); allMembers.addAll(members); allMembers.addAll(removedMembers); return allMembers; } finally { clusterServiceLock.unlock(); } }
public MemberImpl getMember(String uuid) { assert uuid != null : "UUID required!"; MemberMap memberMap = memberMapRef.get(); return memberMap.getMember(uuid); }
void shrinkMembersRemovedInNotJoinableState(Collection<String> memberUuidsToRemove) { clusterServiceLock.lock(); try { Set<MemberImpl> membersRemoved = new LinkedHashSet<MemberImpl>(membersRemovedInNotJoinableStateRef.get().getMembers()); Iterator<MemberImpl> it = membersRemoved.iterator(); while (it.hasNext()) { MemberImpl member = it.next(); if (memberUuidsToRemove.contains(member.getUuid())) { if (logger.isFineEnabled()) { logger.fine("Removing " + member + " from members removed in not joinable state."); } it.remove(); } } membersRemovedInNotJoinableStateRef.set(MemberMap.createNew(membersRemoved.toArray(new MemberImpl[0]))); } finally { clusterServiceLock.unlock(); } }
private boolean shouldAcceptMastership(MemberMap memberMap, MemberImpl candidate) { assert lock.isHeldByCurrentThread() : "Called without holding cluster service lock!"; for (MemberImpl member : memberMap.headMemberSet(candidate, false)) { if (!membershipManager.isMemberSuspected(member.getAddress())) { if (logger.isFineEnabled()) { logger.fine("Should not accept mastership claim of " + candidate + ", because " + member + " is not suspected at the moment and is before than " + candidate + " in the member list."); } return false; } } return true; }
/** * Creates an empty {@code MemberMap}. * * @return empty {@code MemberMap} */ static MemberMap empty() { return new MemberMap(0, Collections.<Address, MemberImpl>emptyMap(), Collections.<String, MemberImpl>emptyMap()); }
/** * Creates a new {@code MemberMap} including given members. * * @param members members * @return a new {@code MemberMap} */ static MemberMap createNew(MemberImpl... members) { return createNew(0, members); }