Пример #1
0
        public virtual RaftMachine Build()
        {
            _termState.update(_term);
            LeaderAvailabilityTimers leaderAvailabilityTimers = new LeaderAvailabilityTimers(Duration.ofMillis(_electionTimeout), Duration.ofMillis(_heartbeatInterval), _clock, _timerService, _logProvider);
            SendToMyself             leaderOnlyReplicator     = new SendToMyself(_member, _outbound);
            RaftMembershipManager    membershipManager        = new RaftMembershipManager(leaderOnlyReplicator, _memberSetBuilder, _raftLog, _logProvider, _expectedClusterSize, leaderAvailabilityTimers.ElectionTimeout, _clock, _catchupTimeout, _raftMembership);

            membershipManager.RecoverFromIndexSupplier = () => 0;
            RaftLogShippingManager logShipping = new RaftLogShippingManager(_outbound, _logProvider, _raftLog, _timerService, _clock, _member, membershipManager, _retryTimeMillis, _catchupBatchSize, _maxAllowedShippingLag, _inFlightCache);
            RaftMachine            raft        = new RaftMachine(_member, _termStateStorage, _voteStateStorage, _raftLog, leaderAvailabilityTimers, _outbound, _logProvider, membershipManager, logShipping, _inFlightCache, false, false, _monitors);

            _inbound.registerHandler(incomingMessage =>
            {
                try
                {
                    ConsensusOutcome outcome = raft.Handle(incomingMessage);
                    _commitListener.notifyCommitted(outcome.CommitIndex);
                }
                catch (IOException e)
                {
                    throw new Exception(e);
                }
            });

            try
            {
                membershipManager.Start();
            }
            catch (IOException e)
            {
                throw new Exception(e);
            }

            return(raft);
        }
Пример #2
0
 public override void Handle <T1>(Org.Neo4j.causalclustering.core.consensus.RaftMessages_ReceivedInstantClusterIdAwareMessage <T1> wrappedMessage)
 {
     lock (this)
     {
         try
         {
             ConsensusOutcome outcome = _raftMachine.handle(wrappedMessage.message());
             if (outcome.NeedsFreshSnapshot())
             {
                 Optional <JobHandle> downloadJob = _downloadService.scheduleDownload(_catchupAddressProvider);
                 if (downloadJob.Present)
                 {
                     downloadJob.get().waitTermination();
                 }
             }
             else
             {
                 NotifyCommitted(outcome.CommitIndex);
             }
         }
         catch (Exception e)
         {
             _log.error("Error handling message", e);
             _raftMachine.panic();
             _localDatabase.panic(e);
         }
     }
 }