[Groonga-commit] droonga/droonga-engine at d5b4dcb [master] Format Serf output

Back to archive index

Kouhei Sutou null+****@clear*****
Wed Jun 25 12:43:21 JST 2014


Kouhei Sutou	2014-06-25 12:43:21 +0900 (Wed, 25 Jun 2014)

  New Revision: d5b4dcbfe0c19c1c7ab8c0d1ceb58404c4074811
  https://github.com/droonga/droonga-engine/commit/d5b4dcbfe0c19c1c7ab8c0d1ceb58404c4074811

  Message:
    Format Serf output

  Modified files:
    lib/droonga/command/droonga_engine.rb
    lib/droonga/logger.rb
    lib/droonga/serf.rb

  Modified: lib/droonga/command/droonga_engine.rb (+1 -1)
===================================================================
--- lib/droonga/command/droonga_engine.rb    2014-06-25 11:18:43 +0900 (8edaec4)
+++ lib/droonga/command/droonga_engine.rb    2014-06-25 12:43:21 +0900 (06e8899)
@@ -132,7 +132,7 @@ module Droonga
         end
 
         def log_level
-          ENV["DROONGA_LOG_LEVEL"] || Logger::Level.default_label
+          ENV["DROONGA_LOG_LEVEL"] || Logger::Level.default
         end
 
         def daemon?

  Modified: lib/droonga/logger.rb (+10 -6)
===================================================================
--- lib/droonga/logger.rb    2014-06-25 11:18:43 +0900 (28dd12b)
+++ lib/droonga/logger.rb    2014-06-25 12:43:21 +0900 (4776d7d)
@@ -49,12 +49,12 @@ module Droonga
           LABELS[level]
         end
 
-        def default
-          WARN
+        def value(label)
+          LABELS.index(label.to_s)
         end
 
-        def default_label
-          label(default)
+        def default
+          ENV["DROONGA_LOG_LEVEL"] || label(WARN)
         end
       end
     end
@@ -73,7 +73,7 @@ module Droonga
     def initialize(options={})
       @output = options[:output] || self.class.default_output
       @tag = options[:tag]
-      self.level = ENV["DROONGA_LOG_LEVEL"] || Level.default_label
+      self.level = options[:level] || Level.default
     end
 
     def level
@@ -81,7 +81,11 @@ module Droonga
     end
 
     def level=(level)
-      @level = Level::LABELS.index(level.to_s)
+      if level.is_a?(Numeric)
+        @level = level
+      else
+        @level = Level.value(level)
+      end
     end
 
     def trace(message, data={})

  Modified: lib/droonga/serf.rb (+143 -11)
===================================================================
--- lib/droonga/serf.rb    2014-06-25 11:18:43 +0900 (6ed72ee)
+++ lib/droonga/serf.rb    2014-06-25 12:43:21 +0900 (5354085)
@@ -13,10 +13,13 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
+require "English"
+
 require "droonga/path"
 require "droonga/loggable"
 require "droonga/catalog_loader"
 require "droonga/serf_downloader"
+require "droonga/line_buffer"
 
 module Droonga
   class Serf
@@ -31,7 +34,7 @@ module Droonga
     def initialize(loop, name)
       @loop = loop
       @name = name
-      @pid = nil
+      @agent = nil
     end
 
     def start
@@ -43,23 +46,24 @@ module Droonga
       detect_other_hosts.each do |other_host|
         retry_joins.push("-retry-join", other_host)
       end
-      @pid = run("agent",
-                 "-node", @name,
-                 "-bind", extract_host(@name),
-                 "-event-handler", "droonga-engine-serf-event-handler",
-                 *retry_joins)
+      @agent = run("agent",
+                   "-node", @name,
+                   "-bind", extract_host(@name),
+                   "-event-handler", "droonga-engine-serf-event-handler",
+                   "-log-level", log_level,
+                   *retry_joins)
       logger.trace("start: done")
     end
 
     def running?
