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
@@ -13,9 +13,9 @@
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
- require "cool.io"
18
+ require "coolio"
19
19
 
20
20
  require "droonga/loggable"
21
21
 
@@ -34,32 +34,32 @@ module Droonga
34
34
  end
35
35
 
36
36
  def write(data)
37
- reserve_write(data)
38
- schedule_write
39
- data.bytesize
40
- end
41
-
42
- def reserve_write(data)
43
37
  chunk = Chunk.new(@data_directory, data, Time.now, 0)
44
38
  chunk.buffering
45
39
  @_write_buffer << chunk
40
+ schedule_write
46
41
  data.bytesize
47
42
  end
48
43
 
49
44
  def on_writable
50
- begin
45
+ until @_write_buffer.empty?
51
46
  chunk = @_write_buffer.shift
52
- written_size = @_io.write(chunk.data)
53
- if written_size == chunk.data.bytesize
54
- chunk.written
55
- else
56
- chunk.written_partial(written_size)
47
+ begin
48
+ written_size = @_io.write_nonblock(chunk.data)
49
+ if written_size == chunk.data.bytesize
50
+ chunk.written
51
+ else
52
+ chunk.written_partial(written_size)
53
+ @_write_buffer.unshift(chunk)
54
+ break
55
+ end
56
+ rescue Errno::EINTR
57
57
  @_write_buffer.unshift(chunk)
58
+ return
59
+ rescue SystemCallError, IOError, SocketError
60
+ @_write_buffer.unshift(chunk)
61
+ return close
58
62
  end
59
- rescue Errno::EINTR
60
- return
61
- rescue SystemCallError, IOError, SocketError
62
- return close
63
63
  end
64
64
 
65
65
  if @_write_buffer.empty?
@@ -77,16 +77,38 @@ module Droonga
77
77
  private
78
78
  def load_chunks
79
79
  FileUtils.mkdir_p(@data_directory.to_s)
80
- Pathname.glob("#{@data_directory}/*.chunk").collect do |chunk_path|
81
- Chunk.load(chunk_path)
82
- end
80
+ chunk_loader = ChunkLoader.new(@data_directory)
81
+ chunk_loader.load
83
82
  end
84
83
 
85
84
  def log_tag
86
- "[#{Process.ppid}][#{Process.pid}] buffered-tcp-socket"
85
+ "[#{Process.ppid}] buffered-tcp-socket"
86
+ end
87
+
88
+ class ChunkLoader
89
+ def initialize(path)
90
+ @path = path
91
+ end
92
+
93
+ def have_any_chunk?
94
+ @path.opendir do |dir|
95
+ dir.each do |entry|
96
+ return true if entry.end_with?(Chunk::SUFFIX)
97
+ end
98
+ end
99
+ false
100
+ end
101
+
102
+ def load
103
+ Pathname.glob("#{@path}/*#{Chunk::SUFFIX}").collect do |chunk_path|
104
+ Chunk.load(chunk_path)
105
+ end
106
+ end
87
107
  end
88
108
 
89
109
  class Chunk
110
+ SUFFIX = ".chunk"
111
+
90
112
  class << self
91
113
  def load(path)
92
114
  data_directory = path.dirname
@@ -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 "digest/sha1"
17
17
  require "zlib"
@@ -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 "digest/sha1"
17
17
  require "zlib"
@@ -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/catalog/schema"
17
17
  require "droonga/catalog/volume"
@@ -62,22 +62,22 @@ module Droonga
62
62
  @all_nodes ||= replicas.all_nodes
63
63
  end
64
64
 
65
- def get_routes(args, live_nodes=nil)
65
+ def compute_routes(message, live_nodes)
66
66
  routes = []
67
- case args["type"]
67
+ case message["type"]
68
68
  when "broadcast"
69
- volumes = replicas.select(args["replica"].to_sym, live_nodes)
69
+ volumes = replicas.select(message["replica"].to_sym, live_nodes)
70
70
  volumes.each do |volume|
71
71
  slices = volume.select_slices
72
72
  slices.each do |slice|
73
- routes << slice.volume.address
73
+ routes << slice.volume.address.to_s
74
74
  end
75
75
  end
76
76
  when "scatter"
77
- volumes = replicas.select(args["replica"].to_sym, live_nodes)
77
+ volumes = replicas.select(message["replica"].to_sym, live_nodes)
78
78
  volumes.each do |volume|
79
- slice = volume.choose_slice(args["record"])
80
- routes << slice.volume.address
79
+ slice = volume.choose_slice(message["record"])
80
+ routes << slice.volume.address.to_s
81
81
  end
82
82
  end
83
83
  routes
@@ -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/error"
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
  require "tsort"
