@Override public PartitionGroupMembership getMembership(String group) { PartitionGroupMembership membership = groups.get(group); if (membership != null) { return membership; } return systemGroup.group().equals(group) ? systemGroup : null; }
@Override public String toString() { return toStringHelper(this) .add("group", group()) .add("members", members()) .toString(); } }
@Override public boolean isRelevant(PartitionGroupMembershipEvent event) { return event.membership().group().equals(partitionId.group()); } };
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"); .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()) .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); post(new PartitionGroupMembershipEvent(MEMBERS_CHANGED, newGroup)); LOGGER.debug("{} - Updated partition group {} from {}", membershipService.getLocalMember().id(), newGroup, info.memberId);
/** * 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); } } } } }
ManagedPartitionGroup group; synchronized (groups) { group = groups.get(membership.group()); if (group == null) { group = ((PartitionGroup.Type) membership.config().getType())