droonga-engine 1.0.9 → 1.1.0

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 (195) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/benchmark/timer-watcher/benchmark.rb +44 -0
  4. data/bin/droonga-engine-absorb-data +246 -187
  5. data/bin/droonga-engine-catalog-generate +12 -12
  6. data/bin/droonga-engine-catalog-modify +4 -4
  7. data/bin/droonga-engine-join +352 -171
  8. data/bin/droonga-engine-set-role +54 -0
  9. data/bin/droonga-engine-unjoin +107 -112
  10. data/droonga-engine.gemspec +3 -3
  11. data/install.sh +55 -36
  12. data/install/centos/functions.sh +2 -2
  13. data/install/debian/functions.sh +2 -2
  14. data/lib/droonga/address.rb +26 -24
  15. data/lib/droonga/buffered_tcp_socket.rb +65 -10
  16. data/lib/droonga/catalog/base.rb +9 -6
  17. data/lib/droonga/catalog/dataset.rb +17 -41
  18. data/lib/droonga/catalog/fetcher.rb +64 -0
  19. data/lib/droonga/catalog/generator.rb +245 -0
  20. data/lib/droonga/catalog/loader.rb +66 -0
  21. data/lib/droonga/{catalog_modifier.rb → catalog/modifier.rb} +11 -18
  22. data/lib/droonga/catalog/replicas_volume.rb +123 -0
  23. data/lib/droonga/catalog/schema.rb +37 -37
  24. data/lib/droonga/catalog/single_volume.rb +11 -3
  25. data/lib/droonga/catalog/slice.rb +10 -6
  26. data/lib/droonga/catalog/{collection_volume.rb → slices_volume.rb} +47 -11
  27. data/lib/droonga/catalog/version1.rb +47 -19
  28. data/lib/droonga/catalog/version2.rb +11 -10
  29. data/lib/droonga/catalog/version2_validator.rb +4 -4
  30. data/lib/droonga/catalog/volume.rb +17 -5
  31. data/lib/droonga/changable.rb +25 -0
  32. data/lib/droonga/cluster.rb +237 -0
  33. data/lib/droonga/collector_runner.rb +4 -0
  34. data/lib/droonga/collectors.rb +2 -1
  35. data/lib/droonga/collectors/recursive_sum.rb +26 -0
  36. data/lib/droonga/command/droonga_engine.rb +404 -127
  37. data/lib/droonga/command/droonga_engine_service.rb +47 -11
  38. data/lib/droonga/command/droonga_engine_worker.rb +21 -1
  39. data/lib/droonga/command/remote_command_base.rb +78 -0
  40. data/lib/droonga/command/serf_event_handler.rb +29 -20
  41. data/lib/droonga/data_absorber_client.rb +222 -0
  42. data/lib/droonga/database_scanner.rb +106 -0
  43. data/lib/droonga/{live_nodes_list_loader.rb → deferrable.rb} +11 -24
  44. data/lib/droonga/differ.rb +58 -0
  45. data/lib/droonga/dispatcher.rb +155 -32
  46. data/lib/droonga/distributed_command_planner.rb +9 -11
  47. data/lib/droonga/engine.rb +83 -78
  48. data/lib/droonga/engine/version.rb +1 -1
  49. data/lib/droonga/engine_node.rb +301 -0
  50. data/lib/droonga/engine_state.rb +62 -40
  51. data/lib/droonga/farm.rb +44 -5
  52. data/lib/droonga/file_observer.rb +16 -12
  53. data/lib/droonga/fluent_message_receiver.rb +98 -29
  54. data/lib/droonga/fluent_message_sender.rb +30 -23
  55. data/lib/droonga/forward_buffer.rb +160 -0
  56. data/lib/droonga/forwarder.rb +73 -40
  57. data/lib/droonga/handler.rb +7 -6
  58. data/lib/droonga/handler_messenger.rb +15 -6
  59. data/lib/droonga/handler_runner.rb +6 -1
  60. data/lib/droonga/internal_fluent_message_receiver.rb +28 -8
  61. data/lib/droonga/job_pusher.rb +10 -7
  62. data/lib/droonga/job_receiver.rb +6 -4
  63. data/lib/droonga/logger.rb +7 -1
  64. data/lib/droonga/node_name.rb +90 -0
  65. data/lib/droonga/node_role.rb +72 -0
  66. data/lib/droonga/path.rb +34 -9
  67. data/lib/droonga/planner.rb +73 -7
  68. data/lib/droonga/plugin/async_command.rb +154 -0
  69. data/lib/droonga/plugins/catalog.rb +1 -0
  70. data/lib/droonga/plugins/crud.rb +22 -6
  71. data/lib/droonga/plugins/dump.rb +66 -135
  72. data/lib/droonga/plugins/groonga/delete.rb +13 -0
  73. data/lib/droonga/plugins/search/distributed_search_planner.rb +4 -4
  74. data/lib/droonga/plugins/system.rb +5 -26
  75. data/lib/droonga/plugins/system/absorb_data.rb +405 -0
  76. data/lib/droonga/plugins/system/statistics.rb +71 -0
  77. data/lib/droonga/plugins/system/status.rb +53 -0
  78. data/lib/droonga/process_control_protocol.rb +3 -1
  79. data/lib/droonga/process_supervisor.rb +32 -15
  80. data/lib/droonga/reducer.rb +69 -0
  81. data/lib/droonga/safe_file_writer.rb +1 -1
  82. data/lib/droonga/serf.rb +207 -276
  83. data/lib/droonga/serf/agent.rb +228 -0
  84. data/lib/droonga/serf/command.rb +94 -0
  85. data/lib/droonga/serf/downloader.rb +120 -0
  86. data/lib/droonga/serf/remote_command.rb +348 -0
  87. data/lib/droonga/serf/tag.rb +56 -0
  88. data/lib/droonga/service_installation.rb +2 -2
  89. data/lib/droonga/session.rb +49 -1
  90. data/lib/droonga/single_step.rb +6 -11
  91. data/lib/droonga/single_step_definition.rb +32 -1
  92. data/lib/droonga/slice.rb +14 -9
  93. data/lib/droonga/supervisor.rb +27 -20
  94. data/lib/droonga/test/stub_handler_messenger.rb +2 -1
  95. data/lib/droonga/timestamp.rb +69 -0
  96. data/lib/droonga/worker_process_agent.rb +33 -15
  97. data/sample/cluster-state.json +8 -0
  98. data/sample/cluster/Rakefile +30 -6
  99. data/test/command/fixture/integer-key-table.jsons +11 -0
  100. data/test/command/fixture/string-key-table.jsons +11 -0
  101. data/test/command/run-test.rb +4 -0
  102. data/test/command/suite/add/error/invalid-integer.expected +3 -3
  103. data/test/command/suite/add/error/invalid-time.expected +3 -3
  104. data/test/command/suite/add/{minimum.expected → key-integer.expected} +0 -0
  105. data/test/command/suite/add/{minimum.test → key-integer.test} +0 -0
  106. data/test/command/suite/add/key-string.expected +6 -0
  107. data/test/command/suite/add/key-string.test +9 -0
  108. data/test/command/suite/add/mismatched-key-type/acceptable/integer-for-string.expected +6 -0
  109. data/test/command/suite/add/mismatched-key-type/acceptable/integer-for-string.test +9 -0
  110. data/test/command/suite/add/mismatched-key-type/acceptable/string-for-integer.expected +6 -0
  111. data/test/command/suite/add/mismatched-key-type/acceptable/string-for-integer.test +9 -0
  112. data/test/command/suite/add/without-values.expected +6 -0
  113. data/test/command/suite/add/without-values.test +11 -0
  114. data/test/command/suite/dump/column/index.expected +33 -1
  115. data/test/command/suite/dump/column/index.test +1 -0
  116. data/test/command/suite/dump/column/scalar.expected +29 -1
  117. data/test/command/suite/dump/column/scalar.test +1 -0
  118. data/test/command/suite/dump/column/vector.expected +29 -1
  119. data/test/command/suite/dump/column/vector.test +1 -0
  120. data/test/command/suite/dump/record/scalar.catalog.json +12 -0
  121. data/test/command/suite/dump/record/scalar.expected +84 -0
  122. data/test/command/suite/dump/record/scalar.test +16 -0
  123. data/test/command/suite/dump/record/vector/reference.expected +83 -1
  124. data/test/command/suite/dump/record/vector/reference.test +1 -0
  125. data/test/command/suite/dump/table/array.expected +27 -1
  126. data/test/command/suite/dump/table/array.test +1 -0
  127. data/test/command/suite/dump/table/double_array_trie.expected +27 -1
  128. data/test/command/suite/dump/table/double_array_trie.test +1 -0
  129. data/test/command/suite/dump/table/hash.expected +27 -1
  130. data/test/command/suite/dump/table/hash.test +1 -0
  131. data/test/command/suite/dump/table/patricia_trie.expected +27 -1
  132. data/test/command/suite/dump/table/patricia_trie.test +1 -0
  133. data/test/command/suite/groonga/delete/{success.expected → key-integer.expected} +0 -0
  134. data/test/command/suite/groonga/delete/key-integer.test +17 -0
  135. data/test/command/suite/groonga/delete/key-string.expected +19 -0
  136. data/test/command/suite/groonga/delete/{success.test → key-string.test} +4 -6
  137. data/test/command/suite/groonga/delete/mismatched-type-key/acceptable/integer-for-string.expected +19 -0
  138. data/test/command/suite/groonga/delete/mismatched-type-key/acceptable/integer-for-string.test +17 -0
  139. data/test/command/suite/groonga/delete/mismatched-type-key/acceptable/string-for-integer.expected +19 -0
  140. data/test/command/suite/groonga/delete/mismatched-type-key/acceptable/string-for-integer.test +17 -0
  141. data/test/command/suite/message/error/missing-dataset.test +1 -0
  142. data/test/command/suite/system/absorb-data/records.catalog.json +58 -0
  143. data/test/command/suite/system/absorb-data/records.expected +32 -0
  144. data/test/command/suite/system/absorb-data/records.test +24 -0
  145. data/test/command/suite/system/statistics/object/count/empty.expected +11 -0
  146. data/test/command/suite/system/statistics/object/count/empty.test +12 -0
  147. data/test/command/suite/system/statistics/object/count/per-volume/empty.catalog.json +36 -0
  148. data/test/command/suite/system/statistics/object/count/per-volume/empty.expected +19 -0
  149. data/test/command/suite/system/statistics/object/count/per-volume/empty.test +12 -0
  150. data/test/command/suite/system/statistics/object/count/per-volume/record.catalog.json +40 -0
  151. data/test/command/suite/system/statistics/object/count/per-volume/record.expected +19 -0
  152. data/test/command/suite/system/statistics/object/count/per-volume/record.test +23 -0
  153. data/test/command/suite/system/statistics/object/count/per-volume/schema.catalog.json +40 -0
  154. data/test/command/suite/system/statistics/object/count/per-volume/schema.expected +19 -0
  155. data/test/command/suite/system/statistics/object/count/per-volume/schema.test +13 -0
  156. data/test/command/suite/system/statistics/object/count/record.catalog.json +12 -0
  157. data/test/command/suite/system/statistics/object/count/record.expected +11 -0
  158. data/test/command/suite/system/statistics/object/count/record.test +23 -0
  159. data/test/command/suite/system/statistics/object/count/schema.catalog.json +12 -0
  160. data/test/command/suite/system/statistics/object/count/schema.expected +11 -0
  161. data/test/command/suite/system/statistics/object/count/schema.test +13 -0
  162. data/test/command/suite/system/status.expected +3 -2
  163. data/test/unit/catalog/test_dataset.rb +4 -1
  164. data/test/unit/{test_catalog_generator.rb → catalog/test_generator.rb} +2 -2
  165. data/test/unit/catalog/test_replicas_volume.rb +79 -0
  166. data/test/unit/catalog/test_single_volume.rb +2 -2
  167. data/test/unit/catalog/test_slice.rb +33 -1
  168. data/test/unit/catalog/{test_collection_volume.rb → test_slices_volume.rb} +72 -11
  169. data/test/unit/catalog/test_version2.rb +3 -0
  170. data/test/unit/helper/distributed_search_planner_helper.rb +2 -2
  171. data/test/unit/plugins/catalog/test_fetch.rb +4 -4
  172. data/test/unit/plugins/crud/test_add.rb +44 -4
  173. data/test/unit/plugins/groonga/test_column_create.rb +4 -4
  174. data/test/unit/plugins/groonga/test_column_list.rb +4 -4
  175. data/test/unit/plugins/groonga/test_column_remove.rb +4 -4
  176. data/test/unit/plugins/groonga/test_column_rename.rb +4 -4
  177. data/test/unit/plugins/groonga/test_delete.rb +73 -10
  178. data/test/unit/plugins/groonga/test_table_create.rb +4 -4
  179. data/test/unit/plugins/groonga/test_table_list.rb +4 -4
  180. data/test/unit/plugins/groonga/test_table_remove.rb +4 -4
  181. data/test/unit/plugins/search/test_handler.rb +4 -4
  182. data/test/unit/plugins/search/test_planner.rb +4 -2
  183. data/test/unit/plugins/system/test_status.rb +31 -15
  184. data/test/unit/plugins/test_watch.rb +16 -16
  185. data/test/unit/test_address.rb +4 -4
  186. metadata +134 -35
  187. data/lib/droonga/catalog/volume_collection.rb +0 -79
  188. data/lib/droonga/catalog_fetcher.rb +0 -53
  189. data/lib/droonga/catalog_generator.rb +0 -243
  190. data/lib/droonga/catalog_loader.rb +0 -56
  191. data/lib/droonga/command/remote.rb +0 -404
  192. data/lib/droonga/data_absorber.rb +0 -264
  193. data/lib/droonga/node_status.rb +0 -71
  194. data/lib/droonga/serf_downloader.rb +0 -115
  195. data/test/unit/catalog/test_volume_collection.rb +0 -78
