[Groonga-commit] groonga/grntest [master] Use --input-fd and --output-fd

Back to archive index

null+****@clear***** null+****@clear*****
2012年 5月 23日 (水) 17:37:58 JST


Kouhei Sutou	2012-05-23 17:37:58 +0900 (Wed, 23 May 2012)

  New Revision: 348d52662e356b6b9b83b99d6747f7bee8f2707c

  Log:
    Use --input-fd and --output-fd
    
    Keeping stdin and stdout clean is very useful to debug groonga itself.

  Modified files:
    lib/groonga/tester.rb

  Modified: lib/groonga/tester.rb (+37 -17)
===================================================================
--- lib/groonga/tester.rb    2012-05-23 14:16:16 +0900 (f48286b)
+++ lib/groonga/tester.rb    2012-05-23 17:37:58 +0900 (0c9f323)
@@ -223,14 +223,14 @@ module Groonga
       def run_groonga_script
         create_temporary_directory do |directory_path|
           db_path = File.join(directory_path, "db")
-          run_groonga(db_path) do |io|
+          run_groonga(db_path) do |input, output|
             context = Executor::Context.new
             begin
               context.db_path = db_path
               context.base_directory =****@teste*****_directory
               context.groonga_suggest_create_dataset =
                 @tester.groonga_suggest_create_dataset
-              executer = Executor.new(io, context)
+              executer = Executor.new(input, output, context)
               executer.execute(@test_script_path)
             rescue Interrupt
               @interrupted = true
@@ -261,13 +261,32 @@ module Groonga
       end
 
       def run_groonga(db_path)
-        IO.popen([@tester.groonga, "-n", db_path], "r+") do |io|
-          begin
-            ensure_groonga_ready(io)
-            yield io
-          ensure
+        read = 0
+        write = 1
+        input_pipe = IO.pipe
+        output_pipe = IO.pipe
+
+        input_fd = input_pipe[read].to_i
+        output_fd = output_pipe[write].to_i
+        command_line = [
+          @tester.groonga,
+          "--input-fd", input_fd.to_s,
+          "--output-fd", output_fd.to_s,
+          "-n", db_path,
+        ]
+        env = {}
+        options = {
+          input_fd => input_fd,
+          output_fd => output_fd
+        }
+        pid = Process.spawn(env, *command_line, options)
+        begin
+          yield(input_pipe[write], output_pipe[read])
+        ensure
+          (input_pipe + output_pipe).each do |io|
             io.close unless io.closed?
           end
+          Process.waitpid(pid)
         end
       end
 
@@ -403,8 +422,9 @@ module Groonga
       end
 
       attr_reader :context
-      def initialize(groonga, context=nil)
-        @groonga = groonga
+      def initialize(input, output, context=nil)
+        @input = input
+        @output = output
         @loading = false
         @pending_command = ""
         @current_command_name = nil
@@ -441,8 +461,8 @@ module Groonga
       private
       def execute_line_on_loading(line)
         log_input(line)
-        @groonga.print(line)
-        @groonga.flush
+        @input.print(line)
+        @input.flush
         if /\]$/ =~ line
           current_result = read_output
           unless current_result.empty?
@@ -513,7 +533,7 @@ module Groonga
       end
 
       def execute_script(path)
-        executer = self.class.new(@groonga, @context)
+        executer = self.class.new(@input, @output, @context)
         script_path = Pathname(path)
         if script_path.relative?
           script_path = Pathname(@context.base_directory) + script_path
@@ -525,8 +545,8 @@ module Groonga
         extract_command_info(line)
         @loading = true if @current_command == "load"
         begin
-          @groonga.print(line)
-          @groonga.flush
+          @input.print(line)
+          @input.flush
         rescue SystemCallError
           raise Error.new("failed to write to groonga: <#{line}>: #{$!}")
         end
@@ -556,9 +576,9 @@ module Groonga
         output = ""
         first_timeout = 1
         timeout = first_timeout
-        while IO.select([@groonga], [], [], timeout)
-          break if****@groon*****?
-          output << @groonga.readpartial(65535)
+        while IO.select([@output], [], [], timeout)
+          break if****@outpu*****?
+          output << @output.readpartial(65535)
           timeout = 0
         end
         output




Groonga-commit メーリングリストの案内
Back to archive index