Search in sources :

Example 1 with DisruptorMetricSet

use of org.apache.ignite.raft.jraft.util.DisruptorMetricSet in project ignite-3 by apache.

the class NodeImpl method init.

@Override
public boolean init(final NodeOptions opts) {
    Requires.requireNonNull(opts, "Null node options");
    Requires.requireNonNull(opts.getRaftOptions(), "Null raft options");
    Requires.requireNonNull(opts.getServiceFactory(), "Null jraft service factory");
    this.serviceFactory = opts.getServiceFactory();
    this.options = opts;
    this.raftOptions = opts.getRaftOptions();
    this.metrics = new NodeMetrics(opts.isEnableMetrics());
    this.serverId.setPriority(opts.getElectionPriority());
    this.electionTimeoutCounter = 0;
    if (opts.getReplicationStateListeners() != null)
        this.replicatorStateListeners.addAll(opts.getReplicationStateListeners());
    if (this.serverId.getIp().equals(Utils.IP_ANY)) {
        LOG.error("Node can't start from IP_ANY.");
        return false;
    }
    // Init timers.
    initTimers(opts);
    // Init pools.
    initPools(opts);
    this.configManager = new ConfigurationManager();
    applyDisruptor = opts.getNodeApplyDisruptor();
    applyQueue = applyDisruptor.subscribe(groupId, new LogEntryAndClosureHandler());
    if (this.metrics.getMetricRegistry() != null) {
        this.metrics.getMetricRegistry().register("jraft-node-impl-disruptor", new DisruptorMetricSet(this.applyQueue));
    }
    this.fsmCaller = new FSMCallerImpl();
    if (!initLogStorage()) {
        LOG.error("Node {} initLogStorage failed.", getNodeId());
        return false;
    }
    if (!initMetaStorage()) {
        LOG.error("Node {} initMetaStorage failed.", getNodeId());
        return false;
    }
    if (!initFSMCaller(new LogId(0, 0))) {
        LOG.error("Node {} initFSMCaller failed.", getNodeId());
        return false;
    }
    this.ballotBox = new BallotBox();
    final BallotBoxOptions ballotBoxOpts = new BallotBoxOptions();
    ballotBoxOpts.setWaiter(this.fsmCaller);
    ballotBoxOpts.setClosureQueue(this.closureQueue);
    if (!this.ballotBox.init(ballotBoxOpts)) {
        LOG.error("Node {} init ballotBox failed.", getNodeId());
        return false;
    }
    if (!initSnapshotStorage()) {
        LOG.error("Node {} initSnapshotStorage failed.", getNodeId());
        return false;
    }
    final Status st = this.logManager.checkConsistency();
    if (!st.isOk()) {
        LOG.error("Node {} is initialized with inconsistent log, status={}.", getNodeId(), st);
        return false;
    }
    this.conf = new ConfigurationEntry();
    this.conf.setId(new LogId());
    // if have log using conf in log, else using conf in options
    if (this.logManager.getLastLogIndex() > 0) {
        checkAndSetConfiguration(false);
    } else {
        this.conf.setConf(this.options.getInitialConf());
        // initially set to max(priority of all nodes)
        this.targetPriority = getMaxPriorityOfNodes(this.conf.getConf().getPeers());
    }
    if (!this.conf.isEmpty()) {
        Requires.requireTrue(this.conf.isValid(), "Invalid conf: %s", this.conf);
    } else {
        LOG.info("Init node {} with empty conf.", this.serverId);
    }
    this.replicatorGroup = new ReplicatorGroupImpl();
    this.rpcClientService = new DefaultRaftClientService();
    final ReplicatorGroupOptions rgOpts = new ReplicatorGroupOptions();
    rgOpts.setHeartbeatTimeoutMs(heartbeatTimeout(this.options.getElectionTimeoutMs()));
    rgOpts.setElectionTimeoutMs(this.options.getElectionTimeoutMs());
    rgOpts.setLogManager(this.logManager);
    rgOpts.setBallotBox(this.ballotBox);
    rgOpts.setNode(this);
    rgOpts.setRaftRpcClientService(this.rpcClientService);
    rgOpts.setSnapshotStorage(this.snapshotExecutor != null ? this.snapshotExecutor.getSnapshotStorage() : null);
    rgOpts.setRaftOptions(this.raftOptions);
    rgOpts.setTimerManager(this.options.getScheduler());
    // Adds metric registry to RPC service.
    this.options.setMetricRegistry(this.metrics.getMetricRegistry());
    if (!this.rpcClientService.init(this.options)) {
        LOG.error("Fail to init rpc service.");
        return false;
    }
    this.replicatorGroup.init(new NodeId(this.groupId, this.serverId), rgOpts);
    this.readOnlyService = new ReadOnlyServiceImpl();
    final ReadOnlyServiceOptions rosOpts = new ReadOnlyServiceOptions();
    rosOpts.setGroupId(groupId);
    rosOpts.setFsmCaller(this.fsmCaller);
    rosOpts.setNode(this);
    rosOpts.setRaftOptions(this.raftOptions);
    rosOpts.setReadOnlyServiceDisruptor(opts.getReadOnlyServiceDisruptor());
    if (!this.readOnlyService.init(rosOpts)) {
        LOG.error("Fail to init readOnlyService.");
        return false;
    }
    // set state to follower
    this.state = State.STATE_FOLLOWER;
    if (LOG.isInfoEnabled()) {
        LOG.info("Node {} init, term={}, lastLogId={}, conf={}, oldConf={}.", getNodeId(), this.currTerm, this.logManager.getLastLogId(false), this.conf.getConf(), this.conf.getOldConf());
    }
    if (this.snapshotExecutor != null && this.options.getSnapshotIntervalSecs() > 0) {
        LOG.debug("Node {} start snapshot timer, term={}.", getNodeId(), this.currTerm);
        this.snapshotTimer.start();
    }
    if (!this.conf.isEmpty()) {
        stepDown(this.currTerm, false, new Status());
    }
    // Now the raft node is started , have to acquire the writeLock to avoid race
    // conditions
    this.writeLock.lock();
    if (this.conf.isStable() && this.conf.getConf().size() == 1 && this.conf.getConf().contains(this.serverId)) {
        // The group contains only this server which must be the LEADER, trigger
        // the timer immediately.
        electSelf();
    } else {
        this.writeLock.unlock();
    }
    return true;
}
Also used : Status(org.apache.ignite.raft.jraft.Status) DisruptorMetricSet(org.apache.ignite.raft.jraft.util.DisruptorMetricSet) ReplicatorGroupOptions(org.apache.ignite.raft.jraft.option.ReplicatorGroupOptions) BallotBoxOptions(org.apache.ignite.raft.jraft.option.BallotBoxOptions) ReadOnlyServiceOptions(org.apache.ignite.raft.jraft.option.ReadOnlyServiceOptions) NodeId(org.apache.ignite.raft.jraft.entity.NodeId) DefaultRaftClientService(org.apache.ignite.raft.jraft.rpc.impl.core.DefaultRaftClientService) ConfigurationManager(org.apache.ignite.raft.jraft.conf.ConfigurationManager) LogId(org.apache.ignite.raft.jraft.entity.LogId) ConfigurationEntry(org.apache.ignite.raft.jraft.conf.ConfigurationEntry)