-      not****@pid*****?
+      @agent and****@agent*****?
     end
 
     def shutdown
       logger.trace("shutdown: start")
-      Process.waitpid(run("leave"))
-      Process.waitpid(@pid)
-      @pid = nil
+      run("leave").shutdown
+      @agent.shutdown
+      @agent = nil
       logger.trace("shutdown: done")
     end
 
@@ -85,13 +89,29 @@ module Droonga
     end
 
     def run(command, *options)
-      spawn(@serf, command, "-rpc-addr", rpc_address, *options)
+      process = SerfProcess.new(@loop, @serf, command,
+                                "-rpc-addr", rpc_address,
+                                *options)
+      process.start
+      process
     end
 
     def extract_host(node_name)
       node_name.split(":").first
     end
 
+    def log_level
+      level = Logger::Level.default
+      case level
+      when "trace", "debug", "info", "warn"
+        level
+      when "error", "fatal"
+        "err"
+      else
+        level # Or error?
+      end
+    end
+
     def rpc_address
       "#{extract_host(@name)}:7373"
     end
@@ -110,5 +130,117 @@ module Droonga
     def log_tag
       "serf"
     end
+
+    class SerfProcess
+      include Loggable
+
+      def initialize(loop, serf, command, *options)
+        @loop = loop
+        @serf = serf
+        @command = command
+        @options = options
+        @pid = nil
+      end
+
+      def start
+        capture_output do |output_write, error_write|
+          env = {}
+          spawn_options = {
+            :out => output_write,
+            :err => error_write,
+          }
+          @pid = spawn(env, @serf, @command, *@options, spawn_options)
+        end
+      end
+
+      def shutdown
+        return if****@pid*****?
+        Process.waitpid(@pid)
+        @output_io.close
+        @error_io.close
+        @pid = nil
+      end
+
+      def running?
+        not****@pid*****?
+      end
+
+      private
+      def capture_output
+        result = nil
+        output_read, output_write = IO.pipe
+        error_read, error_write = IO.pipe
+
+        begin
+          result = yield(output_write, error_write)
+        rescue
+          output_read.close  unless output_read.closed?
+          output_write.close unless output_write.closed?
+          error_read.close   unless error_read.closed?
+          error_write.close  unless error_write.closed?
+          raise
+        end
+
+        output_line_buffer = LineBuffer.new
+        on_read_output = lambda do |data|
+          on_standard_output(output_line_buffer, data)
+        end
+        @output_io = Coolio::IO.new(output_read)
+        @output_io.on_read do |data|
+          on_read_output.call(data)
+        end
+        @loop.attach(@output_io)
+
+        error_line_buffer = LineBuffer.new
+        on_read_error = lambda do |data|
+          on_error_output(error_line_buffer, data)
+        end
+        @error_io = Coolio::IO.new(error_read)
+        @error_io.on_read do |data|
+          on_read_error.call(data)
+        end
+        @loop.attach(@error_io)
+
+        result
+      end
+
+      def on_standard_output(line_buffer, data)
+        line_buffer.feed(data) do |line|
+          line = line.chomp
+          case line
+          when /\A==> /
+            content = $POSTMATCH
+            logger.info(content)
+          when /\A    /
+            content = $POSTMATCH
+            case content
+            when /\A(\d{4})\/(\d{2})\/(\d{2}) (\d{2}):(\d{2}):(\d{2}) \[(\w+)\] /
+              year, month, day = $1, $2, $3
+              hour, minute, second = $4, $5, $6
+              level = $7
+              content = $POSTMATCH
+              logger.send(level.downcase, content)
+            else
+              logger.info(content)
+            end
+          else
+            logger.info(line)
+          end
+        end
+      end
+
+      def on_error_output(line_buffer, data)
+        line_buffer.feed(data) do |line|
+          line = line.chomp
+          logger.error(line.gsub(/\A==> /, ""))
+        end
+      end
+
+      def log_tag
+        tag = "serf"
+        tag << "[#{@pid}]" if @pid
+        tag
+      end
+    end
   end
 end
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index