droonga-engine 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -2
  3. data/Gemfile +1 -1
  4. data/LICENSE.txt +1 -1
  5. data/Rakefile +1 -1
  6. data/benchmark/benchmark.rb +1 -1
  7. data/benchmark/utils.rb +1 -1
  8. data/benchmark/watch/benchmark-notify.rb +1 -1
  9. data/benchmark/watch/benchmark-publish.rb +1 -1
  10. data/benchmark/watch/benchmark-scan.rb +1 -1
  11. data/bin/droonga-engine +1 -1
  12. data/bin/droonga-engine-absorb-data +48 -8
  13. data/bin/droonga-engine-catalog-generate +1 -1
  14. data/bin/droonga-engine-catalog-modify +1 -1
  15. data/bin/droonga-engine-data-publisher +66 -0
  16. data/bin/droonga-engine-join +72 -17
  17. data/bin/droonga-engine-serf-event-handler +1 -1
  18. data/bin/droonga-engine-service +1 -1
  19. data/bin/droonga-engine-unjoin +11 -4
  20. data/bin/droonga-engine-worker +20 -0
  21. data/doc/text/news.md +8 -0
  22. data/droonga-engine.gemspec +3 -3
  23. data/lib/droonga/adapter.rb +1 -1
  24. data/lib/droonga/adapter_runner.rb +1 -1
  25. data/lib/droonga/address.rb +69 -0
  26. data/lib/droonga/buffered_tcp_socket.rb +44 -22
  27. data/lib/droonga/catalog/base.rb +1 -1
  28. data/lib/droonga/catalog/collection_volume.rb +1 -1
  29. data/lib/droonga/catalog/dataset.rb +8 -8
  30. data/lib/droonga/catalog/errors.rb +1 -1
  31. data/lib/droonga/catalog/schema.rb +1 -1
  32. data/lib/droonga/catalog/single_volume.rb +6 -8
  33. data/lib/droonga/catalog/slice.rb +1 -1
  34. data/lib/droonga/catalog/version1.rb +2 -2
  35. data/lib/droonga/catalog/version2.rb +6 -6
  36. data/lib/droonga/catalog/version2_validator.rb +1 -1
  37. data/lib/droonga/catalog/volume.rb +1 -1
  38. data/lib/droonga/catalog/volume_collection.rb +2 -2
  39. data/lib/droonga/catalog_generator.rb +49 -53
  40. data/lib/droonga/catalog_loader.rb +1 -1
  41. data/lib/droonga/collector.rb +1 -1
  42. data/lib/droonga/collector_message.rb +1 -1
  43. data/lib/droonga/collector_runner.rb +1 -1
  44. data/lib/droonga/collectors/and.rb +1 -1
  45. data/lib/droonga/collectors/or.rb +1 -1
  46. data/lib/droonga/collectors/sum.rb +1 -1
  47. data/lib/droonga/collectors.rb +1 -1
  48. data/lib/droonga/command/droonga_engine.rb +103 -55
  49. data/lib/droonga/command/droonga_engine_service.rb +22 -67
  50. data/lib/droonga/command/droonga_engine_worker.rb +232 -0
  51. data/lib/droonga/command/serf_event_handler.rb +126 -46
  52. data/lib/droonga/data_absorber.rb +32 -14
  53. data/lib/droonga/dispatcher.rb +15 -11
  54. data/lib/droonga/distributed_command_planner.rb +1 -1
  55. data/lib/droonga/distributor.rb +1 -1
  56. data/lib/droonga/engine/version.rb +2 -2
  57. data/lib/droonga/engine.rb +8 -3
  58. data/lib/droonga/engine_state.rb +15 -6
  59. data/lib/droonga/error.rb +1 -1
  60. data/lib/droonga/error_messages.rb +1 -1
  61. data/lib/droonga/event_loop.rb +1 -1
  62. data/lib/droonga/farm.rb +9 -1
  63. data/lib/droonga/file_observer.rb +1 -1
  64. data/lib/droonga/fluent_message_receiver.rb +11 -5
  65. data/lib/droonga/fluent_message_sender.rb +14 -17
  66. data/lib/droonga/forwarder.rb +23 -13
  67. data/lib/droonga/handler.rb +1 -1
  68. data/lib/droonga/handler_message.rb +1 -1
  69. data/lib/droonga/handler_messenger.rb +2 -2
  70. data/lib/droonga/handler_runner.rb +2 -2
  71. data/lib/droonga/input_message.rb +1 -1
  72. data/lib/droonga/internal_fluent_message_receiver.rb +3 -2
  73. data/lib/droonga/job_protocol.rb +1 -1
  74. data/lib/droonga/job_pusher.rb +1 -1
  75. data/lib/droonga/job_receiver.rb +1 -1
  76. data/lib/droonga/line_buffer.rb +1 -1
  77. data/lib/droonga/live_nodes_list_loader.rb +1 -1
  78. data/lib/droonga/loggable.rb +1 -1
  79. data/lib/droonga/logger.rb +3 -3
  80. data/lib/droonga/message_matcher.rb +1 -1
  81. data/lib/droonga/output_message.rb +1 -1
  82. data/lib/droonga/path.rb +5 -1
  83. data/lib/droonga/planner.rb +1 -1
  84. data/lib/droonga/pluggable.rb +1 -1
  85. data/lib/droonga/plugin/metadata/adapter_input_message.rb +1 -1
  86. data/lib/droonga/plugin/metadata/adapter_output_message.rb +1 -1
  87. data/lib/droonga/plugin/metadata/collector_message.rb +1 -1
  88. data/lib/droonga/plugin/metadata/handler_action.rb +1 -1
  89. data/lib/droonga/plugin/metadata/input_message.rb +1 -1
  90. data/lib/droonga/plugin.rb +2 -1
  91. data/lib/droonga/plugin_loader.rb +1 -1
  92. data/lib/droonga/plugin_registry.rb +3 -1
  93. data/lib/droonga/plugins/basic.rb +1 -1
  94. data/lib/droonga/plugins/crud.rb +1 -1
  95. data/lib/droonga/plugins/dump.rb +13 -2
  96. data/lib/droonga/plugins/error.rb +1 -1
  97. data/lib/droonga/plugins/groonga/column_create.rb +1 -1
  98. data/lib/droonga/plugins/groonga/column_list.rb +1 -1
  99. data/lib/droonga/plugins/groonga/column_remove.rb +1 -1
  100. data/lib/droonga/plugins/groonga/column_rename.rb +1 -1
  101. data/lib/droonga/plugins/groonga/delete.rb +1 -1
  102. data/lib/droonga/plugins/groonga/generic_command.rb +1 -1
  103. data/lib/droonga/plugins/groonga/generic_response.rb +1 -1
  104. data/lib/droonga/plugins/groonga/select.rb +1 -1
  105. data/lib/droonga/plugins/groonga/table_create.rb +1 -1
  106. data/lib/droonga/plugins/groonga/table_list.rb +1 -1
  107. data/lib/droonga/plugins/groonga/table_remove.rb +1 -1
  108. data/lib/droonga/plugins/groonga.rb +1 -1
  109. data/lib/droonga/plugins/search/distributed_search_planner.rb +1 -1
  110. data/lib/droonga/plugins/search.rb +1 -1
  111. data/lib/droonga/plugins/system.rb +1 -1
  112. data/lib/droonga/plugins/watch.rb +1 -1
  113. data/lib/droonga/{service_control_protocol.rb → process_control_protocol.rb} +2 -2
  114. data/lib/droonga/process_supervisor.rb +91 -0
  115. data/lib/droonga/processor.rb +1 -1
  116. data/lib/droonga/reducer.rb +1 -1
  117. data/lib/droonga/replier.rb +2 -2
  118. data/lib/droonga/safe_file_writer.rb +1 -1
  119. data/lib/droonga/schema_applier.rb +1 -1
  120. data/lib/droonga/searcher/mecab_filter.rb +1 -1
  121. data/lib/droonga/searcher.rb +31 -19
  122. data/lib/droonga/serf.rb +81 -14
  123. data/lib/droonga/serf_downloader.rb +2 -2
  124. data/lib/droonga/session.rb +1 -1
  125. data/lib/droonga/single_step.rb +1 -1
  126. data/lib/droonga/single_step_definition.rb +1 -1
  127. data/lib/droonga/slice.rb +30 -28
  128. data/lib/droonga/status_code.rb +1 -1
  129. data/lib/droonga/step_runner.rb +1 -1
  130. data/lib/droonga/supervisor.rb +170 -0
  131. data/lib/droonga/sweeper.rb +1 -1
  132. data/lib/droonga/test/stub_handler.rb +1 -1
  133. data/lib/droonga/test/stub_handler_message.rb +1 -1
  134. data/lib/droonga/test/stub_handler_messenger.rb +1 -1
  135. data/lib/droonga/test/stub_planner.rb +1 -1
  136. data/lib/droonga/test.rb +1 -1
  137. data/lib/droonga/watch_schema.rb +2 -2
  138. data/lib/droonga/watcher.rb +1 -1
  139. data/lib/droonga/worker_process_agent.rb +111 -0
  140. data/sample/cluster/Rakefile +150 -0
  141. data/test/command/config/default/catalog.json +1 -34
  142. data/test/command/config/version1/catalog.json +3 -12
  143. data/test/command/run-test.rb +1 -1
  144. data/test/command/suite/dump/column/index.expected +19 -82
  145. data/test/command/suite/dump/column/scalar.expected +5 -36
  146. data/test/command/suite/dump/column/vector.expected +5 -39
  147. data/test/command/suite/dump/record/vector/reference.expected +24 -93
  148. data/test/command/suite/dump/table/array.expected +0 -19
  149. data/test/command/suite/dump/table/double_array_trie.expected +0 -20
  150. data/test/command/suite/dump/table/hash.expected +0 -20
  151. data/test/command/suite/dump/table/patricia_trie.expected +0 -20
  152. data/test/command/suite/search/condition/query/nonexistent_column.expected +0 -11
  153. data/test/command/suite/search/condition/query/syntax_error.expected +0 -11
  154. data/test/command/suite/search/error/unknown-source.expected +0 -12
  155. data/test/command/suite/search/output/attributes/invalid.expected +0 -10
  156. data/test/command/suite/search/output/attributes/reference_vector.catalog.json +27 -0
  157. data/test/command/suite/search/output/attributes/reference_vector.expected +30 -0
  158. data/test/command/suite/search/output/attributes/reference_vector.test +32 -0
  159. data/test/command/suite/watch/subscribe.catalog.json +23 -0
  160. data/test/command/suite/watch/subscribe.test +2 -0
  161. data/test/command/suite/watch/unsubscribe.catalog.json +23 -0
  162. data/test/command/suite/watch/unsubscribe.test +2 -0
  163. data/test/performance/run-test.rb +1 -1
  164. data/test/unit/catalog/test_collection_volume.rb +1 -1
  165. data/test/unit/catalog/test_dataset.rb +1 -1
  166. data/test/unit/catalog/test_schema.rb +1 -1
  167. data/test/unit/catalog/test_single_volume.rb +27 -19
  168. data/test/unit/catalog/test_slice.rb +2 -2
  169. data/test/unit/catalog/test_version1.rb +1 -1
  170. data/test/unit/catalog/test_version2.rb +1 -1
  171. data/test/unit/catalog/test_version2_validator.rb +1 -1
  172. data/test/unit/catalog/test_volume_collection.rb +1 -1
  173. data/test/unit/helper/distributed_search_planner_helper.rb +1 -1
  174. data/test/unit/helper/fixture.rb +1 -1
  175. data/test/unit/helper/plugin_helper.rb +1 -1
  176. data/test/unit/helper/sandbox.rb +1 -1
  177. data/test/unit/helper/stub_worker.rb +1 -1
  178. data/test/unit/helper/watch_helper.rb +1 -1
  179. data/test/unit/helper.rb +1 -1
  180. data/test/unit/plugins/crud/test_add.rb +1 -1
  181. data/test/unit/plugins/groonga/select/test_adapter_input.rb +1 -1
  182. data/test/unit/plugins/groonga/select/test_adapter_output.rb +1 -1
  183. data/test/unit/plugins/groonga/test_column_create.rb +1 -1
  184. data/test/unit/plugins/groonga/test_column_list.rb +1 -1
  185. data/test/unit/plugins/groonga/test_column_remove.rb +1 -1
  186. data/test/unit/plugins/groonga/test_column_rename.rb +1 -1
  187. data/test/unit/plugins/groonga/test_delete.rb +1 -1
  188. data/test/unit/plugins/groonga/test_table_create.rb +1 -1
  189. data/test/unit/plugins/groonga/test_table_list.rb +1 -1
  190. data/test/unit/plugins/groonga/test_table_remove.rb +1 -1
  191. data/test/unit/plugins/search/planner/test_basic.rb +1 -1
  192. data/test/unit/plugins/search/planner/test_group_by.rb +1 -1
  193. data/test/unit/plugins/search/planner/test_output.rb +1 -1
  194. data/test/unit/plugins/search/planner/test_sort_by.rb +1 -1
  195. data/test/unit/plugins/search/test_collector.rb +1 -1
  196. data/test/unit/plugins/search/test_handler.rb +1 -1
  197. data/test/unit/plugins/search/test_planner.rb +1 -1
  198. data/test/unit/plugins/system/test_status.rb +1 -1
  199. data/test/unit/plugins/test_basic.rb +1 -1
  200. data/test/unit/plugins/test_groonga.rb +1 -1
  201. data/test/unit/plugins/test_watch.rb +1 -1
  202. data/test/unit/run-test.rb +1 -1
  203. data/test/unit/test_address.rb +53 -0
  204. data/test/unit/test_catalog_generator.rb +59 -1
  205. data/test/unit/test_line_buffer.rb +1 -1
  206. data/test/unit/test_message_matcher.rb +1 -1
  207. data/test/unit/test_schema_applier.rb +1 -1
  208. data/test/unit/test_sweeper.rb +1 -1
  209. data/test/unit/test_watch_schema.rb +1 -1
  210. data/test/unit/test_watcher.rb +1 -1
  211. metadata +39 -24
  212. data/lib/droonga/server.rb +0 -45
  213. data/lib/droonga/worker.rb +0 -66
  214. data/sample/cluster/catalog.json +0 -42
  215. data/test/command/config/default/fluentd.conf +0 -11
  216. data/test/command/config/version1/fluentd.conf +0 -11
