log.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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),
  14. commit: 0,
  15. applied: 0,
  16. }
  17. }
  18. func (l *log) maybeAppend(index, logTerm, commit int, ents ...Entry) bool {
  19. if l.matchTerm(index, logTerm) {
  20. l.append(index, ents...)
  21. l.commit = commit
  22. return true
  23. }
  24. return false
  25. }
  26. func (l *log) append(after int, ents ...Entry) int {
  27. l.ents = append(l.ents[:after+1], ents...)
  28. return len(l.ents) - 1
  29. }
  30. func (l *log) lastIndex() int {
  31. return len(l.ents) - 1
  32. }
  33. func (l *log) term(i int) int {
  34. if i > l.lastIndex() {
  35. return -1
  36. }
  37. return l.ents[i].Term
  38. }
  39. func (l *log) entries(i int) []Entry {
  40. if i > l.lastIndex() {
  41. return nil
  42. }
  43. return l.ents[i:]
  44. }
  45. func (l *log) isUpToDate(i, term int) bool {
  46. e := l.ents[l.lastIndex()]
  47. return term > e.Term || (term == e.Term && i >= l.lastIndex())
  48. }
  49. func (l *log) matchTerm(i, term int) bool {
  50. if i > l.lastIndex() {
  51. return false
  52. }
  53. return l.ents[i].Term == term
  54. }
  55. func (l *log) maybeCommit(maxIndex, term int) bool {
  56. if maxIndex > l.commit && l.term(maxIndex) == term {
  57. l.commit = maxIndex
  58. return true
  59. }
  60. return false
  61. }
  62. func (l *log) nextEnts() (ents []Entry) {
  63. if l.commit > l.applied {
  64. ents = l.ents[l.applied+1 : l.commit+1]
  65. l.applied = l.commit
  66. }
  67. return ents
  68. }