Example 2 with DisruptorMetricSet

use of org.apache.ignite.raft.jraft.util.DisruptorMetricSet in project ignite-3 by apache.

the class LogManagerImpl method init.

@Override
public boolean init(final LogManagerOptions opts) {
    this.writeLock.lock();
    try {
        if (opts.getLogStorage() == null) {
            LOG.error("Fail to init log manager, log storage is null");
            return false;
        }
        this.raftOptions = opts.getRaftOptions();
        this.nodeMetrics = opts.getNodeMetrics();
        this.logStorage = opts.getLogStorage();
        this.configManager = opts.getConfigurationManager();
        this.nodeOptions = opts.getNode().getOptions();
        this.groupId = opts.getGroupId();
        LogStorageOptions lsOpts = new LogStorageOptions();
        lsOpts.setConfigurationManager(this.configManager);
        lsOpts.setLogEntryCodecFactory(opts.getLogEntryCodecFactory());
        if (!this.logStorage.init(lsOpts)) {
            LOG.error("Fail to init logStorage");
            return false;
        }
        this.firstLogIndex = this.logStorage.getFirstLogIndex();
        this.lastLogIndex = this.logStorage.getLastLogIndex();
        this.diskId = new LogId(this.lastLogIndex, getTermFromLogStorage(this.lastLogIndex));
        this.fsmCaller = opts.getFsmCaller();
        this.disruptor = opts.getLogManagerDisruptor();
        this.diskQueue = disruptor.subscribe(groupId, new StableClosureEventHandler(), (event, ex) -> reportError(-1, "LogManager handle event error"));
        if (this.nodeMetrics.getMetricRegistry() != null) {
            this.nodeMetrics.getMetricRegistry().register("jraft-log-manager-disruptor", new DisruptorMetricSet(this.diskQueue));
        }
    } finally {
        this.writeLock.unlock();
    }
    return true;
}
Also used : Configuration(org.apache.ignite.raft.jraft.conf.Configuration) NodeMetrics(org.apache.ignite.raft.jraft.core.NodeMetrics) RaftException(org.apache.ignite.raft.jraft.error.RaftException) LogEntryCorruptedException(org.apache.ignite.raft.jraft.error.LogEntryCorruptedException) Requires(org.apache.ignite.raft.jraft.util.Requires) LogEntry(org.apache.ignite.raft.jraft.entity.LogEntry) HashMap(java.util.HashMap) ReentrantReadWriteLock(java.util.concurrent.locks.ReentrantReadWriteLock) IgniteLogger(org.apache.ignite.lang.IgniteLogger) ConfigurationManager(org.apache.ignite.raft.jraft.conf.ConfigurationManager) NodeOptions(org.apache.ignite.raft.jraft.option.NodeOptions) SegmentList(org.apache.ignite.raft.jraft.util.SegmentList) ArrayList(java.util.ArrayList) StripedDisruptor(org.apache.ignite.raft.jraft.disruptor.StripedDisruptor) Map(java.util.Map) LogId(org.apache.ignite.raft.jraft.entity.LogId) LogStorageOptions(org.apache.ignite.raft.jraft.option.LogStorageOptions) EventHandler(com.lmax.disruptor.EventHandler) ReadWriteLock(java.util.concurrent.locks.ReadWriteLock) ErrorType(org.apache.ignite.raft.jraft.entity.EnumOutter.ErrorType) SnapshotMeta(org.apache.ignite.raft.jraft.entity.RaftOutter.SnapshotMeta) RingBuffer(com.lmax.disruptor.RingBuffer) Status(org.apache.ignite.raft.jraft.Status) ThreadHelper(org.apache.ignite.raft.jraft.util.ThreadHelper) GroupAware(org.apache.ignite.raft.jraft.disruptor.GroupAware) EntryType(org.apache.ignite.raft.jraft.entity.EnumOutter.EntryType) Utils(org.apache.ignite.raft.jraft.util.Utils) CountDownLatch(java.util.concurrent.CountDownLatch) ConfigurationEntry(org.apache.ignite.raft.jraft.conf.ConfigurationEntry) PeerId(org.apache.ignite.raft.jraft.entity.PeerId) List(java.util.List) Lock(java.util.concurrent.locks.Lock) LogManagerOptions(org.apache.ignite.raft.jraft.option.LogManagerOptions) EventTranslator(com.lmax.disruptor.EventTranslator) LogStorage(org.apache.ignite.raft.jraft.storage.LogStorage) FSMCaller(org.apache.ignite.raft.jraft.FSMCaller) ArrayDeque(org.apache.ignite.raft.jraft.util.ArrayDeque) DisruptorMetricSet(org.apache.ignite.raft.jraft.util.DisruptorMetricSet) RaftOptions(org.apache.ignite.raft.jraft.option.RaftOptions) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) RaftError(org.apache.ignite.raft.jraft.error.RaftError) LogManager(org.apache.ignite.raft.jraft.storage.LogManager) DisruptorMetricSet(org.apache.ignite.raft.jraft.util.DisruptorMetricSet) LogStorageOptions(org.apache.ignite.raft.jraft.option.LogStorageOptions) LogId(org.apache.ignite.raft.jraft.entity.LogId)

