class GroongaQueryLog::Command::CheckCrash::ProcessEnumerator

Public Class Methods

new(general_log_paths) click to toggle source
# File lib/groonga-query-log/command/check-crash.rb, line 304
def initialize(general_log_paths)
  @general_log_paths = general_log_paths
  @running_processes = {}
end

Public Instance Methods

each() { |process| ... } click to toggle source
# File lib/groonga-query-log/command/check-crash.rb, line 309
def each(&block)
  general_log_parser = GroongaLog::Parser.new
  general_log_parser.parse_paths(@general_log_paths) do |entry|
    check_general_log_entry(general_log_parser.current_path,
                            entry,
                            &block)
  end
  @running_processes.each_value do |process|
    yield(process)
  end
end

Private Instance Methods

check_general_log_entry(path, entry) { |process| ... } click to toggle source
# File lib/groonga-query-log/command/check-crash.rb, line 322
def check_general_log_entry(path, entry, &block)
  # p [path, entry]
  case entry.log_level
  when :emergency, :alert, :critical, :error, :warning
    # p [entry.log_level, entry.message, entry.timestamp.iso8601]
  end

  case entry.message
  when /\Agrn_init: <(.+?)>/, /\Amroonga (\d+\.\d+) started\.\z/
    version = $1
    process = @running_processes[entry.pid]
    if process
      process.finished = true
      process.crashed = true
      yield(process)
      @running_processes.delete(entry.pid)
    end
    process = GroongaProcess.new(version,
                                 entry.pid,
                                 entry.timestamp,
                                 path)
    @running_processes[entry.pid] = process
  when /\Agrn_fin \((\d+)\)\z/
    n_leaks = $1.to_i
    @running_processes[entry.pid] ||=
      GroongaProcess.new(nil, entry.pid, Time.at(0), path)
    process = @running_processes[entry.pid]
    process.n_leaks = n_leaks
    process.end_time = entry.timestamp
    process.end_log_path = path
    process.finished = true
    yield(process)
    @running_processes.delete(entry.pid)
  else
    @running_processes[entry.pid] ||=
      GroongaProcess.new(nil, entry.pid, Time.at(0), path)
    process = @running_processes[entry.pid]
    case entry.log_level
    when :notice
      case entry.message
      when /lock/
        process.important_entries << entry
      end
    when :emergency, :alert, :critical, :error
      process.important_entries << entry
    end
    process.end_time = entry.timestamp
    process.end_log_path = path
    case entry.message
    when "-- CRASHED!!! --"
      process.crashed = true
      process.finished = true
    when "----------------"
      if process.crashed?
        yield(process)
        @running_processes.delete(entry.pid)
      end
    end
  end
end