Search in sources :

Example 11 with Membership

use of org.apache.catalina.tribes.membership.Membership in project tomcat by apache.

the class NonBlockingCoordinator method start.

// ============================================================================================================
// OVERRIDDEN METHODS FROM CHANNEL INTERCEPTOR BASE
// ============================================================================================================
@Override
public void start(int svc) throws ChannelException {
    if (membership == null) {
        setupMembership();
    }
    if (started) {
        return;
    }
    fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_START, this, "Before start"));
    super.start(startsvc);
    started = true;
    if (view == null) {
        view = new Membership(super.getLocalMember(true), AbsoluteOrder.comp, true);
    }
    fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_START, this, "After start"));
    startElection(false);
}
Also used : Membership(org.apache.catalina.tribes.membership.Membership)

Example 12 with Membership

use of org.apache.catalina.tribes.membership.Membership in project tomcat by apache.

the class NonBlockingCoordinator method startElection.

// ============================================================================================================
// COORDINATION HANDLING
// ============================================================================================================
public void startElection(boolean force) throws ChannelException {
    synchronized (electionMutex) {
        Member local = getLocalMember(false);
        Member[] others = membership.getMembers();
        fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_START_ELECT, this, "Election initiated"));
        if (others.length == 0) {
            this.viewId = new UniqueId(UUIDGenerator.randomUUID(false));
            this.view = new Membership(local, AbsoluteOrder.comp, true);
            this.handleViewConf(createElectionMsg(local, others, local), view);
            // the only member, no need for an election
            return;
        }
        if (suggestedviewId != null) {
            if (view != null && Arrays.diff(view, suggestedView, local).length == 0 && Arrays.diff(suggestedView, view, local).length == 0) {
                suggestedviewId = null;
                suggestedView = null;
                fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_ELECT_ABANDONED, this, "Election abandoned, running election matches view"));
            } else {
                fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_ELECT_ABANDONED, this, "Election abandoned, election running"));
            }
            // election already running, I'm not allowed to have two of them
            return;
        }
        if (view != null && Arrays.diff(view, membership, local).length == 0 && Arrays.diff(membership, view, local).length == 0) {
            fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_ELECT_ABANDONED, this, "Election abandoned, view matches membership"));
            // already have this view installed
            return;
        }
        int prio = AbsoluteOrder.comp.compare(local, others[0]);
        // am I the leader in my view?
        Member leader = (prio < 0) ? local : others[0];
        if (local.equals(leader) || force) {
            CoordinationMessage msg = createElectionMsg(local, others, leader);
            suggestedviewId = msg.getId();
            suggestedView = new Membership(local, AbsoluteOrder.comp, true);
            Arrays.fill(suggestedView, msg.getMembers());
            fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_PROCESS_ELECT, this, "Election, sending request"));
            sendElectionMsg(local, others[0], msg);
        } else {
            try {
                coordMsgReceived.set(false);
                fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_WAIT_FOR_MSG, this, "Election, waiting for request"));
                electionMutex.wait(waitForCoordMsgTimeout);
            } catch (InterruptedException x) {
                Thread.currentThread().interrupt();
            }
            String msg;
            if (suggestedviewId == null && !coordMsgReceived.get()) {
                if (Thread.interrupted()) {
                    msg = "Election abandoned, waiting interrupted.";
                } else {
                    msg = "Election abandoned, waiting timed out.";
                }
            } else {
                msg = "Election abandoned, received a message";
            }
            fireInterceptorEvent(new CoordinationEvent(CoordinationEvent.EVT_ELECT_ABANDONED, this, msg));
        }
    }
}
Also used : UniqueId(org.apache.catalina.tribes.UniqueId) Membership(org.apache.catalina.tribes.membership.Membership) Member(org.apache.catalina.tribes.Member)

Aggregations

Membership (org.apache.catalina.tribes.membership.Membership)12 Member (org.apache.catalina.tribes.Member)4 UniqueId (org.apache.catalina.tribes.UniqueId)4 MemberImpl (org.apache.catalina.tribes.membership.MemberImpl)4