log.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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) nextEnts() (ents []Entry) {
  58. if l.commit > l.applied {
  59. ents = l.ents[l.applied+1 : l.commit+1]
  60. l.applied = l.commit
  61. }
  62. return ents
  63. }