package raft import ( "errors" "sync" "git.giftfish.de/ston1th/raftbbolt/msgpack" "github.com/hashicorp/raft" ) var ErrNotLeader = errors.New("not leader") type kvm map[string][]byte type kv struct { mu sync.Mutex m kvm r *raft.Raft } func (kv *kv) Get(k string) ([]byte, error) { kv.mu.Lock() defer kv.mu.Unlock() return kv.m[k], nil } func (kv *kv) GetPrefix(pk string) (m map[string][]byte, err error) { kv.mu.Lock() defer kv.mu.Unlock() m = make(map[string][]byte) for k, v := range kv.m { if strings.HasPrefix(k, pk) { m[k] = v } } return } 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() }