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

com.alipay.sofa.jraft.Node Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alipay.sofa.jraft;

import java.util.List;

import com.alipay.sofa.jraft.closure.ReadIndexClosure;
import com.alipay.sofa.jraft.conf.Configuration;
import com.alipay.sofa.jraft.core.NodeMetrics;
import com.alipay.sofa.jraft.core.Replicator;
import com.alipay.sofa.jraft.entity.NodeId;
import com.alipay.sofa.jraft.entity.PeerId;
import com.alipay.sofa.jraft.entity.Task;
import com.alipay.sofa.jraft.entity.UserLog;
import com.alipay.sofa.jraft.error.LogIndexOutOfBoundsException;
import com.alipay.sofa.jraft.error.LogNotFoundException;
import com.alipay.sofa.jraft.option.NodeOptions;
import com.alipay.sofa.jraft.option.RaftOptions;
import com.alipay.sofa.jraft.util.Describer;

/**
 * A raft replica node.
 *
 * @author boyan ([email protected])
 *
 * 2018-Apr-03 4:06:55 PM
 */
public interface Node extends Lifecycle, Describer {

    /**
     * Get the leader peer id for redirect, null if absent.
     */
    PeerId getLeaderId();

    /**
     * Get current node id.
     */
    NodeId getNodeId();

    /**
     * Get the node metrics, only valid when node option {@link NodeOptions#isEnableMetrics()} is true.
     */
    NodeMetrics getNodeMetrics();

    /**
     * Get the raft group id.
     */
    String getGroupId();

    /**
     * Get the node options.
     */
    NodeOptions getOptions();

    /**
     * Get the raft options
     */
    RaftOptions getRaftOptions();

    /**
     * Returns true when the node is leader.
     */
    boolean isLeader();

    /**
     * Shutdown local replica node.
     *
     * @param done callback
     */
    void shutdown(final Closure done);

    /**
     * Block the thread until the node is successfully stopped.
     *
     * @throws InterruptedException if the current thread is interrupted
     *         while waiting
     */
    void join() throws InterruptedException;

    /**
     * [Thread-safe and wait-free]
     *
     * Apply task to the replicated-state-machine
     *
     * About the ownership:
     * |task.data|: for the performance consideration, we will take away the
     *               content. If you want keep the content, copy it before call
     *               this function
     * |task.done|: If the data is successfully committed to the raft group. We
     *              will pass the ownership to #{@link StateMachine#onApply(Iterator)}.
     *              Otherwise we will specify the error and call it.
     *
     * @param task task to apply
     */
    void apply(final Task task);

    /**
     * [Thread-safe and wait-free]
     *
     * Starts a linearizable read-only query request with request context(optional,
     * such as request id etc.) and closure.  The closure will be called when the
     * request is completed, and user can read data from state machine if the result
     * status is OK.
     *
     * @param requestContext the context of request
     * @param done           callback
     *
     * @since 0.0.3
     */
    void readIndex(final byte[] requestContext, final ReadIndexClosure done);

    /**
     * List peers of this raft group, only leader returns.
     *
     * [NOTE] when list_peers concurrency with {@link #addPeer(PeerId, Closure)}/{@link #removePeer(PeerId, Closure)},
     * maybe return peers is staled.  Because {@link #addPeer(PeerId, Closure)}/{@link #removePeer(PeerId, Closure)}
     * immediately modify configuration in memory
     *
     * @return the peer list
     */
    List listPeers();

