package raft import ( "errors" "sync" "git.giftfish.de/ston1th/raftbbolt/msgpack" "github.com/hashicorp/raft" ) var ErrNotLeader = errors.New("not leader") type kv map[string][]byte type KV struct { mu sync.Mutex m kv r *raft.Raft } func (kv *KV) Get(k string) []byte { kv.mu.Lock() defer kv.mu.Unlock() return kv.m[k] } func (kv *KV) Set(k string, v []byte) error { if kv.r.State() != raft.Leader { return ErrNotLeader } c := &raftCmd{SET, k, v} b, err := msgpack.Marshal(c) if err != nil { return err } f := kv.r.Apply(b, raftTimeout) return f.Error() } // Delete deletes the given key. func (kv *KV) Delete(k string) error { if kv.r.State() != raft.Leader { return ErrNotLeader } c := &raftCmd{Op: DELETE, K: k} b, err := msgpack.Marshal(c) if err != nil { return err } f := kv.r.Apply(b, raftTimeout) return f.Error() }