17
17
 
@@ -11,23 +11,21 @@
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
+
16
+ require "droonga/address"
15
17
 
16
18
  module Droonga
17
19
  module Catalog
18
20
  class SingleVolume
21
+ attr_reader :address
19
22
  def initialize(data)
20
23
  @data = data
21
- end
22
-
23
- def address
24
- @data["address"]
24
+ @address = Address.parse(@data["address"])
25
25
  end
26
26
 
27
27
  def node
28
- ip_address_and_port, path = address.split("/")
29
- tag = path.split(".").first
30
- "#{ip_address_and_port}/#{tag}"
28
+ @address.node
31
29
  end
32
30
 
33
31
  def all_nodes
@@ -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 Catalog
@@ -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 "English"
17
17
 
@@ -385,7 +385,7 @@ module Droonga
385
385
  end
386
386
 
387
387
  class Dataset < Catalog::Dataset
388
- def get_routes(args, live_nodes=nil)
388
+ def compute_routes(args, live_nodes=nil)
389
389
  routes = []
390
390
  case args["type"]
391
391
  when "broadcast"
@@ -11,8 +11,9 @@
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
+ require "droonga/address"
16
17
  require "droonga/catalog/base"
17
18
  require "droonga/catalog/dataset"
18
19
  require "droonga/catalog/version2_validator"
@@ -30,9 +31,8 @@ module Droonga
30
31
  @datasets
31
32
  end
32
33
 
33
- def slices(name)
34
+ def slices(node)
34
35
  device = "."
35
- pattern = Regexp.new("^#{name}\.")
36
36
  results = {}
37
37
  @datasets.each do |dataset_name, dataset|
38
38
  n_workers = dataset.n_workers
@@ -40,8 +40,8 @@ module Droonga
40
40
  dataset.replicas.each do |volume|
41
41
  volume.slices.each do |slice|
42
42
  volume_address = slice.volume.address
43
- if pattern =~ volume_address
44
- path = File.join([device, $POSTMATCH, "db"])
43
+ if volume_address.node == node
44
+ path = File.join([device, volume_address.name, "db"])
45
45
  path = File.expand_path(path, base_path)
46
46
  options = {
47
47
  :dataset => dataset_name,
@@ -49,7 +49,7 @@ module Droonga
49
49
  :n_workers => n_workers,
50
50
  :plugins => plugins
51
51
  }
52
- results[volume_address] = options
52
+ results[volume_address.to_s] = options
53
53
  end
54
54
  end
55
55
  end
@@ -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/catalog/errors"
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
  require "droonga/catalog/single_volume"
17
17
  require "droonga/catalog/collection_volume"
@@ -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 Catalog
@@ -47,7 +47,7 @@ module Droonga
47
47
  when :random
48
48
  [volumes.sample]
49
49
  when :all
50
- volumes
50
+ @volumes
51
51
  else
52
52
  super
53
53
  end
@@ -11,10 +11,12 @@
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 "time"
17
17
 
18
+ require "droonga/catalog/dataset"
19
+
18
20
  module Droonga
19
21
  class CatalogGenerator
20
22
  DEFAULT_DATASET = "Default"
@@ -56,8 +58,8 @@ module Droonga
56
58
  end
57
59
 
58
60
  def load(catalog)
59
- catalog["datasets"].each do |name, dataset|
60
- add_dataset(name, dataset_to_params(dataset))
61
+ catalog["datasets"].each do |name, catalog_dataset|
62
+ load_dataset(name, catalog_dataset)
61
63
  end
62
64
  self
63
65
  end
@@ -102,6 +104,16 @@ module Droonga
102
104
  catalog_datasets
103
105
  end
104
106
 
107
+ def load_dataset(name, catalog_dataset)
108
+ options = {}
109
+ options[:n_workers] = catalog_dataset["nWorkers"]
110
+ options[:plugins] = catalog_dataset["plugins"]
111
+ options[:schema] = catalog_dataset["schema"]
112
+ options[:fact] = catalog_dataset["fact"]
113
+ options[:replicas] = catalog_dataset["replicas"]
114
+ add_dataset(name, options)
115
+ end
116
+
105
117
  class Dataset
106
118
  attr_reader :name
107
119
 
@@ -127,8 +139,7 @@ module Droonga
127
139
  end
128
140
 
129
141
  def replicas
130
- return @options[:replicas] if @options[:replicas]
131
- @generated_replicas ||= Replicas.new(@options)
142
+ @replicas ||= create_replicas
132
143
  end
133
144
 
134
145
  def to_catalog
@@ -136,13 +147,23 @@ module Droonga
136
147
  "nWorkers" => n_workers,
