protected void handleMyToken(MemberImpl local, CoordinationMessage msg, Member sender,Membership merged) throws ChannelException { if ( local.equals(msg.getLeader()) ) { //no leadership change if ( Arrays.sameMembers(msg.getMembers(),merged.getMembers()) ) { msg.type = COORD_CONF; super.sendMessage(Arrays.remove(msg.getMembers(),local),createData(msg,local),null); handleViewConf(msg,local,merged); } else { //membership change suggestedView = new Membership(local,AbsoluteOrder.comp,true); suggestedviewId = msg.getId(); Arrays.fill(suggestedView,merged.getMembers()); msg.view = merged.getMembers(); sendElectionMsgToNextInline(local,msg); } } else { //leadership change suggestedView = null; suggestedviewId = null; msg.view = merged.getMembers(); sendElectionMsgToNextInline(local,msg); } }
protected void handleViewConf(CoordinationMessage msg, Member sender,Membership merged) throws ChannelException { if ( viewId != null && msg.getId().equals(viewId) ) return;//we already have this view view = new Membership((MemberImpl)getLocalMember(false),AbsoluteOrder.comp,true); Arrays.fill(view,msg.getMembers()); viewId = msg.getId(); if ( viewId.equals(suggestedviewId) ) { suggestedView = null; suggestedviewId = null; } if (suggestedView != null && AbsoluteOrder.comp.compare(suggestedView.getMembers()[0],merged.getMembers()[0])<0 ) { suggestedView = null; suggestedviewId = null; } viewChange(viewId,view.getMembers()); fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_CONF_RX,this,"Accepted View")); if ( suggestedviewId == null && hasHigherPriority(merged.getMembers(),membership.getMembers()) ) { startElection(false); } }
protected Membership mergeOnArrive(CoordinationMessage msg, Member sender) { fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_PRE_MERGE, this, "Pre merge")); MemberImpl local = (MemberImpl) getLocalMember(false); Membership merged = new Membership(local, AbsoluteOrder.comp, true); Arrays.fill(merged, msg.getMembers()); Arrays.fill(merged, getMembers()); Member[] diff = Arrays.diff(merged, membership, local); for (int i = 0; i < diff.length; i++) { if (!alive(diff[i])) merged.removeMember((MemberImpl) diff[i]); else memberAdded(diff[i], false); } fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_POST_MERGE, this, "Post merge")); return merged; }
protected void handleMyToken(MemberImpl local, CoordinationMessage msg, Member sender, Membership merged) throws ChannelException { if (local.equals(msg.getLeader())) { // no leadership change if (Arrays.sameMembers(msg.getMembers(), merged.getMembers())) { msg.type = COORD_CONF; super.sendMessage(Arrays.remove(msg.getMembers(), local), createData(msg, local), null); handleViewConf(msg, local, merged); } else { // membership change suggestedView = new Membership(local, AbsoluteOrder.comp, true); suggestedviewId = msg.getId(); Arrays.fill(suggestedView, merged.getMembers()); msg.view = merged.getMembers(); sendElectionMsgToNextInline(local, msg); } } else { // leadership change suggestedView = null; suggestedviewId = null; msg.view = merged.getMembers(); sendElectionMsgToNextInline(local, msg); } }
protected void handleViewConf(CoordinationMessage msg, Member sender, Membership merged) throws ChannelException { if (viewId != null && msg.getId().equals(viewId)) return;// we already have this view view = new Membership((MemberImpl) getLocalMember(false), AbsoluteOrder.comp, true); Arrays.fill(view, msg.getMembers()); viewId = msg.getId(); if (viewId.equals(suggestedviewId)) { suggestedView = null; suggestedviewId = null; } if (suggestedView != null && AbsoluteOrder.comp.compare(suggestedView.getMembers()[0], merged.getMembers()[0]) < 0) { suggestedView = null; suggestedviewId = null; } viewChange(viewId, view.getMembers()); fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_CONF_RX, this, "Accepted View")); if (suggestedviewId == null && hasHigherPriority(merged.getMembers(), membership.getMembers())) { startElection(false); } }
/** * Get all current cluster members * * @return all members or empty array */ @Override public Member[] getMembers() { if (members.size() == 0) return super.getMembers(); else { synchronized (members) { Member[] others = super.getMembers(); Member[] result = new Member[members.size() + others.length]; for (int i = 0; i < others.length; i++) result[i] = others[i]; for (int i = 0; i < members.size(); i++) result[i + others.length] = members.get(i); AbsoluteOrder.absoluteOrder(result); return result; } // sync } // end if }
private CoordinationMessage createElectionMsg(MemberImpl local, MemberImpl[] others, MemberImpl leader) { Membership m = new Membership(local,AbsoluteOrder.comp,true); Arrays.fill(m,others); MemberImpl[] mbrs = m.getMembers(); m.reset(); CoordinationMessage msg = new CoordinationMessage(leader, local, mbrs,new UniqueId(UUIDGenerator.randomUUID(true)), COORD_REQUEST); return msg; }
protected Membership mergeOnArrive(CoordinationMessage msg, Member sender) { fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_PRE_MERGE,this,"Pre merge")); MemberImpl local = (MemberImpl)getLocalMember(false); Membership merged = new Membership(local,AbsoluteOrder.comp,true); Arrays.fill(merged,msg.getMembers()); Arrays.fill(merged,getMembers()); Member[] diff = Arrays.diff(merged,membership,local); for ( int i=0; i<diff.length; i++ ) { if (!alive(diff[i])) merged.removeMember((MemberImpl)diff[i]); else memberAdded(diff[i],false); } fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_POST_MERGE,this,"Post merge")); return merged; }
protected boolean hasHigherPriority(Member[] complete, Member[] local) { if ( local == null || local.length == 0 ) return false; if ( complete == null || complete.length == 0 ) return true; AbsoluteOrder.absoluteOrder(complete); AbsoluteOrder.absoluteOrder(local); return (AbsoluteOrder.comp.compare(complete[0],local[0]) > 0); }
/** * Get all current cluster members * @return all members or empty array */ @Override public Member[] getMembers() { if ( members.size() == 0 ) return super.getMembers(); else { synchronized (members) { Member[] others = super.getMembers(); Member[] result = new Member[members.size() + others.length]; for (int i = 0; i < others.length; i++) result[i] = others[i]; for (int i = 0; i < members.size(); i++) result[i + others.length] = members.get(i); AbsoluteOrder.absoluteOrder(result); return result; }//sync }//end if }
private void installViewWhenStable() { int stableCount = 0; while (stableCount < 10) { if (membershipChanged.compareAndSet(true, false)) { stableCount = 0; } else { stableCount++; } try { TimeUnit.MILLISECONDS.sleep(250); } catch (final InterruptedException e) { Thread.currentThread().interrupt(); } } final Member[] members = getMembers(); final Member[] view = new Member[members.length+1]; System.arraycopy(members, 0, view, 0, members.length); view[members.length] = getLocalMember(false); Arrays.sort(view, AbsoluteOrder.comp); if (Arrays.equals(view, this.view)) { return; } this.view = view; viewChange(view); }
public static Member[] merge(Member[] m1, Member[] m2) { AbsoluteOrder.absoluteOrder(m1); AbsoluteOrder.absoluteOrder(m2); ArrayList<Member> list = new ArrayList<Member>(java.util.Arrays.asList(m1)); for (int i=0; i<m2.length; i++) if ( !list.contains(m2[i]) ) list.add(m2[i]); Member[] result = new Member[list.size()]; list.toArray(result); AbsoluteOrder.absoluteOrder(result); return result; }
private CoordinationMessage createElectionMsg(MemberImpl local, MemberImpl[] others, MemberImpl leader) { Membership m = new Membership(local, AbsoluteOrder.comp, true); Arrays.fill(m, others); MemberImpl[] mbrs = m.getMembers(); m.reset(); CoordinationMessage msg = new CoordinationMessage(leader, local, mbrs, new UniqueId(UUIDGenerator.randomUUID(true)), COORD_REQUEST); return msg; }
protected boolean hasHigherPriority(Member[] complete, Member[] local) { if (local == null || local.length == 0) return false; if (complete == null || complete.length == 0) return true; AbsoluteOrder.absoluteOrder(complete); AbsoluteOrder.absoluteOrder(local); return (AbsoluteOrder.comp.compare(complete[0], local[0]) > 0); }
public boolean isHighest() { Member local = getLocalMember(false); if (membership.getMembers().length == 0) return true; else return AbsoluteOrder.comp.compare(local, membership.getMembers()[0]) <= 0; }
private void installViewWhenStable() { int stableCount = 0; while (stableCount < 10) { if (membershipChanged.compareAndSet(true, false)) { stableCount = 0; } else { stableCount++; } try { TimeUnit.MILLISECONDS.sleep(250); } catch (final InterruptedException e) { Thread.currentThread().interrupt(); } } final Member[] members = getMembers(); final Member[] view = new Member[members.length + 1]; System.arraycopy(members, 0, view, 0, members.length); view[members.length] = getLocalMember(false); Arrays.sort(view, AbsoluteOrder.comp); if (Arrays.equals(view, this.view)) { return; } this.view = view; viewChange(view); }
public static Member[] merge(Member[] m1, Member[] m2) { AbsoluteOrder.absoluteOrder(m1); AbsoluteOrder.absoluteOrder(m2); ArrayList<Member> list = new ArrayList<Member>(java.util.Arrays.asList(m1)); for (int i = 0; i < m2.length; i++) if (!list.contains(m2[i])) list.add(m2[i]); Member[] result = new Member[list.size()]; list.toArray(result); AbsoluteOrder.absoluteOrder(result); return result; }