Example 3 with DisruptorMetricSet

use of org.apache.ignite.raft.jraft.util.DisruptorMetricSet in project ignite-3 by apache.

the class ReadOnlyServiceImpl method init.

@Override
public boolean init(final ReadOnlyServiceOptions opts) {
    this.groupId = opts.getGroupId();
    this.node = opts.getNode();
    this.nodeMetrics = this.node.getNodeMetrics();
    this.fsmCaller = opts.getFsmCaller();
    this.raftOptions = opts.getRaftOptions();
    readIndexDisruptor = opts.getReadOnlyServiceDisruptor();
    readIndexQueue = readIndexDisruptor.subscribe(groupId, new ReadIndexEventHandler());
    if (this.nodeMetrics.getMetricRegistry() != null) {
        // 
        this.nodeMetrics.getMetricRegistry().register("jraft-read-only-service-disruptor", new DisruptorMetricSet(this.readIndexQueue));
    }
    // listen on lastAppliedLogIndex change events.
    this.fsmCaller.addLastAppliedLogIndexListener(this);
    // start scanner.
    this.node.getOptions().getScheduler().scheduleAtFixedRate(() -> onApplied(this.fsmCaller.getLastAppliedIndex()), this.raftOptions.getMaxElectionDelayMs(), this.raftOptions.getMaxElectionDelayMs(), TimeUnit.MILLISECONDS);
    return true;
}
Also used : DisruptorMetricSet(org.apache.ignite.raft.jraft.util.DisruptorMetricSet)

