request_vote_request.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package raft
  2. import (
  3. "code.google.com/p/goprotobuf/proto"
  4. "github.com/benbjohnson/go-raft/protobuf"
  5. "io"
  6. "io/ioutil"
  7. )
  8. // The request sent to a server to vote for a candidate to become a leader.
  9. type RequestVoteRequest struct {
  10. peer *Peer
  11. Term uint64
  12. LastLogIndex uint64
  13. LastLogTerm uint64
  14. CandidateName string
  15. }
  16. // Creates a new RequestVote request.
  17. func newRequestVoteRequest(term uint64, candidateName string, lastLogIndex uint64, lastLogTerm uint64) *RequestVoteRequest {
  18. return &RequestVoteRequest{
  19. Term: term,
  20. LastLogIndex: lastLogIndex,
  21. LastLogTerm: lastLogTerm,
  22. CandidateName: candidateName,
  23. }
  24. }
  25. // Encodes the RequestVoteRequest to a buffer. Returns the number of bytes
  26. // written and any error that may have occurred.
  27. func (req *RequestVoteRequest) encode(w io.Writer) (int, error) {
  28. pb := &protobuf.ProtoRequestVoteRequest{
  29. Term: proto.Uint64(req.Term),
  30. LastLogIndex: proto.Uint64(req.LastLogIndex),
  31. LastLogTerm: proto.Uint64(req.LastLogTerm),
  32. CandidateName: proto.String(req.CandidateName),
  33. }
  34. p, err := proto.Marshal(pb)
  35. if err != nil {
  36. return -1, err
  37. }
  38. return w.Write(p)
  39. }
  40. // Decodes the RequestVoteRequest from a buffer. Returns the number of bytes read and
  41. // any error that occurs.
  42. func (req *RequestVoteRequest) decode(r io.Reader) (int, error) {
  43. data, err := ioutil.ReadAll(r)
  44. if err != nil {
  45. return -1, err
  46. }
  47. totalBytes := len(data)
  48. pb := &protobuf.ProtoRequestVoteRequest{}
  49. if err = proto.Unmarshal(data, pb); err != nil {
  50. return -1, err
  51. }
  52. req.Term = pb.GetTerm()
  53. req.LastLogIndex = pb.GetLastLogIndex()
  54. req.LastLogTerm = pb.GetLastLogTerm()
  55. req.CandidateName = pb.GetCandidateName()
  56. return totalBytes, nil
  57. }