data/lib/droonga/slice.rb CHANGED
@@ -11,13 +11,10 @@
11
11
  #
12
12
  # You should have received a copy of the GNU Lesser General Public
13
13
  # License along with this library; if not, write to the Free Software
14
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
-
16
- require "serverengine"
14
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
15
 
18
16
  require "droonga/loggable"
19
- require "droonga/server"
20
- require "droonga/worker"
17
+ require "droonga/supervisor"
21
18
  require "droonga/event_loop"
22
19
  require "droonga/job_pusher"
23
20
  require "droonga/processor"
@@ -27,21 +24,24 @@ module Droonga
27
24
  class Slice
28
25
  include Loggable
29
26
 
27
+ attr_accessor :on_ready
30
28
  def initialize(dataset, loop, options={})
31
29
  @dataset = dataset
32
30
  @loop = loop
33
31
  @options = options
34
32
  @n_workers = @options[:n_workers] || 0
35
- @job_pusher = JobPusher.new(@loop, @options[:database])
33
+ @database_path = @options[:database]
34
+ @job_pusher = JobPusher.new(@loop, @database_path)
36
35
  @processor = Processor.new(@loop, @job_pusher, @options)
37
36
  @supervisor = nil
37
+ @on_ready = nil
38
38
  end
39
39
 