137
148
  "plugins" => plugins,
138
149
  "schema" => schema,
139
- "replicas" => replicas.to_json,
150
+ "replicas" => replicas.to_catalog,
140
151
  }
141
152
  catalog["fact"] = fact if fact
142
153
  catalog
143
154
  end
144
155
 
145
156
  private
157
+ def create_replicas
158
+ catalog_replicas = @options[:replicas]
159
+ if catalog_replicas
160
+ replicas = Replicas.new
161
+ replicas.load(catalog_replicas)
162
+ replicas
163
+ else
164
+ Replicas.new(@options)
165
+ end
166
+ end
146
167
  end
147
168
 
148
169
  class Replicas
@@ -156,20 +177,29 @@ module Droonga
156
177
  @n_slices = options[:n_slices]
157
178
  end
158
179
 
159
- def to_json
160
- @json ||= generate_json
180
+ def load(catalog_replicas)
181
+ dataset = Catalog::Dataset.new("temporary",
182
+ "replicas" => catalog_replicas)
183
+ @hosts = dataset.replicas.collect do |replica|
184
+ replica.slices.first.volume.address.host
185
+ end
186
+ collection_volume = dataset.replicas.first
187
+ slices = collection_volume.slices
188
+ @n_slices = slices.size
189
+ single_volume_address = slices.first.volume.address
190
+ @port = single_volume_address.port
191
+ @tag = single_volume_address.tag
161
192
  end
162
193
 
163
- private
164
- def generate_json
165
- replicas = []
194
+ def to_catalog
195
+ catalog_replicas = []
166
196
  @hosts.each do |host|
167
197
  replica = Replica.new(host, :port => @port,
168
198
  :tag => @tag,
169
199
  :n_slices => @n_slices)
170
- replicas << replica.to_json
200
+ catalog_replicas << replica.to_catalog
171
201
  end
172
- replicas
202
+ catalog_replicas
173
203
  end
174
204
  end
175
205
 
@@ -179,19 +209,12 @@ module Droonga
179
209
  @port = options[:port] || DEFAULT_PORT
180
210
  @tag = options[:tag] || DEFAULT_TAG
181
211
  @n_slices = options[:n_slices] || DEFAULT_N_SLICES
182
-
183
- @n_volumes = 0
184
- end
185
-
186
- def to_json
187
- @json ||= generate_json
188
212
  end
189
213
 
190
- private
191
- def generate_json
214
+ def to_catalog
192
215
  slices = []
193
- @n_slices.times do |index|
194
- slices << generate_slice
216
+ @n_slices.times do |i|
217
+ slices << catalog_slice(i)
195
218
  end
196
219
  {
197
220
  "dimension" => "_key",
@@ -200,9 +223,9 @@ module Droonga
200
223
  }
201
224
  end
202
225
 
203
- def generate_slice
204
- name = sprintf('%03d', @n_volumes)
205
- @n_volumes += 1
226
+ private
227
+ def catalog_slice(nth_slice)
228
+ name = "%03d" % nth_slice
206
229
  {
207
230
  "weight" => weight,
208
231
  "volume" => {
@@ -215,32 +238,5 @@ module Droonga
215
238
  @weight ||= 100 / @n_slices
216
239
  end
217
240
  end
218
-
219
- ADDRESS_MATCHER = /\A(.*):(\d+)\/([^\.]+)\.(.+)\z/
220
-
221
- def dataset_to_params(dataset)
222
- params = {}
223
- params[:n_workers] = dataset["nWorkers"]
224
- params[:n_slices] = dataset["replicas"].first["slices"].size
225
- params[:plugins] = dataset["plugins"]
226
- params[:schema] = dataset["schema"] if dataset["schema"]
227
- params[:fact] = dataset["fact"] if dataset["fact"]
228
-
229
- nodes = dataset["replicas"].collect do |replica|
230
- ADDRESS_MATCHER =~ replica["slices"].first["volume"]["address"]
231
- {
232
- :host => $1,
233
- :port => $2.to_i,
234
- :tag => $3,
235
- :path => $4,
236
- }
237
- end
238
- params[:tag] = nodes.first[:tag]
239
- params[:port] = nodes.first[:port].to_i
240
- params[:hosts] = nodes.collect do |node|
241
- node[:host]
242
- end
243
- params
244
- end
245
241
  end
246
242
  end
@@ -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 "json"
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
  require "droonga/pluggable"
17
17
  require "droonga/plugin/metadata/collector_message"
@@ -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
  class CollectorMessage
@@ -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/message_matcher"
@@ -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 Collectors
@@ -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 Collectors
@@ -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 Collectors
@@ -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/collectors/and"
17
17
  require "droonga/collectors/or"