All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bigdata.quorum.QuorumMember Maven / Gradle / Ivy

/**

Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016.  All rights reserved.

Contact:
     SYSTAP, LLC DBA Blazegraph
     2501 Calvert ST NW #106
     Washington, DC 20008
     [email protected]

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
/*
 * Created on Jun 2, 2010
 */

package com.bigdata.quorum;

import java.rmi.Remote;
import java.util.UUID;
import java.util.concurrent.ExecutorService;

/**
 * A non-remote interface for a service which will participate in a quorum as a
 * member service (as opposed to a client service that merely watches the
 * quorum). The methods on this interface are aware of the service {@link UUID}
 * of the member service and can report on its role and relationships in the
 * {@link Quorum}. In order to act on the distributed quorum state, the
 * {@link QuorumMember} will issue various commands to its {@link QuorumActor}.
 * 

* This interface defines a collection of messages which are used to inform the * {@link QuorumMember} of significant changes in the distributed quorum state * as it pertains to this quorum member. See {@link QuorumStateChangeListener}. * * @author Bryan Thompson * @version $Id$ */ public interface QuorumMember extends QuorumClient, QuorumStateChangeListener { /** * The identifier for this service (the quorum member). Each quorum member * is a physical service instance of some highly available logical service. * * @see QuorumClient#getLogicalServiceZPath() */ UUID getServiceId(); /** * Return the local service implementation object (NOT the RMI proxy for * that object). *

* A service operating as a {@link QuorumMember} has both {@link Remote} * interface and a non-remote interface. These interfaces typically define * similar methods (for example, compare {@link com.bigdata.ha.HACommitGlue}, which is * {@link Remote}, with {@link QuorumCommit}, which is non-remote). The * {@link Remote} interface in turn will have a local implementation object * inside of the JVM and an exported proxy for that {@link Remote} * interface. This method returns the local implementation object * for the {@link Remote} interface and is intended to facilitate operations * which the {@link QuorumMember} executes against its own {@link Remote} * interface. While the {@link Remote} interface will be exposed to other * services using a proxy, how that happens is outside of the scope of this * method. */ S getService(); /** * An {@link ExecutorService} which may be used by the {@link QuorumMember} * to run various asynchronous tasks. */ ExecutorService getExecutor(); /** * Return the actor for this {@link QuorumMember}. */ QuorumActor> getActor(); /** * Return trueif the quorum recognizes the service as a member * of that quorum. The quorum token is not required for this method because * membership status does not change with a quorum meet or break. */ boolean isMember(); /** * Return true if quorum recognizes the service is part of the * write pipeline. The quorum token is not required for this method because * pipeline status does not change with a quorum meet or break. Once a * service is receiving synchronous messages from a {@link Quorum} it will * notice when it enters and leaves the pipeline and when the downstream * service for this service changes in the quorum. */ boolean isPipelineMember(); /** * Return true iff the quorum is highly available and this * node is last one in the write pipeline (it will not return true for a * singleton quorum where the only node is the master). * * @param token * The quorum token for which the request was made. */ boolean isLastInChain(long token); /** * Return true if the service is joined with the quorum. *

* Note: This method DOES NOT throw an exception if the quorum is not met, * but it will not return true unless the quorum is met. * * @param token * The quorum token for which the request was made. */ boolean isJoinedMember(long token); /** * Return true iff this node is the quorum leader. The * quorum leader is the only node which will accept writes. Note that is * always true when the {@link #replicationFactor()} is ONE * (1). * * @param token * The quorum token for which the request was made. */ boolean isLeader(long token); /** * Return true iff this node is a quorum follower. This is * true of all nodes in a {@link Q} except for the leader. * * @param token * The quorum token for which the request was made. */ boolean isFollower(long token); /** * Assert that this is the quorum leader. * * @param token * The quorum token for which the request was made. * @throws QuorumException * if the quorum is not met * @throws QuorumException * if the caller's token is not the current quorum token. * @throws QuorumException * if this is not the quorum leader. */ void assertLeader(final long token); /** * Return the {@link UUID} of the service (if any) downstream from this * service in the write pipeline. * * @return The UUID of the downstream service in the write pipeline. This * will return null for services which are not part of * the write pipeline, for the leader, and for the last service in * the write pipeline. * * @return null if there is no downstream service. * * @throws QuorumException * if the quorum token is no longer valid. */ UUID getDownstreamServiceId(); }