/** Checks if two views have the same members regardless of order. E.g. {A,B,C} and {B,A,C} returns true */ public static boolean sameMembers(View v1, View v2) { if(v1 == v2) return true; if(v1.size() != v2.size()) return false; Address[][] diff=diff(v1, v2); return diff[0].length == 0 && diff[1].length == 0; }
protected static View createDeltaView(final View current_view, final View next_view) { final ViewId current_view_id=current_view.getViewId(); final ViewId next_view_id=next_view.getViewId(); Address[][] diff=View.diff(current_view, next_view); return new DeltaView(next_view_id, current_view_id, diff[1], diff[0]); }
protected void handleView(View new_view, View old_view, boolean coord_changed) { if(is_coord) { if(coord_changed) { if(remove_all_data_on_view_change) removeAll(cluster_name); else if(remove_old_coords_on_view_change) { Address old_coord=old_view != null? old_view.getCreator() : null; if(old_coord != null) remove(cluster_name, old_coord); } } Address[] left=View.diff(old_view, new_view)[1]; if(coord_changed || update_store_on_view_change || left.length > 0) { writeAll(left); if(remove_all_data_on_view_change || remove_old_coords_on_view_change) startInfoWriter(); } } else if(coord_changed) // I'm no longer the coordinator remove(cluster_name, local_addr); }
/** Checks if two views have the same members regardless of order. E.g. {A,B,C} and {B,A,C} returns true */ public static boolean sameMembers(View v1, View v2) { if(v1 == v2) return true; if(v1.size() != v2.size()) return false; Address[][] diff=diff(v1, v2); return diff[0].length == 0 && diff[1].length == 0; }
protected static View createDeltaView(final View current_view, final View next_view) { final ViewId current_view_id=current_view.getViewId(); final ViewId next_view_id=next_view.getViewId(); Address[][] diff=View.diff(current_view, next_view); return new DeltaView(next_view_id, current_view_id, diff[1], diff[0]); }
@Override public synchronized void viewAccepted(final View view) { if (currentView == null) { currentView = view; logger.info("Local segment ({}) joined the cluster. Broadcasting configuration.", channel.getAddress()); try { broadCastMembership(membershipVersion.get(), true); joinedCondition.markJoined(); } catch (Exception e) { throw new MembershipUpdateFailedException("Failed to broadcast my settings", e); } } else if (!view.equals(currentView)) { Address[][] diff = View.diff(currentView, view); Address[] joined = diff[0]; Address[] left = diff[1]; currentView = view; Address localAddress = channel.getAddress(); stream(left).forEach(lm -> updateConsistentHash(ch -> { VersionedMember member = members.get(lm); if (member == null) { return ch; } return ch.without(member); })); stream(left).forEach(members::remove); stream(joined).filter(member -> !member.equals(localAddress)) .forEach(member -> sendMyConfigurationTo(member, true, membershipVersion.get())); } currentView = view; }
@Override public synchronized void viewAccepted(final View view) { if (currentView == null) { currentView = view; logger.info("Local segment ({}) joined the cluster. Broadcasting configuration.", channel.getAddress()); try { broadCastMembership(membershipVersion.get(), true); joinedCondition.markJoined(); } catch (Exception e) { throw new MembershipUpdateFailedException("Failed to broadcast my settings", e); } } else if (!view.equals(currentView)) { Address[][] diff = View.diff(currentView, view); Address[] joined = diff[0]; Address[] left = diff[1]; currentView = view; Address localAddress = channel.getAddress(); stream(left).forEach(lm -> updateConsistentHash(ch -> { VersionedMember member = members.get(lm); if (member == null) { return ch; } return ch.without(member); })); stream(left).forEach(members::remove); stream(joined).filter(member -> !member.equals(localAddress)) .forEach(member -> sendMyConfigurationTo(member, true, membershipVersion.get())); } currentView = view; }
protected void handleView(View new_view, View old_view, boolean coord_changed) { if(is_coord) { if(coord_changed) { if(remove_all_data_on_view_change) removeAll(cluster_name); else if(remove_old_coords_on_view_change) { Address old_coord=old_view != null? old_view.getCreator() : null; if(old_coord != null) remove(cluster_name, old_coord); } } Address[] left=View.diff(old_view, new_view)[1]; if(coord_changed || update_store_on_view_change || left.length > 0) { writeAll(left); if(remove_all_data_on_view_change || remove_old_coords_on_view_change) startInfoWriter(); } } else if(coord_changed) // I'm no longer the coordinator remove(cluster_name, local_addr); }