log.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package raft
  2. const (
  3. normal int = iota
  4. config
  5. )
  6. type Entry struct {
  7. Type int
  8. Term int
  9. Data []byte
  10. }
  11. type log struct {
  12. ents []Entry
  13. committed int
  14. applied int
  15. }
  16. func newLog() *log {
  17. return &log{
  18. ents: make([]Entry, 1),
  19. committed: 0,
  20. applied: 0,
  21. }
  22. }
  23. func (l *log) maybeAppend(index, logTerm, committed int, ents ...Entry) bool {
  24. if l.matchTerm(index, logTerm) {
  25. l.append(index, ents...)
  26. l.committed = committed
  27. return true
  28. }
  29. return false
  30. }
  31. func (l *log) append(after int, ents ...Entry) int {
  32. l.ents = append(l.ents[:after+1], ents...)
  33. return l.lastIndex()
  34. }
  35. func (l *log) lastIndex() int {
  36. return len(l.ents) - 1
  37. }
  38. func (l *log) term(i int) int {
  39. if i > l.lastIndex() {
  40. return -1
  41. }
  42. return l.ents[i].Term
  43. }
  44. func (l *log) entries(i int) []Entry {
  45. if i > l.lastIndex() {
  46. return nil
  47. }
  48. return l.ents[i:]
  49. }
  50. func (l *log) isUpToDate(i, term int) bool {
  51. e := l.ents[l.lastIndex()]
  52. return term > e.Term || (term == e.Term && i >= l.lastIndex())
  53. }
  54. func (l *log) matchTerm(i, term int) bool {
  55. if i > l.lastIndex() {
  56. return false
  57. }
  58. return l.ents[i].Term == term
  59. }
  60. func (l *log) maybeCommit(maxIndex, term int) bool {
  61. if maxIndex > l.committed && l.term(maxIndex) == term {
  62. l.committed = maxIndex
  63. return true
  64. }
  65. return false
  66. }
  67. // nextEnts returns all the avaliable entries for execution.
  68. // all the returned entries will be marked as applied.
  69. func (l *log) nextEnts() (ents []Entry) {
  70. if l.committed > l.applied {
  71. ents = l.ents[l.applied+1 : l.committed+1]
  72. l.applied = l.committed
  73. }
  74. return ents
  75. }