40
40
  def start
41
41
  ensure_database
42
42
  @processor.start
43
43
  @job_pusher.start
44
- start_supervisor if @n_workers > 0
44
+ start_supervisor
45
45
  end
46
46
 
47
47
  def shutdown
@@ -63,14 +63,13 @@ module Droonga
63
63
  enforce_umask
64
64
  context = Groonga::Context.new
65
65
  begin
66
- database_path = @options[:database]
67
- if File.exist?(database_path)
68
- context.open_database(database_path) do
66
+ if File.exist?(@database_path)
67
+ context.open_database(@database_path) do
69
68
  apply_schema(context)
70
69
  end
71
70
  else
72
- FileUtils.mkdir_p(File.dirname(database_path))
73
- context.create_database(database_path) do
71
+ FileUtils.mkdir_p(File.dirname(@database_path))
72
+ context.create_database(@database_path) do
74
73
  apply_schema(context)
75
74
  end
76
75
  end
@@ -89,32 +88,35 @@ module Droonga
89
88
  end
90
89
 
91
90
  def start_supervisor
92
- @supervisor = ServerEngine::Supervisor.new(Server, Worker) do
93
- force_options = {
94
- :worker_type => "process",
95
- :workers => @options[:n_workers],
96
- :log_level => logger.level,
97
- :server_process_name => "Server[#{@options[:database]}] #$0",
98
- :worker_process_name => "Worker[#{@options[:database]}] #$0",
99
- :job_receive_socket_path => @job_pusher.socket_path,
100
- :job_pusher => @job_pusher,
101
- }
102
- @options.merge(force_options)
91
+ if @n_workers.zero?
92
+ on_ready
93
+ return
103
94
  end
