v2_raft.go 672 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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 int
  14. term int
  15. }
  16. type v2Raft struct {
  17. *raft.Node
  18. result map[wait]chan interface{}
  19. term int
  20. }
  21. func (r *v2Raft) Propose(p v2Proposal) error {
  22. if !r.Node.IsLeader() {
  23. return fmt.Errorf("not leader")
  24. }
  25. r.Node.Propose(p.data)
  26. r.result[wait{r.Index(), r.Term()}] = p.ret
  27. return nil
  28. }
  29. func (r *v2Raft) Sync() {
  30. if !r.Node.IsLeader() {
  31. return
  32. }
  33. sync := &cmd{Type: "sync", Time: time.Now()}
  34. data, err := json.Marshal(sync)
  35. if err != nil {
  36. panic(err)
  37. }
  38. r.Node.Propose(data)
  39. }