/** * Best effort to find a view in past that contains <code>member</code>. * * Returns previous view if none of <code>MAX_VIEWS_IN_PAST</code> views contain member. * MASTER_CHANGE_EVENTS can cause a recently failed instance to not be in a view. * This is a partial fix for shoal issue 83. * * @param member return a past view that contains member * @return a view containing member or just return previous view if non of MAX_VIEWS_IN_PAST contain member. */ private List<GMSMember> getPreviousViewContaining(String member) { final int MAX_VIEWS_IN_PAST = 10; List <GMSMember> found = getPreviousView(); // may not contain member but better than returning null. for (int i = 2; ((i < (2 + MAX_VIEWS_IN_PAST)) && ((views.size() - i) >= 0)); i++) { List<GMSMember> current = views.get(views.size() - i); if (viewContains(current, member)) { found = current; break; } } return found; }
/** * Best effort to find a view in past that contains <code>member</code>. * * Returns previous view if none of <code>MAX_VIEWS_IN_PAST</code> views contain member. * MASTER_CHANGE_EVENTS can cause a recently failed instance to not be in a view. * This is a partial fix for shoal issue 83. * * @param member return a past view that contains member * @return a view containing member or just return previous view if non of MAX_VIEWS_IN_PAST contain member. */ private List<GMSMember> getPreviousViewContaining(String member) { final int MAX_VIEWS_IN_PAST = 10; List <GMSMember> found = getPreviousView(); // may not contain member but better than returning null. for (int i = 2; ((i < (2 + MAX_VIEWS_IN_PAST)) && ((views.size() - i) >= 0)); i++) { List<GMSMember> current = views.get(views.size() - i); if (viewContains(current, member)) { found = current; break; } } return found; }
private void addGroupLeadershipNotificationSignal( final String token, final String groupName, final long startTime ) { logger.log( Level.INFO, "view.window.groupleader.notify", new Object[]{token,groupName}); signals.add( new GroupLeadershipNotificationSignalImpl( token, getPreviousView(), getCurrentView(), getCurrentCoreMembers(), getAllCurrentMembers(), groupName, startTime ) ); }
private void addGroupLeadershipNotificationSignal( final String token, final String groupName, final long startTime ) { logger.log( Level.INFO, "view.window.groupleader.notify", new Object[]{token,groupName}); signals.add( new GroupLeadershipNotificationSignalImpl( token, getPreviousView(), getCurrentView(), getCurrentCoreMembers(), getAllCurrentMembers(), groupName, startTime ) ); }
private void determineAndAddNewMemberJoins() { final List<GMSMember> newMembership = getCurrentView(); String token; if (views.size() == 1) { if (newMembership.size() > 1) { for (GMSMember member : newMembership) { token = member.getMemberToken(); if (!token.equals(getGMSContext().getServerIdentityToken())) { syncDSC(token); } if (member.getMemberType().equalsIgnoreCase(CORETYPE)) { addJoinNotificationSignal(token, member.getGroupName(), member.getStartTime()); } } } } else if (views.size() > 1) { final List<String> oldMembers = getTokens(getPreviousView()); for (GMSMember member : newMembership) { token = member.getMemberToken(); if (!oldMembers.contains(token)) { syncDSC(token); if (member.getMemberType().equalsIgnoreCase(CORETYPE)) { addJoinNotificationSignal(token, member.getGroupName(), member.getStartTime()); } } } } }
private void determineAndAddNewMemberJoins() { final List<GMSMember> newMembership = getCurrentView(); String token; if (views.size() == 1) { if (newMembership.size() > 1) { for (GMSMember member : newMembership) { token = member.getMemberToken(); if (!token.equals(getGMSContext().getServerIdentityToken())) { syncDSC(token); } if (member.getMemberType().equalsIgnoreCase(CORETYPE)) { addJoinNotificationSignal(token, member.getGroupName(), member.getStartTime()); } } } } else if (views.size() > 1) { final List<String> oldMembers = getTokens(getPreviousView()); for (GMSMember member : newMembership) { token = member.getMemberToken(); if (!oldMembers.contains(token)) { syncDSC(token); if (member.getMemberType().equalsIgnoreCase(CORETYPE)) { addJoinNotificationSignal(token, member.getGroupName(), member.getStartTime()); } } } } }
private void analyzeMasterChangeView(final EventPacket packet) { final SystemAdvertisement advert = packet.getSystemAdvertisement(); final GMSMember member = Utility.getGMSMember( advert ); final String token = member.getMemberToken(); if ( !this.getGMSContext().isWatchdog() ) { addGroupLeadershipNotificationSignal( token, member.getGroupName(), member.getStartTime() ); } if (views.size() == 1 && ! getGMSContext().getGroupCommunicationProvider().isDiscoveryInProgress()) { //views list only contains 1 view which is assumed to be the 1st view. addNewMemberJoins(packet); } if (views.size() > 1 && packet.getClusterView().getSize() != getPreviousView().size()) { determineAndAddNewMemberJoins(); } }
private void analyzeMasterChangeView(final EventPacket packet) { final SystemAdvertisement advert = packet.getSystemAdvertisement(); final GMSMember member = Utility.getGMSMember( advert ); final String token = member.getMemberToken(); if ( !this.getGMSContext().isWatchdog() ) { addGroupLeadershipNotificationSignal( token, member.getGroupName(), member.getStartTime() ); } if (views.size() == 1 && ! getGMSContext().getGroupCommunicationProvider().isDiscoveryInProgress()) { //views list only contains 1 view which is assumed to be the 1st view. addNewMemberJoins(packet); } if (views.size() > 1 && packet.getClusterView().getSize() != getPreviousView().size()) { determineAndAddNewMemberJoins(); } }
private void addNewMemberJoins(final EventPacket packet) { final SystemAdvertisement advert = packet.getSystemAdvertisement(); final GMSMember member = Utility.getGMSMember(advert); final String token = member.getMemberToken(); final List<String> oldMembers = getTokens(getPreviousView()); RejoinSubevent rjse = getGMSContext().getInstanceRejoins().get(packet.getSystemAdvertisement().getName()); if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "addNewMemberJoins: member: " + member + " joined group time:" + new Date(Utility.getStartTime(advert)) + " rejoin subevent=" + rjse); } // Series of checks needed to avoid duplicate ADD messages. // This conditional was added to avoid duplicate ADD events caused // by GroupLeaderShip change notifications. // The coordinator handles ADD event differently than all other members. // Lastly, this instance is always added to view so let ADD event through w/o check for this instance. if (isCoordinator() || ! oldMembers.contains(token) || rjse != null || token.compareTo(getGMSContext().getServerIdentityToken()) == 0) { if (packet.getClusterView().getSize() > 1) { // TODO: Figure out a better way to sync syncDSC(advert.getID()); } if (member.isCore()) { addJoinNotificationSignal(token, member.getGroupName(), member.getStartTime()); } } }
private void addNewMemberJoins(final EventPacket packet) { final SystemAdvertisement advert = packet.getSystemAdvertisement(); final GMSMember member = Utility.getGMSMember(advert); final String token = member.getMemberToken(); final List<String> oldMembers = getTokens(getPreviousView()); RejoinSubevent rjse = getGMSContext().getInstanceRejoins().get(packet.getSystemAdvertisement().getName()); if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "addNewMemberJoins: member: " + member + " joined group time:" + new Date(Utility.getStartTime(advert)) + " rejoin subevent=" + rjse); } // Series of checks needed to avoid duplicate ADD messages. // This conditional was added to avoid duplicate ADD events caused // by GroupLeaderShip change notifications. // The coordinator handles ADD event differently than all other members. // Lastly, this instance is always added to view so let ADD event through w/o check for this instance. if (isCoordinator() || ! oldMembers.contains(token) || rjse != null || token.compareTo(getGMSContext().getServerIdentityToken()) == 0) { if (packet.getClusterView().getSize() > 1) { // TODO: Figure out a better way to sync syncDSC(advert.getID()); } if (member.isCore()) { addJoinNotificationSignal(token, member.getGroupName(), member.getStartTime()); } } }