forked from shaj13/raft
/
local.go
70 lines (56 loc) · 1.22 KB
/
local.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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package membership
import (
"context"
"sync/atomic"
"time"
"github.com/rakoo/raft/internal/raftpb"
"github.com/rakoo/raft/raftlog"
etcdraftpb "go.etcd.io/etcd/raft/v3/raftpb"
)
func newLocal(cfg Config, m raftpb.Member) (Member, error) {
l := &local{
r: cfg.Reporter(),
active: time.Now(),
}
_ = l.Update(m)
return l, nil
}
// local represents the current cluster member.
type local struct {
r Reporter
active time.Time
raw atomic.Value
}
func (l *local) ID() uint64 {
return l.Raw().ID
}
func (l *local) Address() string {
return l.Raw().Address
}
func (l *local) ActiveSince() time.Time {
return l.active
}
func (l *local) IsActive() bool {
return !l.active.IsZero()
}
func (l *local) Type() raftpb.MemberType {
return l.Raw().Type
}
func (l *local) Update(m raftpb.Member) (err error) {
l.raw.Store(m)
return
}
func (l *local) Close() error {
l.r.ReportShutdown(l.ID())
return nil
}
func (l *local) Send(etcdraftpb.Message) error {
raftlog.Panic("raft.membership: attempted to send msg to local member; should never happen")
return nil
}
func (l *local) Raw() raftpb.Member {
return l.raw.Load().(raftpb.Member)
}
func (l *local) TearDown(ctx context.Context) error {
return l.Close()
}