docs: public boolean addMember(long commitIndex, CPMemberInfo member) {
          checkNotNull(member);
          checkMetadataGroupInitSuccessful();
  
          for (CPMemberInfo existingMember : activeMembers) {
              if (existingMember.getAddress().equals(member.getAddress())) {
                  if (existingMember.getUuid().equals(member.getUuid())) {
                      if (logger.isFineEnabled()) {
                          logger.fine(member + " already exists.");
                      }
  
                      if (membershipChangeSchedule != null && member.equals(membershipChangeSchedule.getAddedMember())) {
                          membershipChangeSchedule = membershipChangeSchedule.addRetriedCommitIndex(commitIndex);
                          logger.info("CP groups are already being rebalanced for " + member);
                          return false;
                      }
  
                      return true;
                  }
  
                  throw new IllegalStateException(member + " cannot be added to the CP subsystem because another " + existingMember
                          + " exists with the same address!");
              }
          }
  
          checkState(membershipChangeSchedule == null,
                  "Cannot rebalance CP groups because there is ongoing " + membershipChangeSchedule);
  
          Collection<CPMemberInfo> newMembers = new LinkedHashSet<>(activeMembers);
          newMembers.add(member);
          doSetActiveMembers(commitIndex, newMembers);
          logger.info("Added new " + member + ". New active CP members list: " + newMembers);
  
          List<CPGroupMembershipChange> changes = getGroupMembershipChangesForNewMember(member);
          if (changes.size() > 0) {
              membershipChangeSchedule = MembershipChangeSchedule.forJoiningMember(singletonList(commitIndex), member, changes);
              if (logger.isFineEnabled()) {
                  logger.fine("CP group rebalancing is triggered for " + member + ", changes: " + membershipChangeSchedule);
              }
  
              return false;
          }
  
          return true;
      }