v2_raft.go 799 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package etcd
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "time"
  6. "github.com/coreos/etcd/raft"
  7. )
  8. type v2Proposal struct {
  9. data []byte
  10. ret chan interface{}
  11. }
  12. type wait struct {
  13. index int64
  14. term int64
  15. }
  16. type v2Raft struct {
  17. *raft.Node
  18. result map[wait]chan interface{}
  19. term int64
  20. }
  21. func (r *v2Raft) Propose(p v2Proposal) {
  22. if !r.Node.IsLeader() {
  23. p.ret <- fmt.Errorf("not leader")
  24. return
  25. }
  26. r.Node.Propose(p.data)
  27. r.result[wait{r.Index(), r.Term()}] = p.ret
  28. return
  29. }
  30. func (r *v2Raft) Sync() {
  31. if !r.Node.IsLeader() {
  32. return
  33. }
  34. sync := &cmd{Type: "sync", Time: time.Now()}
  35. data, err := json.Marshal(sync)
  36. if err != nil {
  37. panic(err)
  38. }
  39. r.Node.Propose(data)
  40. }
  41. func (r *v2Raft) StopProposalWaiters() {
  42. for k, ch := range r.result {
  43. ch <- raftStopErr
  44. delete(r.result, k)
  45. }
  46. }