Class: Innodb::LogGroup

Inherits:
Object
  • Object
show all
Defined in:
lib/innodb/log_group.rb

Instance Method Summary collapse

Constructor Details

#initializeLogGroup

Returns a new instance of LogGroup.



4
5
6
# File 'lib/innodb/log_group.rb', line 4

def initialize
  @files = []
end

Instance Method Details

#add_log(file) ⇒ Object



8
9
10
11
12
13
14
# File 'lib/innodb/log_group.rb', line 8

def add_log(file)
  if file = Innodb::Log.new(file)
    @files.push file
  else
    raise "Couldn't open #{file}"
  end
end

#block(file_number, block_number) ⇒ Object



54
55
56
# File 'lib/innodb/log_group.rb', line 54

def block(file_number, block_number)
  @files[file_number].block(block_number)
end

#block_if_newer(old_block, new_block) ⇒ Object



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

def block_if_newer(old_block, new_block)
  return new_block if old_block.nil?
  #puts "old: #{old_block.header[:block]} new: #{new_block.header[:block]}"
  if new_block.header[:block] >= old_block.header[:block]
    new_block
  end
end

#current_tail_positionObject



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/innodb/log_group.rb', line 24

def current_tail_position
  max       = 0
  max_file  = nil
  max_block = nil

  @files.each_with_index do |file, file_number|
    file.each_block do |block_number, block|
      if block.header[:block] > max
        max   = block.header[:block]
        max_file  = file_number
        max_block = block_number
      end
    end
  end

  { :file => max_file, :block => max_block }
end

#each_blockObject



16
17
18
19
20
21
22
# File 'lib/innodb/log_group.rb', line 16

def each_block
  @files.each do |file|
    file.each_block do |block_number, block|
      yield block_number, block
    end
  end
end

#successor_position(position) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/innodb/log_group.rb', line 42

def successor_position(position)
  if position[:block] == @files[position[:file]].blocks
    if position[:file] == @files.size
      { :file => 0, :block => 0 }
    else
      { :file => position[:file] + 1, :block => 0 }
    end
  else
    { :file => position[:file], :block => position[:block] + 1 }
  end
end

#tail_blocksObject



66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/innodb/log_group.rb', line 66

def tail_blocks
  position = current_tail_position
  current_block = nil
  while true
    until block_if_newer(current_block, new_block = block(position[:file], position[:block]))
      #puts "Waiting at the tail: #{position[:file]} #{position[:block]}"
      sleep 0.1
    end
    yield new_block
    position = successor_position(position)
    current_block = new_block
  end
end