/** * Handles a cluster membership change. */ private void handleMembershipChange(ClusterMembershipEvent event) { if (event.type() == ClusterMembershipEvent.Type.MEMBER_ADDED) { bootstrap(event.subject()); } else if (event.type() == ClusterMembershipEvent.Type.MEMBER_REMOVED) { threadContext.execute(() -> { PartitionGroupMembership systemGroup = this.systemGroup; if (systemGroup != null && systemGroup.members().contains(event.subject().id())) { Set<MemberId> newMembers = Sets.newHashSet(systemGroup.members()); newMembers.remove(event.subject().id()); PartitionGroupMembership newMembership = new PartitionGroupMembership(systemGroup.group(), systemGroup.config(), ImmutableSet.copyOf(newMembers), true); this.systemGroup = newMembership; post(new PartitionGroupMembershipEvent(MEMBERS_CHANGED, newMembership)); } groups.values().forEach(group -> { if (group.members().contains(event.subject().id())) { Set<MemberId> newMembers = Sets.newHashSet(group.members()); newMembers.remove(event.subject().id()); PartitionGroupMembership newMembership = new PartitionGroupMembership(group.group(), group.config(), ImmutableSet.copyOf(newMembers), false); groups.put(group.group(), newMembership); post(new PartitionGroupMembershipEvent(MEMBERS_CHANGED, newMembership)); } }); }); } }
@SuppressWarnings("unchecked") private void handleMembershipChange(PartitionGroupMembershipEvent event) { if (partitionManagementService == null) { return; } if (!event.membership().system()) { synchronized (groups) { ManagedPartitionGroup group = groups.get(event.membership().group()); if (group == null) { group = ((PartitionGroup.Type) event.membership().config().getType()) .newPartitionGroup(event.membership().config()); groups.put(event.membership().group(), group); if (event.membership().members().contains(clusterMembershipService.getLocalMember().id())) { group.join(partitionManagementService); } else { group.connect(partitionManagementService); } } } } }
if (systemGroupMembership != null) { if (systemGroup == null) { systemGroup = ((PartitionGroup.Type) systemGroupMembership.config().getType()) .newPartitionGroup(systemGroupMembership.config()); electionService, new DefaultSessionIdService()); if (systemGroupMembership.members().contains(clusterMembershipService.getLocalMember().id())) { return systemGroup.join(managementService); } else { ManagedPartitionGroup group; synchronized (groups) { group = groups.get(membership.group()); if (group == null) { group = ((PartitionGroup.Type) membership.config().getType()) .newPartitionGroup(membership.config()); groups.put(group.name(), group); if (membership.members().contains(clusterMembershipService.getLocalMember().id())) { return group.join(partitionManagementService); } else {
@Override public PartitionGroupMembership getMembership(String group) { PartitionGroupMembership membership = groups.get(group); if (membership != null) { return membership; } return systemGroup.group().equals(group) ? systemGroup : null; }
for (MemberId memberId : membership.members()) { Member member = clusterMembershipService.getMember(memberId); if (member != null && member.isReachable()) {
this.messagingService = messagingService; this.systemGroup = systemGroup != null ? new PartitionGroupMembership( systemGroup.name(), systemGroup.config(), ImmutableSet.of(membershipService.getLocalMember().id()), true) : null; groups.forEach(group -> { this.groups.put(group.name(), new PartitionGroupMembership( group.name(), group.config(),
LOGGER.info("{} - Bootstrapped management group {} from {}", membershipService.getLocalMember().id(), systemGroup, info.memberId); } else if (systemGroup != null && info.systemGroup != null) { if (!systemGroup.group().equals(info.systemGroup.group()) || !systemGroup.config().getType().name().equals(info.systemGroup.config().getType().name())) { throw new ConfigurationException("Duplicate system group detected"); } else { Set<MemberId> newMembers = Stream.concat(systemGroup.members().stream(), info.systemGroup.members().stream()) .filter(memberId -> membershipService.getMember(memberId) != null) .collect(Collectors.toSet()); if (!Sets.difference(newMembers, systemGroup.members()).isEmpty()) { systemGroup = new PartitionGroupMembership(systemGroup.group(), systemGroup.config(), ImmutableSet.copyOf(newMembers), true); post(new PartitionGroupMembershipEvent(MEMBERS_CHANGED, systemGroup)); LOGGER.debug("{} - Updated management group {} from {}", membershipService.getLocalMember().id(), systemGroup, info.memberId); PartitionGroupMembership oldMembership = groups.get(newMembership.group()); if (oldMembership == null) { groups.put(newMembership.group(), newMembership); post(new PartitionGroupMembershipEvent(MEMBERS_CHANGED, newMembership)); LOGGER.info("{} - Bootstrapped partition group {} from {}", membershipService.getLocalMember().id(), newMembership, info.memberId); } else if (!oldMembership.group().equals(newMembership.group()) || !oldMembership.config().getType().name().equals(newMembership.config().getType().name())) { throw new ConfigurationException("Duplicate partition group " + newMembership.group() + " detected"); } else { Set<MemberId> newMembers = Stream.concat(oldMembership.members().stream(), newMembership.members().stream()) .filter(memberId -> membershipService.getMember(memberId) != null) .collect(Collectors.toSet()); if (!Sets.difference(newMembers, oldMembership.members()).isEmpty()) { PartitionGroupMembership newGroup = new PartitionGroupMembership(oldMembership.group(), oldMembership.config(), ImmutableSet.copyOf(newMembers), false); groups.put(oldMembership.group(), newGroup);
@Override public boolean isRelevant(PartitionGroupMembershipEvent event) { return event.membership().group().equals(partitionId.group()); } };