-
Notifications
You must be signed in to change notification settings - Fork 1
/
raft.go
41 lines (32 loc) · 1.23 KB
/
raft.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package raft
import (
"fmt"
"github.com/relab/raft/commonpb"
"golang.org/x/net/context"
)
// NOOP is used in the data field for a no-op entry.
var NOOP = []byte("noop")
// ErrNotLeader is returned by Raft when a method is invoked requiring the
// server to be the leader, and it's not. A hint about the actual leader is
// provided.
type ErrNotLeader struct {
Leader uint64
}
func (e ErrNotLeader) Error() string {
return fmt.Sprintf("not leader, %d is", e.Leader)
}
// Raft represents the interface a Raft node needs expose to the application
// layer.
type Raft interface {
// ProposeCmd proposes a command. Blocks until Raft handles the message
// or the context is canceled, i.e., server is busy. Immediately returns
// an ErrNotLeader error if server isn't the leader. If everything works
// out the command will be applied to the state machine and the result
// available through the future returned.
ProposeCmd(context.Context, []byte) (Future, error)
// ReadCmd works the same way as ProposeCmd but does not write any
// entries to the log.
ReadCmd(context.Context, []byte) (Future, error)
// ProposeConf proposes a new configuration. Behaves as ProposeCmd.
ProposeConf(context.Context, *commonpb.ReconfRequest) (Future, error)
}