@@ -0,0 +1,11 @@
1
+ {
2
+ "inReplyTo": "request-id",
3
+ "statusCode": 200,
4
+ "type": "system.statistics.object.count.result",
5
+ "body": {
6
+ "tables": 2,
7
+ "columns": 0,
8
+ "records": 0,
9
+ "total": 2
10
+ }
11
+ }
@@ -0,0 +1,13 @@
1
+ #@require-catalog-version 2
2
+ {
3
+ "type": "system.statistics.object.count",
4
+ "dataset": "Default",
5
+ "body": {
6
+ "output": [
7
+ "tables",
8
+ "columns",
9
+ "records",
10
+ "total"
11
+ ]
12
+ }
13
+ }
@@ -5,8 +5,9 @@
5
5
  "body": {
6
6
  "nodes": {
7
7
  "127.0.0.1:23003/droonga": {
8
- "live": true
8
+ "status": "active"
9
9
  }
10
- }
10
+ },
11
+ "reporter": "127.0.0.1:0/droonga @ 127.0.0.1:23003/droonga"
11
12
  }
12
13
  }
@@ -97,7 +97,10 @@ class CatalogDatasetTest < Test::Unit::TestCase
97
97
  "replicas" => [],
98
98
  }
99
99
  dataset = create_dataset(data)
