trans_handler.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/coreos/go-raft"
  7. "io"
  8. "net/http"
  9. )
  10. type transHandler struct {
  11. name string
  12. client *http.Client
  13. }
  14. // Sends AppendEntries RPCs to a peer when the server is the leader.
  15. func (t transHandler) SendAppendEntriesRequest(server *raft.Server, peer *raft.Peer, req *raft.AppendEntriesRequest) *raft.AppendEntriesResponse {
  16. var aersp *raft.AppendEntriesResponse
  17. var b bytes.Buffer
  18. json.NewEncoder(&b).Encode(req)
  19. debug("Send LogEntries to %s ", peer.Name())
  20. resp, _ := Post(&t, fmt.Sprintf("%s/log/append", peer.Name()), &b)
  21. if resp != nil {
  22. defer resp.Body.Close()
  23. aersp = &raft.AppendEntriesResponse{}
  24. if err := json.NewDecoder(resp.Body).Decode(&aersp); err == nil || err == io.EOF {
  25. return aersp
  26. }
  27. }
  28. return aersp
  29. }
  30. // Sends RequestVote RPCs to a peer when the server is the candidate.
  31. func (t transHandler) SendVoteRequest(server *raft.Server, peer *raft.Peer, req *raft.RequestVoteRequest) *raft.RequestVoteResponse {
  32. var rvrsp *raft.RequestVoteResponse
  33. var b bytes.Buffer
  34. json.NewEncoder(&b).Encode(req)
  35. debug("Send Vote to %s", peer.Name())
  36. resp, _ := Post(&t, fmt.Sprintf("%s/vote", peer.Name()), &b)
  37. if resp != nil {
  38. defer resp.Body.Close()
  39. rvrsp := &raft.RequestVoteResponse{}
  40. if err := json.NewDecoder(resp.Body).Decode(&rvrsp); err == nil || err == io.EOF {
  41. return rvrsp
  42. }
  43. }
  44. return rvrsp
  45. }
  46. // Sends SnapshotRequest RPCs to a peer when the server is the candidate.
  47. func (t transHandler) SendSnapshotRequest(server *raft.Server, peer *raft.Peer, req *raft.SnapshotRequest) *raft.SnapshotResponse {
  48. var aersp *raft.SnapshotResponse
  49. var b bytes.Buffer
  50. json.NewEncoder(&b).Encode(req)
  51. debug("Send Snapshot to %s [Last Term: %d, LastIndex %d]", peer.Name(),
  52. req.LastTerm, req.LastIndex)
  53. resp, err := Post(&t, fmt.Sprintf("%s/snapshot", peer.Name()), &b)
  54. if resp != nil {
  55. defer resp.Body.Close()
  56. aersp = &raft.SnapshotResponse{}
  57. if err = json.NewDecoder(resp.Body).Decode(&aersp); err == nil || err == io.EOF {
  58. return aersp
  59. }
  60. }
  61. return aersp
  62. }