104
- @supervisor_thread = Thread.new do
105
- @supervisor.main
95
+
96
+ config = Supervisor::WorkerConfiguration.new
97
+ config.name = @options[:name]
98
+ config.dataset = @dataset
99
+ config.database_path = @database_path
100
+ config.plugins = @options[:plugins]
101
+ config.job_pusher = @job_pusher
102
+ @supervisor = Supervisor.new(@loop, @n_workers, config)
103
+ @supervisor.on_ready = lambda do
104
+ on_ready
106
105
  end
106
+ @supervisor.start
107
107
  end
108
108
 
109
109
  def shutdown_supervisor
110
110
  logger.trace("supervisor: shutdown: start")
111
- @supervisor.stop(true)
112
- logger.trace("supervisor: shutdown: stopped")
113
- @supervisor_thread.join
111
+ @supervisor.stop_gracefully
114
112
  logger.trace("supervisor: shutdown: done")
115
113
  end
116
114
 
117
115
  private
116
+ def on_ready
117
+ @on_ready.call if @on_ready
118
+ end
119
+
118
120
  def log_tag
119
121
  "slice"
120
122
  end
@@ -13,7 +13,7 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library; if not, write to the Free Software
16
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
18
  module Droonga
19
19
  module StatusCode
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # You should have received a copy of the GNU Lesser General Public
13
13
  # License along with this library; if not, write to the Free Software
14
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
15
 
16
16
  require "droonga/loggable"
17
17
  require "droonga/plugin"
@@ -0,0 +1,170 @@
1
+ # Copyright (C) 2014 Droonga Project
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License version 2.1 as published by the Free Software Foundation.
6
+ #
7
+ # This library is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10
+ # Lesser General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU Lesser General Public
13
+ # License along with this library; if not, write to the Free Software
14
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
+
16
+ require "droonga/loggable"
17
+ require "droonga/process_supervisor"
18
+
19
+ module Droonga
20
+ class Supervisor
21
+ include Loggable
22
+
23
+ attr_writer :on_ready
24
+ def initialize(loop, n_workers, config)
25
+ @loop = loop
26
+ @n_workers = n_workers
27
+ @config = config
28
+ @on_ready = nil
29
+ end
30
+
31
+ def start
32
+ n_ready_workers = 0
33
+ @worker_runners = @n_workers.times.collect do |i|
34
+ worker_runner = WorkerRunner.new(@loop, i, @config)
35
+ worker_runner.on_ready = lambda do
36
+ n_ready_workers += 1
37
+ if n_ready_workers == @n_workers
38
+ @on_ready.call if @on_ready
39
+ end
40
+ end
41
+ worker_runner.start
42
+ # TODO: support auto re-run
43
+ worker_runner
44
+ end
45
+ end
46
+
47
+ def stop_gracefully
48
+ @worker_runners.each do |worker_runner|
49
+ worker_runner.stop_gracefully
50
+ end
51
+ end
52
+
53
+ def stop_immediately
54
+ @worker_runners.each do |worker_runner|
55
+ worker_runner.stop_immediately
56
+ end
57
+ end
58
+
59
+ private
60
+ def log_tag
61
+ "supervisor"
62
+ end
63
+
64
+ class WorkerConfiguration
65
+ attr_accessor :name
66
+ attr_accessor :dataset
67
+ attr_accessor :database_path
68
+ attr_accessor :plugins
69
+ attr_accessor :job_pusher
70
+ def initialize
71
+ @name = nil
72
+ @dataset = nil
73
+ @database_path = nil
74
+ @plugins = []
75
+ @job_pusher = nil
76
+ end
77
+ end
78
+
79
+ class WorkerRunner
80
+ include Loggable
81
+
82
+ attr_writer :on_ready
83
+ attr_writer :on_failure
84
+ def initialize(loop, id, config)
85
+ @loop = loop
86
+ @id = id
87
+ @config = config
88
+ @on_ready = nil
89
+ @on_failure = nil
90
+ end
91
+
92
+ def start
93
+ control_write_in, control_write_out = IO.pipe
94
+ control_read_in, control_read_out = IO.pipe
95
+ env = {}
96
+ command_line = [
97
+ RbConfig.ruby,
98
+ "-S",
99
+ "droonga-engine-worker",
100
+ "--control-read-fd", control_write_in.fileno.to_s,
101
+ "--control-write-fd", control_read_out.fileno.to_s,
102
+ "--job-queue-socket-path", @config.job_pusher.socket_path.to_s,
103
+ "--pid-file", pid_path.to_s,
104
+ "--dataset", @config.dataset.name,
105
+ "--database-path", @config.database_path.to_s,
106
+ "--plugins", @config.plugins.join(","),
107
+ ]
108
+ options = {
109
+ control_write_in => control_write_in,
110
+ control_read_out => control_read_out,
111
+ }
112
+ @pid = spawn(env, *command_line, options)
113
+ control_write_in.close
114
+ control_read_out.close
115
+ @supervisor = create_process_supervisor(control_read_in,
116
+ control_write_out)
117
+ @supervisor.start
118
+ end
119
+
120
+ def stop_gracefully
121
+ @supervisor.stop_gracefully
122
+ end
123
+
124
+ def stop_immediately
125
+ @supervisor.stop_immediately
126
+ end
127
+
128
+ def success?
129
+ @success
130
+ end
131
+
132
+ private
133
+ def pid_path
134
+ @config.database_path + "droonga-worker-#{@id}.pid"
135
+ end
136
+
137
+ def create_process_supervisor(input, output)
138
+ supervisor = ProcessSupervisor.new(@loop, input, output)
139
+ supervisor.on_ready = lambda do
140
+ on_ready
141
+ end
142
+ supervisor.on_finish = lambda do
143
+ on_finish
144
+ end
145
+ supervisor
146
+ end
147
+
148
+ def on_ready
149
+ @on_ready.call if @on_ready
150
+ end
151
+
152
+ def on_failure
153
+ # TODO: log
154
+ @on_failure.call if @on_failure
155
+ end
156
+
157
+ def on_finish
158
+ _, status = Process.waitpid2(@pid)
159
+ @success = status.success?
160
+ @supervisor.stop
161
+ on_failure unless success?
162
+ end
163
+
164
+ private
165
+ def log_tag
166
+ "worker-runner"
167
+ end
168
+ end
169
+ end
170
+ end
@@ -13,7 +13,7 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library; if not, write to the Free Software
16
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
18
  module Droonga
19
19
  class Sweeper
@@ -13,7 +13,7 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library; if not, write to the Free Software
16
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
18
  module Droonga
19
19
  module Test
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # You should have received a copy of the GNU Lesser General Public
13
13
  # License along with this library; if not, write to the Free Software
14
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
15
 
16
16
  require "droonga/handler_message"
17
17
 
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # You should have received a copy of the GNU Lesser General Public
13
13
  # License along with this library; if not, write to the Free Software
14
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
15
 
16
16
  module Droonga
17
17
  module Test
@@ -13,7 +13,7 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library; if not, write to the Free Software
16
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
18
  module Droonga
19
19
  module Test
data/lib/droonga/test.rb CHANGED
@@ -13,7 +13,7 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library; if not, write to the Free Software
16
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
18
  require "droonga/test/stub_planner"
19
19
  require "droonga/test/stub_handler"
@@ -13,7 +13,7 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library; if not, write to the Free Software
16
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
18
  require "groonga"
19
19
 
@@ -86,7 +86,7 @@ module Droonga
86
86
  end
87
87
 
88
88
  def log_tag
89
- "[#{Process.ppid}][#{Process.pid}] watch_schema"
89
+ "[#{Process.ppid}] watch_schema"
90
90
  end
91
91
  end
92
92
  end
@@ -13,7 +13,7 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library; if not, write to the Free Software
16
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
18
  module Droonga
19
19
  class Watcher
@@ -0,0 +1,111 @@
1
+ # Copyright (C) 2014 Droonga Project
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License version 2.1 as published by the Free Software Foundation.
6
+ #
7
+ # This library is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10
+ # Lesser General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU Lesser General Public
13
+ # License along with this library; if not, write to the Free Software
14
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
+
16
+ require "coolio"
17
+
18
+ require "droonga/process_control_protocol"
19
+ require "droonga/line_buffer"
20
+
21
+ module Droonga
22
+ class WorkerProcessAgent
23
+ include ProcessControlProtocol
24
+
25
+ def initialize(loop, input, output)
26
+ @loop = loop
27
+ create_input(input)
28
+ create_output(output)
29
+ @on_ready = nil
30
+ @on_finish = nil
31
+ end
32
+
33
+ def start
34
+ @loop.attach(@input)
35
+ @loop.attach(@output)
36
+ end
37
+
38
+ def stop
39
+ if @output
40
+ @output, output = nil, @output
41
+ output.write(Messages::FINISH)
42
+ output.close
43
+ end
44
+ if @input
45
+ @input, input = nil, @input
46
+ input.close
47
+ end
48
+ end
49
+
50
+ def ready
51
+ @output.write(Messages::READY)
52
+ end
53
+
54
+ def on_stop_gracefully=(callback)
55
+ @on_stop_gracefully = callback
56
+ end
57
+
58
+ def on_stop_immediately=(callback)
59
+ @on_stop_immediately = callback
60
+ end
61
+
62
+ private
63
+ def create_input(raw_input)
64
+ @input = Coolio::IO.new(raw_input)
65
+ on_read = lambda do |data|
66
+ line_buffer = LineBuffer.new
67
+ line_buffer.feed(data) do |line|
68
+ case line
69
+ when Messages::STOP_GRACEFUL
70
+ on_stop_gracefully
71
+ when Messages::STOP_IMMEDIATELY
72
+ on_stop_immediately
73
+ end
74
+ end
75
+ end
76
+ @input.on_read do |data|
77
+ on_read.call(data)
78
+ end
79
+ on_close = lambda do
80
+ if @input
81
+ @input = nil
82
+ on_stop_immediately
83
+ end
84
+ end
85
+ @input.on_close do
86
+ on_close.call
87
+ end
88
+ end
89
+
90
+ def create_output(raw_output)
91
+ @output = Coolio::IO.new(raw_output)
92
+ on_close = lambda do
93
+ if @output
94
+ @output = nil
95
+ on_stop_immediately
96
+ end
97
+ end
98
+ @output.on_close do
99
+ on_close.call
100
+ end
101
+ end
102
+
103
+ def on_stop_gracefully
104
+ @on_stop_gracefully.call if @on_stop_gracefully
105
+ end
106
+
107
+ def on_stop_immediately
108
+ @on_stop_immediately.call if @on_stop_immediately
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,150 @@
1
+ # -*- ruby -*-
2
+ #
3
+ # Copyright (C) 2014 Droonga Project
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License version 2.1 as published by the Free Software Foundation.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ require "pathname"
19
+ require "json"
20
+
21
+ base_dir_path = Pathname.new(__FILE__).dirname
22
+ top_dir_path = base_dir_path.parent.parent
23
+ bin_dir_path = top_dir_path + "bin"
24
+ lib_dir_path = top_dir_path + "lib"
25
+
26
+ $LOAD_PATH.unshift(lib_dir_path.to_s)
27
+
28
+ class DroongaEngine
29
+ include Rake::DSL
30
+
31
+ class << self
32
+ def host(node_id)
33
+ "127.0.#{200 + node_id}.1"
34
+ end
35
+
36
+ def port
37
+ 22000
38
+ end
39
+ end
40
+
41
+ def initialize(base_dir_path, node_id)
42
+ @base_dir_path = base_dir_path
43
+ @node_id = node_id
44
+ @pid = nil
45
+ end
46
+
47
+ def setup(node_ids)
48
+ rm_rf(working_dir_path.to_s)
49
+ mkdir_p(working_dir_path.to_s)
50
+ generate_catalog(node_ids)
51
+ end
52
+
53
+ def start
54
+ @pid = spawn("droonga-engine",
55
+ "--base-dir", working_dir_path.to_s,
56
+ "--host", host,
57
+ "--port", self.class.port.to_s,
58
+ "--pid-file", pid_file_path.to_s)
59
+ end
60
+
61
+ def stop
62
+ Process.kill(:TERM, @pid)
63
+ Process.waitpid(@pid)
64
+ @pid = nil
65
+ end
66
+
67
+ def host
68
+ self.class.host(@node_id)
69
+ end
70
+
71
+ private
72
+ def working_dir_path
73
+ @base_dir_path + @node_id.to_s
74
+ end
75
+
76
+ def catalog_path
77
+ working_dir_path + "catalog.json"
78
+ end
79
+
80
+ def pid_file_path
81
+ working_dir_path + "droonga-engine.pid"
82
+ end
83
+
84
+ def generate_catalog(node_ids)
85
+ hosts = node_ids.collect do |node_id|
86
+ self.class.host(node_id)
87
+ end
88
+ sh("droonga-engine-catalog-generate",
89
+ "--output", catalog_path.to_s,
90
+ "--n-workers", "3",
91
+ "--hosts", hosts.join(","),
92
+ "--port", self.class.port.to_s)
93
+ end
94
+ end
95
+
96
+ namespace :droonga do
97
+ node_ids = [0, 1, 2]
98
+
99
+ namespace :prepare do
100
+ task :path do
101
+ paths = [
102
+ bin_dir_path.to_s,
103
+ ENV["PATH"],
104
+ ].compact
105
+ ENV["PATH"] = paths.join(File::PATH_SEPARATOR)
106
+ end
107
+
108
+ task :load_path do
109
+ load_paths = [
110
+ lib_dir_path.to_s,
111
+ ENV["RUBYLIB"],
112
+ ].compact
113
+ ENV["RUBYLIB"] = load_paths.join(File::PATH_SEPARATOR)
114
+ end
115
+ end
116
+
117
+ task :prepare => ["prepare:path", "prepare:load_path"]
118
+
119
+ desc "Set up Droonga cluster."
120
+ task :setup => :prepare do
121
+ node_ids.each do |node_id|
122
+ engine = DroongaEngine.new(base_dir_path, node_id)
123
+ engine.setup(node_ids)
124
+ end
125
+ end
126
+
127
+ desc "Run Droonga cluster."
128
+ task :run => :prepare do
129
+ processes = []
130
+ begin
131
+ node_ids.each do |node_id|
132
+ engine = DroongaEngine.new(base_dir_path, node_id)
133
+ engine.start
134
+ processes << engine
135
+ host = engine.host
136
+ port = DroongaEngine.port
137
+ puts("#{host}:#{port}/droonga")
138
+ end
139
+ front_node_id = node_ids.first
140
+ $stdin.gets
141
+ ensure
142
+ stop_threads = processes.collect do |process|
143
+ Thread.new do
144
+ process.stop
145
+ end
146
+ end
147
+ stop_threads.each(&:join)
148
+ end
149
+ end
150
+ end