// NewMultiRaft creates a MultiRaft object. func NewMultiRaft(nodeID roachpb.NodeID, storeID roachpb.StoreID, config *Config, stopper *stop.Stopper) (*MultiRaft, error) { if nodeID <= 0 { return nil, util.Errorf("invalid NodeID: %s", nodeID) } if storeID <= 0 { return nil, util.Errorf("invalid StoreID: %s", storeID) } if err := config.validate(); err != nil { return nil, err } if config.Ticker == nil { config.Ticker = newTicker(config.TickInterval) stopper.AddCloser(config.Ticker) } if config.EntryFormatter != nil { // Wrap the EntryFormatter to strip off the command id. ef := config.EntryFormatter config.EntryFormatter = func(data []byte) string { if len(data) == 0 { return "[empty]" } id, cmd := decodeCommand(data) formatted := ef(cmd) return fmt.Sprintf("%x: %s", id, formatted) } } m := &MultiRaft{ Config: *config, stopper: stopper, multiNode: raft.StartMultiNode(0), nodeID: nodeID, storeID: storeID, // Output channel. Events: make(chan []interface{}), // Input channels. reqChan: make(chan *RaftMessageRequest, reqBufferSize), createGroupChan: make(chan *createGroupOp), removeGroupChan: make(chan *removeGroupOp), proposalChan: make(chan *proposal), callbackChan: make(chan func()), } if err := m.Transport.Listen(storeID, (*multiraftServer)(m)); err != nil { return nil, err } return m, nil }
func startMultiNode(id uint64, nt *multiraftNetwork) *multinode { st := raft.NewMemoryStorage() n := &multinode{ MultiNode: raft.StartMultiNode(0), nodeid: id, storage: st, pausec: make(chan bool), createGroupChan: make(chan createGroupOp), removeGroupChan: make(chan removeGroupOp), network: nt, } n.start() return n }
// NewMultiRaft creates a MultiRaft object. func NewMultiRaft(nodeID NodeID, config *Config) (*MultiRaft, error) { if nodeID == 0 { return nil, util.Error("Invalid NodeID") } err := config.validate() if err != nil { return nil, err } if config.Ticker == nil { config.Ticker = newTicker(config.TickInterval) } if config.EntryFormatter != nil { // Wrap the EntryFormatter to strip off the command id. ef := config.EntryFormatter config.EntryFormatter = func(data []byte) string { if len(data) == 0 { return "[empty]" } id, cmd := decodeCommand(data) formatted := ef(cmd) return fmt.Sprintf("%x: %s", id, formatted) } } m := &MultiRaft{ Config: *config, multiNode: raft.StartMultiNode(uint64(nodeID), config.ElectionTimeoutTicks, config.HeartbeatIntervalTicks), nodeID: nodeID, Events: make(chan interface{}, 1000), reqChan: make(chan *RaftMessageRequest, 100), createGroupChan: make(chan *createGroupOp, 100), removeGroupChan: make(chan *removeGroupOp, 100), proposalChan: make(chan *proposal, 100), callbackChan: make(chan func(), 100), stopper: util.NewStopper(1), } err = m.Transport.Listen(nodeID, (*multiraftServer)(m)) if err != nil { return nil, err } return m, nil }