raft

package
v0.0.0-...-73db859 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 10, 2019 License: MIT Imports: 19 Imported by: 0

Documentation

Index

Constants

View Source
const (
	RoleLeader    = "leader"
	RoleFollower  = "follower"
	RoleCandidate = "candidate"
	OutFile       = "event.log"

	RPCKindHeartbeat   = "heart-beat"
	RPCKindRequestVote = "request-vote"
)
View Source
const Debug = 0

Debugging

Variables

This section is empty.

Functions

func DPrintf

func DPrintf(format string, a ...interface{}) (n int, err error)

func Drawing

func Drawing()

func InitLogEvent

func InitLogEvent()

func LogConnect

func LogConnect(id int)

func LogDisconnect

func LogDisconnect(id int)

func LogEvent

func LogEvent(name string, content string)

func LogRPC

func LogRPC(sender int, receiver int, kind string, args interface{}, reply interface{})

func LogRoleChange

func LogRoleChange(id int, before, after string)

func LogRunnerStart

func LogRunnerStart(id int)

func LogRunnerStop

func LogRunnerStop(id int)

func LogSystemStart

func LogSystemStart()

func MapToString

func MapToString(m interface{}) string

func RandomInt

func RandomInt(min, max int) int

func StructToString

func StructToString(originStruct interface{}) string

func Writer

func Writer()

Types

type AppendEntriesArgs

type AppendEntriesArgs struct {
	Term         int
	LeaderID     int
	PrevLogIndex int
	PrevLogTerm  int
	Entries      []Entry
	LeaderCommit int
}

func (*AppendEntriesArgs) String

func (arg *AppendEntriesArgs) String() string

type AppendEntriesReply

type AppendEntriesReply struct {
	Term    int
	Success bool
}

func (*AppendEntriesReply) String

func (arg *AppendEntriesReply) String() string

type ApplyMsg

type ApplyMsg struct {
	CommandValid bool
	Command      interface{}
	CommandIndex int
}

as each Raft peer becomes aware that successive log entries are committed, the peer should send an ApplyMsg to the service (or tester) on the same server, via the applyCh passed to Make(). set CommandValid to true to indicate that the ApplyMsg contains a newly committed log entry.

in Lab 3 you'll want to send other kinds of messages (e.g., snapshots) on the applyCh; at that point you can add fields to ApplyMsg, but set CommandValid to false for these other uses.

type Call

type Call struct {
}

type CallingBody

type CallingBody struct {
}

type Entry

type Entry struct {
	Command string
	Term    int
	Index   int
}

type Event

type Event struct {
}

type KeyValue

type KeyValue struct {
	Key   string
	Value interface{}
}

type Persister

type Persister struct {
	// contains filtered or unexported fields
}

func MakePersister

func MakePersister() *Persister

func (*Persister) Copy

func (ps *Persister) Copy() *Persister

func (*Persister) RaftStateSize

func (ps *Persister) RaftStateSize() int

func (*Persister) ReadRaftState

func (ps *Persister) ReadRaftState() []byte

func (*Persister) ReadSnapshot

func (ps *Persister) ReadSnapshot() []byte

func (*Persister) SaveRaftState

func (ps *Persister) SaveRaftState(state []byte)

func (*Persister) SaveStateAndSnapshot

func (ps *Persister) SaveStateAndSnapshot(state []byte, snapshot []byte)

Save both Raft state and K/V snapshot as a single atomic action, to help avoid them getting out of sync.

func (*Persister) SnapshotSize

func (ps *Persister) SnapshotSize() int

type RPC

type RPC struct {
	Sender   int
	Receiver int
	Kind     string
	Args     interface{}
	Reply    interface{}
}

type Raft

type Raft struct {
	CurrentTerm int
	VotedFor    int
	Log         []Entry

	CommitIndex int
	LastApplied int

	NextIndex  []int
	MatchIndex []int

	Role             string // leader, follower, candidate
	ElectionTimeout  time.Duration
	VoteCount        int
	Voters           []int
	ValidRpcReceived bool
	ApplyCH          chan ApplyMsg
	// contains filtered or unexported fields
}

A Go object implementing a single Raft peer.

func Make

func Make(peers []*labrpc.ClientEnd, me int,
	persister *Persister, applyCh chan ApplyMsg) *Raft

the service or tester wants to create a Raft server. the ports of all the Raft servers (including this one) are in peers[]. this server's port is peers[me]. all the servers' peers[] arrays have the same order. persister is a place for this server to save its persistent state, and also initially holds the most recent saved state, if any. applyCh is a channel on which the tester or service expects Raft to send ApplyMsg messages. Make() must return quickly, so it should start goroutines for any long-running work.

func (*Raft) AppendEntries

func (rf *Raft) AppendEntries(args *AppendEntriesArgs, reply *AppendEntriesReply)

func (*Raft) ConvertToCandidate

func (rf *Raft) ConvertToCandidate()

func (*Raft) ConvertToFollower

func (rf *Raft) ConvertToFollower()

func (*Raft) ConvertToLeader

func (rf *Raft) ConvertToLeader()

func (*Raft) GetState

func (rf *Raft) GetState() (int, bool)

return currentTerm and whether this server believes it is the leader.

func (*Raft) Kill

func (rf *Raft) Kill()

the tester calls Kill() when a Raft instance won't be needed again. you are not required to do anything in Kill(), but it might be convenient to (for example) turn off debug output from this instance.

func (*Raft) LeaderAppendEntries

func (rf *Raft) LeaderAppendEntries()

func (*Raft) Lock

func (rf *Raft) Lock()

func (*Raft) Loop

func (rf *Raft) Loop()

func (*Raft) RequestVote

func (rf *Raft) RequestVote(args *RequestVoteArgs, reply *RequestVoteReply)

example RequestVote RPC handler.

func (*Raft) SendHeartBeat

func (rf *Raft) SendHeartBeat()

func (*Raft) Start

func (rf *Raft) Start(command interface{}) (int, int, bool)

the service using Raft (e.g. a k/v server) wants to start agreement on the next command to be appended to Raft's log. if this server isn't the leader, returns false. otherwise start the agreement and return immediately. there is no guarantee that this command will ever be committed to the Raft log, since the leader may fail or lose an election. even if the Raft instance has been killed, this function should return gracefully.

the first return value is the index that the command will appear at if it's ever committed. the second return value is the current term. the third return value is true if this server believes it is the leader.

func (*Raft) StartElection

func (rf *Raft) StartElection()

func (*Raft) String

func (rf *Raft) String() string

func (*Raft) Unlock

func (rf *Raft) Unlock()

type RequestVoteArgs

type RequestVoteArgs struct {
	// Your data here (2A, 2B).
	Term         int
	CandidateID  int
	LastLogIndex int
	LastLogTerm  int
}

example RequestVote RPC arguments structure. field names must start with capital letters!

func (*RequestVoteArgs) String

func (arg *RequestVoteArgs) String() string

type RequestVoteReply

type RequestVoteReply struct {
	// Your data here (2A).
	Term        int
	VoteGranted bool
}

example RequestVote RPC reply structure. field names must start with capital letters!

func (*RequestVoteReply) String

func (arg *RequestVoteReply) String() string

type RoleChange

type RoleChange struct {
	ID     int
	Before string
	After  string
}

type Runner

type Runner struct {
}

func NewRunner

func NewRunner() *Runner

func (*Runner) Start

func (r *Runner) Start()

func (*Runner) Stop

func (r *Runner) Stop()

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL