log.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package raft
  2. type Entry struct {
  3. Term int
  4. Data []byte
  5. }
  6. type log struct {
  7. ents []Entry
  8. commit int
  9. applied int
  10. }
  11. func newLog() *log {
  12. return &log{
  13. ents: make([]Entry, 1, 1024),
  14. commit: 0,
  15. applied: 0,
  16. }
  17. }
  18. func (l *log) maybeAppend(index, logTerm int, ents ...Entry) bool {
  19. if l.matchTerm(index, logTerm) {
  20. l.append(index, ents...)
  21. return true
  22. }
  23. return false
  24. }
  25. func (l *log) append(after int, ents ...Entry) int {
  26. l.ents = append(l.ents[:after+1], ents...)
  27. return len(l.ents) - 1
  28. }
  29. func (l *log) lastIndex() int {
  30. return len(l.ents) - 1
  31. }
  32. func (l *log) term(i int) int {
  33. if i > l.lastIndex() {
  34. return -1
  35. }
  36. return l.ents[i].Term
  37. }
  38. func (l *log) entries(i int) []Entry {
  39. if i > l.lastIndex() {
  40. return nil
  41. }
  42. return l.ents[i:]
  43. }
  44. func (l *log) isUpToDate(i, term int) bool {
  45. // LET upToDate == \/ m.mlastLogTerm > LastTerm(log[i])
  46. // \/ /\ m.mlastLogTerm = LastTerm(log[i])
  47. // /\ m.mlastLogIndex >= Len(log[i])
  48. e := l.ents[l.lastIndex()]
  49. return term > e.Term || (term == e.Term && i >= l.lastIndex())
  50. }
  51. func (l *log) matchTerm(i, term int) bool {
  52. if i > l.lastIndex() {
  53. return false
  54. }
  55. return l.ents[i].Term == term
  56. }
  57. func (l *log) maybeCommit(maxIndex, term int) bool {
  58. if maxIndex > l.commit && l.term(maxIndex) == term {
  59. l.commit = maxIndex
  60. return true
  61. }
  62. return false
  63. }
  64. func (l *log) nextEnts() (ents []Entry) {
  65. if l.commit > l.applied {
  66. ents = l.ents[l.applied+1 : l.commit+1]
  67. l.applied = l.commit
  68. }
  69. return ents
  70. }