droonga-engine 1.0.9 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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|