    /**
     * List all alive peers of this raft group, only leader returns.

* * [NOTE] list_alive_peers is just a transient data (snapshot) * and a short-term loss of response by the follower will cause it to * temporarily not exist in this list. * * @return the alive peer list * @since 1.2.6 */ List listAlivePeers(); /** * List all learners of this raft group, only leader returns.

* * [NOTE] when listLearners concurrency with {@link #addLearners(List, Closure)}/{@link #removeLearners(List, Closure)}/{@link #resetLearners(List, Closure)}, * maybe return peers is staled. Because {@link #addLearners(List, Closure)}/{@link #removeLearners(List, Closure)}/{@link #resetLearners(List, Closure)} * immediately modify configuration in memory * * @return the learners set * @since 1.3.0 */ List listLearners(); /** * List all alive learners of this raft group, only leader returns.

* * [NOTE] when listAliveLearners concurrency with {@link #addLearners(List, Closure)}/{@link #removeLearners(List, Closure)}/{@link #resetLearners(List, Closure)}, * maybe return peers is staled. Because {@link #addLearners(List, Closure)}/{@link #removeLearners(List, Closure)}/{@link #resetLearners(List, Closure)} * immediately modify configuration in memory * * @return the alive learners set * @since 1.3.0 */ List listAliveLearners(); /** * Add a new peer to the raft group. done.run() would be invoked after this * operation finishes, describing the detailed result. * * @param peer peer to add * @param done callback */ void addPeer(final PeerId peer, final Closure done); /** * Remove the peer from the raft group. done.run() would be invoked after * operation finishes, describing the detailed result. * * @param peer peer to remove * @param done callback */ void removePeer(final PeerId peer, final Closure done); /** * Change the configuration of the raft group to |newPeers| , done.un() * would be invoked after this operation finishes, describing the detailed result. * * @param newPeers new peers to change * @param done callback */ void changePeers(final Configuration newPeers, final Closure done); /** * Reset the configuration of this node individually, without any replication * to other peers before this node becomes the leader. This function is * supposed to be invoked when the majority of the replication group are * dead and you'd like to revive the service in the consideration of * availability. * Notice that neither consistency nor consensus are guaranteed in this * case, BE CAREFULE when dealing with this method. * * @param newPeers new peers */ Status resetPeers(final Configuration newPeers); /** * Add some new learners to the raft group. done.run() will be invoked after this * operation finishes, describing the detailed result. * * @param learners learners to add * @param done callback * @since 1.3.0 */ void addLearners(final List learners, final Closure done); /** * Remove some learners from the raft group. done.run() will be invoked after this * operation finishes, describing the detailed result. * * @param learners learners to remove * @param done callback * @since 1.3.0 */ void removeLearners(final List learners, final Closure done); /** * Reset learners in the raft group. done.run() will be invoked after this * operation finishes, describing the detailed result. * * @param learners learners to set * @param done callback * @since 1.3.0 */ void resetLearners(final List learners, final Closure done); /** * Start a snapshot immediately if possible. done.run() would be invoked when * the snapshot finishes, describing the detailed result. * * @param done callback */ void snapshot(final Closure done); /** * Reset the election_timeout for the every node. * * @param electionTimeoutMs the timeout millis of election */ void resetElectionTimeoutMs(final int electionTimeoutMs); /** * Try transferring leadership to |peer|. If peer is ANY_PEER, a proper follower * will be chosen as the leader for the next term. * Returns 0 on success, -1 otherwise. * * @param peer the target peer of new leader * @return operation status */ Status transferLeadershipTo(final PeerId peer); /** * Read the first committed user log from the given index. * Return OK on success and user_log is assigned with the very data. Be awared * that the user_log may be not the exact log at the given index, but the * first available user log from the given index to lastCommittedIndex. * Otherwise, appropriate errors are returned: * - return ELOGDELETED when the log has been deleted; * - return ENOMOREUSERLOG when we can't get a user log even reaching lastCommittedIndex. * [NOTE] in consideration of safety, we use lastAppliedIndex instead of lastCommittedIndex * in code implementation. * * @param index log index * @return user log entry * @throws LogNotFoundException the user log is deleted at index. * @throws LogIndexOutOfBoundsException the special index is out of bounds. */ UserLog readCommittedUserLog(final long index); /** * SOFAJRaft users can implement the ReplicatorStateListener interface by themselves. * So users can do their own logical operator in this listener when replicator created, destroyed or had some errors. * * @param replicatorStateListener added ReplicatorStateListener which is implemented by users. */ void addReplicatorStateListener(final Replicator.ReplicatorStateListener replicatorStateListener); /** * End User can remove their implement the ReplicatorStateListener interface by themselves. * * @param replicatorStateListener need to remove the ReplicatorStateListener which has been added by users. */ void removeReplicatorStateListener(final Replicator.ReplicatorStateListener replicatorStateListener); /** * Remove all the ReplicatorStateListeners which have been added by users. * */ void clearReplicatorStateListeners(); /** * Get the ReplicatorStateListeners which have been added by users. * * @return node's replicatorStatueListeners which have been added by users. */ List getReplicatorStatueListeners(); /** * Get the node's target election priority value. * * @return node's target election priority value. * @since 1.3.0 */ int getNodeTargetPriority(); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy