fluent-plugin-droonga 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -4
  3. data/benchmark/watch/benchmark-notify.rb +2 -2
  4. data/benchmark/watch/benchmark-scan.rb +3 -0
  5. data/benchmark/watch/fluentd.conf +0 -1
  6. data/fluent-plugin-droonga.gemspec +2 -3
  7. data/lib/droonga/catalog.rb +10 -124
  8. data/lib/droonga/catalog/base.rb +140 -0
  9. data/lib/droonga/catalog/version1.rb +23 -0
  10. data/lib/droonga/catalog_loader.rb +33 -0
  11. data/lib/droonga/collector.rb +2 -71
  12. data/lib/droonga/collector_plugin.rb +2 -34
  13. data/lib/droonga/dispatcher.rb +141 -196
  14. data/lib/droonga/distribution_planner.rb +76 -0
  15. data/lib/droonga/distributor.rb +5 -7
  16. data/lib/droonga/distributor_plugin.rb +23 -15
  17. data/lib/droonga/engine.rb +2 -2
  18. data/lib/droonga/event_loop.rb +46 -0
  19. data/lib/droonga/farm.rb +9 -5
  20. data/lib/droonga/fluent_message_sender.rb +84 -0
  21. data/lib/droonga/forwarder.rb +43 -53
  22. data/lib/droonga/handler.rb +20 -68
  23. data/lib/droonga/handler_message.rb +61 -0
  24. data/lib/droonga/handler_messenger.rb +92 -0
  25. data/lib/droonga/handler_plugin.rb +10 -12
  26. data/lib/droonga/input_adapter.rb +52 -0
  27. data/lib/droonga/{adapter.rb → input_adapter_plugin.rb} +7 -13
  28. data/lib/droonga/input_message.rb +11 -11
  29. data/lib/droonga/logger.rb +4 -3
  30. data/lib/droonga/message_pack_packer.rb +62 -0
  31. data/lib/droonga/message_processing_error.rb +54 -0
  32. data/lib/droonga/message_pusher.rb +60 -0
  33. data/lib/droonga/message_receiver.rb +61 -0
  34. data/lib/droonga/output_adapter.rb +53 -0
  35. data/lib/droonga/{adapter_plugin.rb → output_adapter_plugin.rb} +3 -21
  36. data/lib/droonga/output_message.rb +37 -0
  37. data/lib/droonga/partition.rb +27 -5
  38. data/lib/droonga/pluggable.rb +9 -4
  39. data/lib/droonga/plugin.rb +12 -3
  40. data/lib/droonga/plugin/collector/basic.rb +91 -18
  41. data/lib/droonga/plugin/distributor/crud.rb +9 -9
  42. data/lib/droonga/plugin/distributor/distributed_search_planner.rb +401 -0
  43. data/lib/droonga/plugin/distributor/groonga.rb +5 -5
  44. data/lib/droonga/plugin/distributor/search.rb +4 -246
  45. data/lib/droonga/plugin/distributor/watch.rb +11 -6
  46. data/lib/droonga/plugin/handler/add.rb +69 -7
  47. data/lib/droonga/plugin/handler/groonga.rb +6 -6
  48. data/lib/droonga/plugin/handler/search.rb +5 -3
  49. data/lib/droonga/plugin/handler/watch.rb +19 -13
  50. data/lib/droonga/plugin/{adapter → input_adapter}/groonga.rb +5 -11
  51. data/lib/droonga/plugin/{adapter → input_adapter}/groonga/select.rb +2 -36
  52. data/lib/droonga/plugin/output_adapter/groonga.rb +30 -0
  53. data/lib/droonga/plugin/output_adapter/groonga/select.rb +54 -0
  54. data/lib/droonga/plugin_loader.rb +2 -2
  55. data/lib/droonga/processor.rb +21 -23
  56. data/lib/droonga/replier.rb +40 -0
  57. data/lib/droonga/searcher.rb +298 -174
  58. data/lib/droonga/server.rb +0 -67
  59. data/lib/droonga/session.rb +85 -0
  60. data/lib/droonga/test.rb +21 -0
  61. data/lib/droonga/test/stub_distributor.rb +31 -0
  62. data/lib/droonga/test/stub_handler.rb +37 -0
  63. data/lib/droonga/test/stub_handler_message.rb +35 -0
  64. data/lib/droonga/test/stub_handler_messenger.rb +34 -0
  65. data/lib/droonga/time_formatter.rb +37 -0
  66. data/lib/droonga/watcher.rb +1 -0
  67. data/lib/droonga/worker.rb +16 -19
  68. data/lib/fluent/plugin/out_droonga.rb +9 -9
  69. data/lib/groonga_command_converter.rb +5 -5
  70. data/sample/cluster/catalog.json +1 -1
  71. data/test/command/config/default/catalog.json +19 -1
  72. data/test/command/fixture/event.jsons +41 -0
  73. data/test/command/fixture/user-table.jsons +9 -0
  74. data/test/command/run-test.rb +2 -2
  75. data/test/command/suite/add/error/invalid-integer.expected +20 -0
  76. data/test/command/suite/add/error/invalid-integer.test +12 -0
  77. data/test/command/suite/add/error/invalid-time.expected +20 -0
  78. data/test/command/suite/add/error/invalid-time.test +12 -0
  79. data/test/command/suite/add/error/missing-key.expected +13 -0
  80. data/test/command/suite/add/error/missing-key.test +16 -0
  81. data/test/command/suite/add/error/missing-table.expected +13 -0
  82. data/test/command/suite/add/error/missing-table.test +16 -0
  83. data/test/command/suite/add/error/unknown-column.expected +20 -0
  84. data/test/command/suite/add/error/unknown-column.test +12 -0
  85. data/test/command/suite/add/error/unknown-table.expected +13 -0
  86. data/test/command/suite/add/error/unknown-table.test +17 -0
  87. data/test/command/suite/add/minimum.expected +1 -3
  88. data/test/command/suite/add/with-values.expected +1 -3
  89. data/test/command/suite/add/without-key.expected +1 -3
  90. data/test/command/suite/message/error/missing-dataset.expected +13 -0
  91. data/test/command/suite/message/error/missing-dataset.test +5 -0
  92. data/test/command/suite/message/error/unknown-command.expected +13 -0
  93. data/test/command/suite/message/error/unknown-command.test +6 -0
  94. data/test/command/suite/message/error/unknown-dataset.expected +13 -0
  95. data/test/command/suite/message/error/unknown-dataset.test +6 -0
  96. data/test/command/suite/search/{array-attribute-label.expected → attributes/array.expected} +0 -0
  97. data/test/command/suite/search/{array-attribute-label.test → attributes/array.test} +0 -0
  98. data/test/command/suite/search/{hash-attribute-label.expected → attributes/hash.expected} +0 -0
  99. data/test/command/suite/search/{hash-attribute-label.test → attributes/hash.test} +0 -0
  100. data/test/command/suite/search/{condition-nested.expected → condition/nested.expected} +0 -0
  101. data/test/command/suite/search/{condition-nested.test → condition/nested.test} +0 -0
  102. data/test/command/suite/search/{condition-query.expected → condition/query.expected} +0 -0
  103. data/test/command/suite/search/{condition-query.test → condition/query.test} +0 -0
  104. data/test/command/suite/search/{condition-script.expected → condition/script.expected} +0 -0
  105. data/test/command/suite/search/{condition-script.test → condition/script.test} +0 -0
  106. data/test/command/suite/search/error/cyclic-source.expected +18 -0
  107. data/test/command/suite/search/error/cyclic-source.test +12 -0
  108. data/test/command/suite/search/error/deeply-cyclic-source.expected +21 -0
  109. data/test/command/suite/search/error/deeply-cyclic-source.test +15 -0
  110. data/test/command/suite/search/error/missing-source-parameter.expected +17 -0
  111. data/test/command/suite/search/error/missing-source-parameter.test +11 -0
  112. data/test/command/suite/search/error/unknown-source.expected +18 -0
  113. data/test/command/suite/search/error/unknown-source.test +12 -0
  114. data/test/command/suite/search/{minimum.expected → group/count.expected} +2 -1
  115. data/test/command/suite/search/{minimum.test → group/count.test} +5 -3
  116. data/test/command/suite/search/group/limit.expected +19 -0
  117. data/test/command/suite/search/group/limit.test +20 -0
  118. data/test/command/suite/search/group/string.expected +36 -0
  119. data/test/command/suite/search/group/string.test +44 -0
  120. data/test/command/suite/search/{chained-queries.expected → multiple/chained.expected} +0 -0
  121. data/test/command/suite/search/{chained-queries.test → multiple/chained.test} +0 -0
  122. data/test/command/suite/search/{multiple-queries.expected → multiple/parallel.expected} +0 -0
  123. data/test/command/suite/search/{multiple-queries.test → multiple/parallel.test} +0 -0
  124. data/test/command/suite/search/{output-range.expected → range/only-output.expected} +0 -0
  125. data/test/command/suite/search/{output-range.test → range/only-output.test} +0 -0
  126. data/test/command/suite/search/{sort-range.expected → range/only-sort.expected} +0 -0
  127. data/test/command/suite/search/{sort-range.test → range/only-sort.test} +0 -0
  128. data/test/command/suite/search/{sort-and-output-range.expected → range/sort-and-output.expected} +0 -0
  129. data/test/command/suite/search/{sort-and-output-range.test → range/sort-and-output.test} +0 -0
  130. data/test/command/suite/search/range/too-large-output-offset.expected +16 -0
  131. data/test/command/suite/search/range/too-large-output-offset.test +25 -0
  132. data/test/command/suite/search/range/too-large-sort-offset.expected +16 -0
  133. data/test/command/suite/search/range/too-large-sort-offset.test +28 -0
  134. data/test/command/suite/search/response/records/value/time.expected +24 -0
  135. data/test/command/suite/search/response/records/value/time.test +24 -0
  136. data/test/command/suite/search/sort/default-offset-limit.expected +43 -0
  137. data/test/command/suite/search/sort/default-offset-limit.test +26 -0
  138. data/test/command/suite/search/{sort-with-invisible-column.expected → sort/invisible-column.expected} +0 -0
  139. data/test/command/suite/search/{sort-with-invisible-column.test → sort/invisible-column.test} +0 -0
  140. data/test/command/suite/watch/subscribe.expected +12 -0
  141. data/test/command/suite/watch/subscribe.test +9 -0
  142. data/test/command/suite/watch/unsubscribe.expected +12 -0
  143. data/test/command/suite/watch/unsubscribe.test +9 -0
  144. data/test/unit/{test_catalog.rb → catalog/test_version1.rb} +12 -4
  145. data/test/unit/fixtures/{catalog.json → catalog/version1.json} +0 -0
  146. data/test/unit/helper.rb +2 -0
  147. data/test/unit/plugin/collector/test_basic.rb +289 -33
  148. data/test/unit/plugin/distributor/test_search.rb +176 -861
  149. data/test/unit/plugin/distributor/test_search_planner.rb +1102 -0
  150. data/test/unit/plugin/handler/groonga/test_column_create.rb +17 -13
  151. data/test/unit/plugin/handler/groonga/test_table_create.rb +10 -10
  152. data/test/unit/plugin/handler/test_add.rb +74 -11
  153. data/test/unit/plugin/handler/test_groonga.rb +15 -1
  154. data/test/unit/plugin/handler/test_search.rb +33 -17
  155. data/test/unit/plugin/handler/test_watch.rb +43 -27
  156. data/test/unit/run-test.rb +2 -0
  157. data/test/unit/test_message_pack_packer.rb +51 -0
  158. data/test/unit/test_time_formatter.rb +29 -0
  159. metadata +208 -110
  160. data/lib/droonga/job_queue.rb +0 -87
  161. data/lib/droonga/job_queue_schema.rb +0 -65
  162. data/test/unit/test_adapter.rb +0 -51
  163. data/test/unit/test_job_queue_schema.rb +0 -45
@@ -24,10 +24,11 @@ module Droonga
24
24
  end
25
25
  end
26
26
 
27
- def error(message, additional_information={})
27
+ def error(message, exception, additional_information={})
28
28
  if $log
29
- $log.error(message, additional_information)
30
- $log.error_backtrace
29
+ $log.error("#{message}: #{exception.message}(#{exception.class})",
30
+ additional_information)
31
+ $log.error_backtrace(exception.backtrace)
31
32
  end
32
33
  end
33
34
  end
@@ -0,0 +1,62 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
+
18
+ require "msgpack"
19
+
20
+ require "droonga/time_formatter"
21
+
22
+ module Droonga
23
+ class MessagePackPacker
24
+ class << self
25
+ def pack(object)
26
+ packer = new
27
+ packer.pack(object)
28
+ packer.to_s
29
+ end
30
+ end
31
+
32
+ MICRO_SECONDS_DECIMAL_PLACE = 6
33
+
34
+ def initialize
35
+ @packer = MessagePack::Packer.new
36
+ end
37
+
38
+ def pack(object)
39
+ case object
40
+ when Array
41
+ @packer.write_array_header(object.size)
42
+ object.each do |element|
43
+ pack(element)
44
+ end
45
+ when Hash
46
+ @packer.write_map_header(object.size)
47
+ object.each do |key, value|
48
+ pack(key)
49
+ pack(value)
50
+ end
51
+ when Time
52
+ @packer.write(TimeFormatter.format(object))
53
+ else
54
+ @packer.write(object)
55
+ end
56
+ end
57
+
58
+ def to_s
59
+ @packer.to_s
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,54 @@
1
+ # Copyright (C) 2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
+
16
+ module Droonga
17
+ class MessageProcessingError < StandardError
18
+ attr_reader :message, :detail
19
+
20
+ def initialize(message, detail=nil)
21
+ @message = message
22
+ @detail = detail
23
+ end
24
+
25
+ def name
26
+ self.class.name.split("::").last
27
+ end
28
+
29
+ def status_code
30
+ 500
31
+ end
32
+
33
+ def response_body
34
+ body = {
35
+ "name" => name,
36
+ "message" => @message,
37
+ }
38
+ body["detail"] = @detail unless @detail.nil?
39
+ body
40
+ end
41
+ end
42
+
43
+ class BadRequest < MessageProcessingError
44
+ def status_code
45
+ 400
46
+ end
47
+ end
48
+
49
+ class NotFound < MessageProcessingError
50
+ def status_code
51
+ 404
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,60 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
+
18
+ require "msgpack"
19
+
20
+ module Droonga
21
+ class MessagePusher
22
+ attr_reader :raw_receiver
23
+ def initialize(loop)
24
+ @loop = loop
25
+ end
26
+
27
+ def start(base_path)
28
+ socket_path = "#{base_path}.sock"
29
+ FileUtils.rm_f(socket_path)
30
+ @raw_receiver = UNIXServer.new(socket_path)
31
+ FileUtils.chmod(0600, socket_path)
32
+ end
33
+
34
+ def shutdown
35
+ $log.trace("#{log_tag}: shutdown: start")
36
+ socket_path = @raw_receiver.path
37
+ @raw_receiver.close
38
+ FileUtils.rm_f(socket_path)
39
+ $log.trace("#{log_tag}: shutdown: done")
40
+ end
41
+
42
+ def push(message)
43
+ $log.trace("#{log_tag}: push: start")
44
+ packed_message = message.to_msgpack
45
+ path = @raw_receiver.path
46
+ sender = Coolio::UNIXSocket.connect(path)
47
+ sender.write(message.to_msgpack)
48
+ sender.on_write_complete do
49
+ close
50
+ end
51
+ @loop.attach(sender)
52
+ $log.trace("#{log_tag}: push: done")
53
+ end
54
+
55
+ private
56
+ def log_tag
57
+ "message_pusher"
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,61 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
+
18
+ require "msgpack"
19
+
20
+ module Droonga
21
+ class MessageReceiver
22
+ def initialize(loop, receiver, &callback)
23
+ @loop = loop
24
+ @receiver = Coolio::Server.new(receiver, Coolio::Socket) do |connection|
25
+ setup_receive_handler(connection)
26
+ end
27
+ @callback = callback
28
+ end
29
+
30
+ def start
31
+ $log.trace("#{log_tag}: start: start")
32
+ @loop.attach(@receiver)
33
+ $log.trace("#{log_tag}: start: done")
34
+ end
35
+
36
+ def shutdown
37
+ $log.trace("#{log_tag}: shutdown: start")
38
+ @receiver.close
39
+ $log.trace("#{log_tag}: shutdown: done")
40
+ end
41
+
42
+ private
43
+ def setup_receive_handler(connection)
44
+ unpacker = MessagePack::Unpacker.new
45
+ on_read = lambda do |data|
46
+ $log.trace("#{log_tag}: on_read: start")
47
+ unpacker.feed_each(data) do |message|
48
+ @callback.call(message)
49
+ end
50
+ $log.trace("#{log_tag}: on_read: done")
51
+ end
52
+ connection.on_read do |data|
53
+ on_read.call(data)
54
+ end
55
+ end
56
+
57
+ def log_tag
58
+ "message_receiver"
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
+
18
+ require "droonga/pluggable"
19
+ require "droonga/output_adapter_plugin"
20
+ require "droonga/output_message"
21
+
22
+ module Droonga
23
+ class OutputAdapter
24
+ include Pluggable
25
+
26
+ def initialize(dispatcher, options={})
27
+ @dispatcher = dispatcher
28
+ load_plugins(options[:plugins] || [])
29
+ end
30
+
31
+ def adapt(message)
32
+ adapted_message = message
33
+ message["via"].reverse_each do |command|
34
+ @plugins.each do |plugin|
35
+ next unless plugin.processable?(command)
36
+ output_message = OutputMessage.new(adapted_message)
37
+ process(command, output_message)
38
+ adapted_message = output_message.adapted_message
39
+ end
40
+ end
41
+ adapted_message
42
+ end
43
+
44
+ private
45
+ def instantiate_plugin(name)
46
+ OutputAdapterPlugin.repository.instantiate(name, @dispatcher)
47
+ end
48
+
49
+ def log_tag
50
+ "output-adapter"
51
+ end
52
+ end
53
+ end
@@ -18,7 +18,7 @@
18
18
  require "droonga/plugin"
19
19
 
20
20
  module Droonga
21
- class AdapterPlugin < Plugin
21
+ class OutputAdapterPlugin < Plugin
22
22
  extend PluginRegisterable
23
23
 
24
24
  def initialize(dispatcher)
@@ -26,26 +26,8 @@ module Droonga
26
26
  @dispatcher = dispatcher
27
27
  end
28
28
 
29
- def add_route(route)
30
- @dispatcher.add_route(route)
31
- end
32
-
33
- def post(body, destination=nil)
34
- @dispatcher.post(body, destination)
35
- end
36
-
37
- def emit(value, name=nil)
38
- if name
39
- @output_values[name] = value
40
- else
41
- @output_values = value
42
- end
43
- end
44
-
45
- def process(command, message)
46
- @output_values = {}
47
- super(command, message)
48
- post(@output_values) unless @output_values.empty?
29
+ def forward(message, destination)
30
+ @dispatcher.forward(message, destination)
49
31
  end
50
32
  end
51
33
  end
@@ -0,0 +1,37 @@
1
+ # Copyright (C) 2013 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
+
16
+ module Droonga
17
+ class OutputMessage
18
+ def initialize(raw_message)
19
+ @raw_message = raw_message
20
+ end
21
+
22
+ def adapted_message
23
+ # TODO: We can create adapted message non-destructively.
24
+ # If it is not performance issue, it is better that we don't
25
+ # change message destructively. Consider about it later.
26
+ @raw_message
27
+ end
28
+
29
+ def body
30
+ @raw_message["body"]
31
+ end
32
+
33
+ def body=(body)
34
+ @raw_message["body"] = body
35
+ end
36
+ end
37
+ end
@@ -19,36 +19,57 @@ require "serverengine"
19
19
 
20
20
  require "droonga/server"
21
21
  require "droonga/worker"
22
+ require "droonga/event_loop"
23
+ require "droonga/message_pusher"
22
24
  require "droonga/processor"
23
25
 
24
26
  module Droonga
25
27
  class Partition
26
- def initialize(options={})
28
+ def initialize(loop, options={})
27
29
  @options = options
28
30
  @n_workers = @options[:n_workers] || 0
29
- @processor = Processor.new(@options)
31
+ @loop = loop
32
+ @message_pusher = MessagePusher.new(@loop)
33
+ @processor = Processor.new(@loop, @message_pusher, @options)
30
34
  @supervisor = nil
31
35
  end
32
36
 
33
37
  def start
38
+ ensure_database
34
39
  @processor.start
40
+ base_path = @options[:database]
41
+ @message_pusher.start(base_path)
35
42
  start_supervisor if @n_workers > 0
36
43
  end
37
44
 
38
45
  def shutdown
39
46
  $log.trace("partition: shutdown: start")
40
47
  shutdown_supervisor if @supervisor
48
+ @message_pusher.shutdown
41
49
  @processor.shutdown
42
50
  $log.trace("partition: shutdown: done")
43
51
  end
44
52
 
45
- def process(envelope, synchronous=nil)
53
+ def process(message)
46
54
  $log.trace("partition: process: start")
47
- @processor.process(envelope, synchronous)
55
+ @processor.process(message)
48
56
  $log.trace("partition: process: done")
49
57
  end
50
58
 
51
59
  private
60
+ def ensure_database
61
+ database_path = @options[:database]
62
+ return if File.exist?(database_path)
63
+ FileUtils.mkdir_p(File.dirname(database_path))
64
+ context = Groonga::Context.new
65
+ begin
66
+ context.create_database(database_path) do
67
+ end
68
+ ensure
69
+ context.close
70
+ end
71
+ end
72
+
52
73
  def start_supervisor
53
74
  @supervisor = ServerEngine::Supervisor.new(Server, Worker) do
54
75
  force_options = {
@@ -56,7 +77,8 @@ module Droonga
56
77
  :workers => @options[:n_workers],
57
78
  :log_level => $log.level,
58
79
  :server_process_name => "Server[#{@options[:database]}] #$0",
59
- :worker_process_name => "Worker[#{@options[:database]}] #$0"
80
+ :worker_process_name => "Worker[#{@options[:database]}] #$0",
81
+ :message_receiver => @message_pusher.raw_receiver,
60
82
  }
61
83
  @options.merge(force_options)
62
84
  end