100
- assert_equal(Droonga::Catalog::VolumeCollection.new([]),
100
+ raw_dataset = {
101
+ "replicas" => [],
102
+ }
103
+ assert_equal(Droonga::Catalog::ReplicasVolume.new(dataset, raw_dataset),
101
104
  dataset.replicas)
102
105
  end
103
106
  end
@@ -13,11 +13,11 @@
13
13
  # License along with this library; if not, write to the Free Software
14
14
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
15
 
16
- require "droonga/catalog_generator"
16
+ require "droonga/catalog/generator"
17
17
 
18
18
  class CatalogGeneratorTest < Test::Unit::TestCase
19
19
  def setup
20
- @generator = Droonga::CatalogGenerator.new
20
+ @generator = Droonga::Catalog::Generator.new
21
21
  @normalized_time_value = "2014-02-09T00:00:00Z"
22
22
  end
23
23
 
@@ -0,0 +1,79 @@
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/catalog/volume"
17
+ require "droonga/catalog/replicas_volume"
18
+
19
+ class CatalogReplicasTest < Test::Unit::TestCase
20
+ private
21
+ def create_replicas(raw_volume)
22
+ Droonga::Catalog::ReplicasVolume.new(nil, raw_volume)
23
+ end
24
+
25
+ class SelectTest < self
26
+ def setup
27
+ volume = {
28
+ "replicas" => [
29
+ { "address" => "volume1:10047/droonga.000" },
30
+ { "address" => "volume2:10047/droonga.000" },
31
+ { "address" => "volume3:10047/droonga.000" },
32
+ ],
33
+ }
34
+ @replicas = create_replicas(volume)
35
+ end
36
+
37
+ def test_top
38
+ hosts = @replicas.select(:top).collect do |volume|
39
+ volume.address.host
40
+ end
41
+ assert_equal(["volume1"],
42
+ hosts)
43
+ end
44
+
45
+ def test_random
46
+ random_volumes = @replicas.select(:random).collect do |volume|
47
+ volume.address.host.gsub(/\Avolume[123]\z/, "any volume")
48
+ end
49
+ assert_equal(["any volume"], random_volumes)
50
+ end
51
+
52
+ def test_all
53
+ hosts = @replicas.select(:all).collect do |volume|
54
+ volume.address.host
55
+ end
56
+ assert_equal(["volume1", "volume2", "volume3"],
57
+ hosts)
58
+ end
59
+ end
60
+
61
+ class NodesTest < self
62
+ def setup
63
+ volume = {
64
+ "replicas" => [
65
+ { "address" => "volume1:10047/droonga.000" },
66
+ { "address" => "volume1:10047/droonga.001" },
67
+ { "address" => "volume2:10047/droonga.002" },
68
+ { "address" => "volume2:10047/droonga.003" },
69
+ ],
70
+ }
71
+ @replicas = create_replicas(volume)
72
+ end
73
+
74
+ def test_all_nodes
75
+ assert_equal(["volume1:10047/droonga", "volume2:10047/droonga"],
76
+ @replicas.all_nodes)
77
+ end
78
+ end
79
+ end
@@ -24,11 +24,11 @@ class CatalogSingleVolumeTest < Test::Unit::TestCase
24
24
  @volume = Droonga::Catalog::SingleVolume.new(data)
25
25
  end
26
26
 
27
- def address(host, port, tag, name)
27
+ def address(host, port, tag, local_name)
28
28
  Droonga::Address.new(:host => host,
29
29
  :port => port,
30
30
  :tag => tag,
31
- :name => name)
31
+ :local_name => local_name)
32
32
  end