Example 4 with DisruptorMetricSet

use of org.apache.ignite.raft.jraft.util.DisruptorMetricSet in project ignite-3 by apache.

the class FSMCallerImpl method init.

@Override
public boolean init(final FSMCallerOptions opts) {
    this.groupId = opts.getGroupId();
    this.logManager = opts.getLogManager();
    this.fsm = opts.getFsm();
    this.closureQueue = opts.getClosureQueue();
    this.afterShutdown = opts.getAfterShutdown();
    this.node = opts.getNode();
    this.nodeMetrics = this.node.getNodeMetrics();
    this.lastAppliedIndex.set(opts.getBootstrapId().getIndex());
    notifyLastAppliedIndexUpdated(this.lastAppliedIndex.get());
    this.lastAppliedTerm = opts.getBootstrapId().getTerm();
    disruptor = opts.getfSMCallerExecutorDisruptor();
    taskQueue = disruptor.subscribe(groupId, new ApplyTaskHandler());
    if (this.nodeMetrics.getMetricRegistry() != null) {
        this.nodeMetrics.getMetricRegistry().register("jraft-fsm-caller-disruptor", new DisruptorMetricSet(this.taskQueue));
    }
    this.error = new RaftException(ErrorType.ERROR_TYPE_NONE);
    this.msgFactory = opts.getRaftMessagesFactory();
    LOG.info("Starts FSMCaller successfully.");
    return true;
}
Also used : RaftException(org.apache.ignite.raft.jraft.error.RaftException) DisruptorMetricSet(org.apache.ignite.raft.jraft.util.DisruptorMetricSet)

Aggregations

DisruptorMetricSet (org.apache.ignite.raft.jraft.util.DisruptorMetricSet)4 Status (org.apache.ignite.raft.jraft.Status)2 ConfigurationEntry (org.apache.ignite.raft.jraft.conf.ConfigurationEntry)2 ConfigurationManager (org.apache.ignite.raft.jraft.conf.ConfigurationManager)2 LogId (org.apache.ignite.raft.jraft.entity.LogId)2 RaftException (org.apache.ignite.raft.jraft.error.RaftException)2 EventHandler (com.lmax.disruptor.EventHandler)1 EventTranslator (com.lmax.disruptor.EventTranslator)1 RingBuffer (com.lmax.disruptor.RingBuffer)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 CopyOnWriteArrayList (java.util.concurrent.CopyOnWriteArrayList)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 Lock (java.util.concurrent.locks.Lock)1 ReadWriteLock (java.util.concurrent.locks.ReadWriteLock)1 ReentrantReadWriteLock (java.util.concurrent.locks.ReentrantReadWriteLock)1 IgniteLogger (org.apache.ignite.lang.IgniteLogger)1 FSMCaller (org.apache.ignite.raft.jraft.FSMCaller)1