Class: Evinrude::Log

Inherits:
Object
  • Object
show all
Includes:
LoggingHelpers
Defined in:
lib/evinrude/log.rb

Defined Under Namespace

Classes: SnapshottedEntryError, TruncationUnderflowError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(logger:, snapshot_last_term: 0, snapshot_last_index: 0) ⇒ Log

Returns a new instance of Log.



12
13
14
15
16
# File 'lib/evinrude/log.rb', line 12

def initialize(logger:, snapshot_last_term: 0, snapshot_last_index: 0)
	@logger, @snapshot_last_term, @snapshot_last_index = logger, snapshot_last_term, snapshot_last_index

	@entries = []
end

Instance Attribute Details

#snapshot_last_indexObject (readonly)

Returns the value of attribute snapshot_last_index.



10
11
12
# File 'lib/evinrude/log.rb', line 10

def snapshot_last_index
  @snapshot_last_index
end

#snapshot_last_termObject (readonly)

Returns the value of attribute snapshot_last_term.



10
11
12
# File 'lib/evinrude/log.rb', line 10

def snapshot_last_term
  @snapshot_last_term
end

Instance Method Details

#[](n) ⇒ Object



82
83
84
85
86
87
88
89
90
# File 'lib/evinrude/log.rb', line 82

def [](n)
	if n == 0
		zeroth_log_entry
	elsif n <= @snapshot_last_index
		raise SnapshottedEntryError
	else
		@entries[n - @snapshot_last_index - 1]
	end
end

#append(entry) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/evinrude/log.rb', line 18

def append(entry)
	logger.debug(logloc) { "Appending new entry #{entry.inspect} as ##{@snapshot_last_index + @entries.length + 1}" }
	@entries << entry

	if @entries.length > 1000
		old_len = @entries.length
		snapshotted_entries = @entries[0..499]
		@entries = @entries[500..]
		@snapshot_last_index += 500
		@snapshot_last_term = snapshotted_entries.last.term
	end
end

#entries_from(n) ⇒ Object



66
67
68
# File 'lib/evinrude/log.rb', line 66

def entries_from(n)
	@entries[(n-@snapshot_last_index-1)..] || []
end

#entry_term(n) ⇒ Object



58
59
60
61
62
63
64
# File 'lib/evinrude/log.rb', line 58

def entry_term(n)
	if n == @snapshot_last_index
		@snapshot_last_term
	else
		self[n]&.term
	end
end

#has_entry?(n) ⇒ Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/evinrude/log.rb', line 38

def has_entry?(n)
	n == 0 || n <= @snapshot_last_index + @entries.length
end

#last_entry_termObject



50
51
52
53
54
55
56
# File 'lib/evinrude/log.rb', line 50

def last_entry_term
	if @entries.empty?
		@snapshot_last_term
	else
		@entries.last.term
	end
end

#last_indexObject



46
47
48
# File 'lib/evinrude/log.rb', line 46

def last_index
	@entries.length + @snapshot_last_index
end

#new_snapshot(last_term, last_index) ⇒ Object



31
32
33
34
35
36
# File 'lib/evinrude/log.rb', line 31

def new_snapshot(last_term, last_index)
	@snapshot_last_term = last_term
	@snapshot_last_index = last_index

	@entries = []
end

#snapshotted_entry?(n) ⇒ Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/evinrude/log.rb', line 42

def snapshotted_entry?(n)
	n > 0 && n <= @snapshot_last_index
end

#truncate_to(n) ⇒ Object

Make the last entry kept in the log the nth.



71
72
73
74
75
76
77
78
79
80
# File 'lib/evinrude/log.rb', line 71

def truncate_to(n)
	if n > @snapshot_last_index
		@entries = @entries[0..n-@snapshot_last_index-1]
	elsif n == @snapshot_last_index
		@entries = []
	else
		raise TruncationUnderflowError,
		      "Cannot truncate to log entry ##{n}; into the snapshot"
	end
end