33
33
 
34
34
  def test_address
@@ -88,8 +88,10 @@ class CatalogSliceTest < Test::Unit::TestCase
88
88
  assert_equal("127.0.0.1:10047/volume.000",
89
89
  slice.volume.address.to_s)
90
90
  end
91
+ end
91
92
 
92
- def test_all_nodes
93
+ class AllNodesTest < self
94
+ def test_single
93
95
  data = {
94
96
  "volume" => {
95
97
  "address" => "127.0.0.1:10047/volume.000",
@@ -99,5 +101,35 @@ class CatalogSliceTest < Test::Unit::TestCase
99
101
  assert_equal(["127.0.0.1:10047/volume"],
100
102
  slice.all_nodes)
101
103
  end
104
+
105
+ def test_replicas
106
+ data = {
107
+ "volume" => {
108
+ "replicas" => [
109
+ { "address" => "127.0.0.1:10047/volume.000" },
110
+ ],
111
+ },
112
+ }
113
+ slice = create_slice(data)
114
+ assert_equal(["127.0.0.1:10047/volume"],
115
+ slice.all_nodes)
116
+ end
117
+
118
+ def test_slices
119
+ data = {
120
+ "volume" => {
121
+ "slices" => [
122
+ {
123
+ "volume" => {
124
+ "address" => "127.0.0.1:10047/volume.000",
125
+ },
126
+ },
127
+ ],
128
+ },
129
+ }
130
+ slice = create_slice(data)
131
+ assert_equal(["127.0.0.1:10047/volume"],
132
+ slice.all_nodes)
133
+ end
102
134
  end
103
135
  end
@@ -14,15 +14,16 @@
14
14
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
15
 
16
16
  require "droonga/catalog/dataset"
17
+ require "droonga/catalog/slices_volume"
17
18
 
18
19
  class CatalogSingleVolumeTest < Test::Unit::TestCase
19
- def create_collection_volume(data)
20
+ def create_slices(data)
20
21
  minimum_dataset_data = {
21
22
  "replicas" => {
22
23
  },
23
24
  }
24
25
  dataset = Droonga::Catalog::Dataset.new("DatasetName", minimum_dataset_data)
25
- Droonga::Catalog::CollectionVolume.new(dataset, data)
26
+ Droonga::Catalog::SlicesVolume.new(dataset, data)
26
27
  end
27
28
 
28
29
  class DimensionTest < self
@@ -30,7 +31,7 @@ class CatalogSingleVolumeTest < Test::Unit::TestCase
30
31
  data = {
31
32
  "slices" => [],
32
33
  }
33
- volume = create_collection_volume(data)
34
+ volume = create_slices(data)
34
35
  assert_equal("_key", volume.dimension)
35
36
  end
36
37
 
@@ -39,7 +40,7 @@ class CatalogSingleVolumeTest < Test::Unit::TestCase
39
40
  "dimension" => "group",
40
41
  "slices" => [],
41
42
  }
42
- volume = create_collection_volume(data)
43
+ volume = create_slices(data)
43
44
  assert_equal("group", volume.dimension)
44
45
  end
45
46
  end
@@ -49,7 +50,7 @@ class CatalogSingleVolumeTest < Test::Unit::TestCase
49
50
  data = {
50
51
  "slices" => [],
51
52
  }
52
- volume = create_collection_volume(data)
53
+ volume = create_slices(data)
53
54
  assert_equal("hash", volume.slicer)
54
55
  end
55
56
 
@@ -57,7 +58,7 @@ class CatalogSingleVolumeTest < Test::Unit::TestCase
57
58
  data = {
58
59
  "slicer" => "ordinal",
59
60
  }
60
- volume = create_collection_volume(data)
61
+ volume = create_slices(data)
61
62
  assert_equal("ordinal", volume.slicer)
62
63
  end
63
64
  end
@@ -67,7 +68,7 @@ class CatalogSingleVolumeTest < Test::Unit::TestCase
67
68
  data = {
68
69
  "slices" => [],
69
70
  }
70
- volume = create_collection_volume(data)
71
+ volume = create_slices(data)
71
72
  assert_equal([], volume.slices)
72
73
  end
73
74
  end
@@ -95,14 +96,14 @@ class CatalogSingleVolumeTest < Test::Unit::TestCase
95
96
 
96
97
  private
97
98
  def total_weight(data)
98
- volume = create_collection_volume(data)
99
+ volume = create_slices(data)
99
100
  volume.send(:compute_total_weight)
100
101
  end
101
102
  end
102
103
  end
103
104
 
104
- class NodesTest < self
105
- def test_all_nodes
105
+ class AllNodesTest < self
106
+ def test_slices
106
107
  data = {
107
108
  "slices" => [
108
109
  { "volume" => { "address" => "127.0.0.1:23003/droonga.000" } },
@@ -111,7 +112,67 @@ class CatalogSingleVolumeTest < Test::Unit::TestCase
111
112
  { "volume" => { "address" => "127.0.0.1:23004/droonga.101" } },
112
113
  ],
113
114
  }
114
- volume = create_collection_volume(data)
115
+ volume = create_slices(data)
116
+ assert_equal(["127.0.0.1:23003/droonga", "127.0.0.1:23004/droonga"],
117
+ volume.all_nodes)
118
+ end
119
+
120
+ def test_replicas_in_slice
121
+ data = {
122
+ "slices" => [
123
+ {
124
+ "volume" => {
125
+ "replicas" => [
126
+ { "address" => "127.0.0.1:23003/droonga.000" },
127
+ { "address" => "127.0.0.1:23003/droonga.001" },
128
+ ],
129
+ },
130
+ },
131
+ {
132
+ "volume" => {
133
+ "replicas" => [
134
+ { "address" => "127.0.0.1:23004/droonga.100" },
135
+ { "address" => "127.0.0.1:23004/droonga.101" },
136
+ ],
137
+ },
138
+ },
139
+ ],
140
+ }
141
+ volume = create_slices(data)
142
+ assert_equal(["127.0.0.1:23003/droonga", "127.0.0.1:23004/droonga"],
143
+ volume.all_nodes)
144
+ end
145
+
146
+ def test_slices_in_replicas_in_slice
147
+ data = {
148
+ "slices" => [
149
+ {
150
+ "volume" => {
151
+ "replicas" => [
152
+ {
153
+ "slices" => [
154
+ { "volume" => { "address" => "127.0.0.1:23003/droonga.000" } },
155
+ { "volume" => { "address" => "127.0.0.1:23003/droonga.001" } },
156
+ ],
157
+ },
158
+ ],
159
+ },
160
+ },
161
+ {
162
+ "volume" => {
163
+ "replicas" => [
164
+ {
165
+ "slices" => [
166
+ { "volume" => { "address" => "127.0.0.1:23004/droonga.100" } },
167
+ { "volume" => { "address" => "127.0.0.1:23004/droonga.101" } },
168
+ ],
169
+ },
170
+ ],
171
+ },
172
+ },
173
+ ],
174
+ }
175
+ volume = create_slices(data)
115
176
  assert_equal(["127.0.0.1:23003/droonga", "127.0.0.1:23004/droonga"],
116
177
  volume.all_nodes)
117
178
  end
@@ -47,18 +47,21 @@ class CatalogVersion2Test < Test::Unit::TestCase
47
47
  "localhost:23003/test.000" => {
48
48
  :database => "#{base_path}/databases/000/db",
49
49
  :dataset => "Test",
50
+ :label => "localhost:23003/test.000",
50
51
  :plugins => ["plugin1", "plugin2", "plugin3"],
51
52
  :n_workers => 4,
52
53
  },
53
54
  "localhost:23003/test.001" => {
54
55
  :database => "#{base_path}/databases/001/db",
55
56
  :dataset => "Test",
57
+ :label => "localhost:23003/test.001",
56
58
  :plugins => ["plugin1", "plugin2", "plugin3"],
57
59
  :n_workers => 4,
58
60
  },
59
61
  "localhost:23003/test.002" => {
60
62
  :database => "#{base_path}/databases/002/db",
61
63
  :dataset => "Test",
64
+ :label => "localhost:23003/test.002",
62
65
  :plugins => ["plugin1", "plugin2", "plugin3"],
63
66
  :n_workers => 4,
64
67
  },
@@ -22,8 +22,8 @@ module DistributedSearchPlannerHelper
22
22
  stub(stub_dataset).name do
23
23
  Droonga::Catalog::Dataset::DEFAULT_NAME
24
24
  end
25
- stub(stub_dataset).single_slice? do
26
- false
25
+ stub(stub_dataset).sliced? do
26
+ true
27
27
  end
28
28
  planner = Droonga::Plugins::Search::DistributedSearchPlanner.new(stub_dataset, search_request)
29
29
  planner.plan
@@ -34,10 +34,10 @@ class CatalogFetchHandlerTest < Test::Unit::TestCase
34
34
  @worker = StubWorker.new
35
35
  @messenger = Droonga::Test::StubHandlerMessenger.new
36
36
  @loop = nil
37
- @handler = Droonga::Plugins::Catalog::FetchHandler.new("name",
38
- @worker.context,
39
- @messenger,
40
- @loop)
37
+ @handler = Droonga::Plugins::Catalog::FetchHandler.new(:name => "name",
38
+ :context => @worker.context,
39
+ :messenger => @messenger,
40
+ :loop => @loop)
41
41
  end
42
42
 
43
43
  def teardown_handler
@@ -37,10 +37,10 @@ class CRUDAddHandlerTest < Test::Unit::TestCase
37
37
  @worker = StubWorker.new
38
38
  @messenger = Droonga::Test::StubHandlerMessenger.new
39
39
  @loop = nil
40
- @handler = Droonga::Plugins::CRUD::Handler.new("name",
41
- @worker.context,
42
- @messenger,
43
- @loop)
40
+ @handler = Droonga::Plugins::CRUD::Handler.new(:name => "name",
41
+ :context => @worker.context,
42
+ :messenger => @messenger,
43
+ :loop => @loop)
44
44
  end
45
45
 
46
46
  def teardown_handler
@@ -134,6 +134,46 @@ class CRUDAddHandlerTest < Test::Unit::TestCase
134
134
  end
135
135
  end
136
136
 
137
+ class MismatchedTypeKeyTest < self
138
+ class Acceptable < self
139
+ def test_integer_for_string
140
+ setup_table_with_key_type("ShortText")
141
+ request = {
142
+ "table" => "Users",
143
+ "key" => 1,
144
+ "values" => {},
145
+ }
146
+ response = process(request)
147
+ assert_equal(SUCCESS_RESPONSE_BODY, response)
148
+ table = @worker.context["Users"]
149
+ assert_equal(["1"], table.collect(&:key))
150
+ end
151
+
152
+ def test_string_for_integer
153
+ setup_table_with_key_type("UInt32")
154
+ request = {
155
+ "table" => "Users",
156
+ "key" => "1",
157
+ "values" => {},
158
+ }
159
+ response = process(request)
160
+ assert_equal(SUCCESS_RESPONSE_BODY, response)
161
+ table = @worker.context["Users"]
162
+ assert_equal([1], table.collect(&:key))
163
+ end
164
+ end
165
+
166
+ private
167
+ def setup_table_with_key_type(key_type)
168
+ Groonga::Schema.define do |schema|
169
+ schema.create_table("Users",
170
+ :type => :hash,
171
+ :key_type => key_type) do |table|
172
+ end
173
+ end
174
+ end
175
+ end
176
+
137
177
  class NoKeyTest < self
138
178
  def setup_schema
139
179
  Groonga::Schema.define do |schema|