fluent-plugin-droonga 0.9.9 → 1.0.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.
- checksums.yaml +4 -4
- data/.dir-locals.el +3 -0
- data/.travis.yml +6 -2
- data/README.md +6 -7
- data/Rakefile +23 -6
- data/fluent-plugin-droonga.gemspec +2 -2
- data/lib/droonga/adapter.rb +12 -3
- data/lib/droonga/adapter_runner.rb +28 -23
- data/lib/droonga/catalog/base.rb +7 -111
- data/lib/droonga/catalog/dataset.rb +13 -25
- data/lib/droonga/catalog/errors.rb +94 -0
- data/lib/droonga/catalog/schema.rb +277 -0
- data/lib/droonga/catalog/version1.rb +404 -0
- data/lib/droonga/catalog/version2.rb +160 -0
- data/lib/droonga/catalog_loader.rb +27 -4
- data/lib/droonga/catalog_observer.rb +44 -6
- data/lib/droonga/collector.rb +12 -10
- data/lib/droonga/{handler_plugin.rb → collector_message.rb} +47 -20
- data/lib/droonga/collector_runner.rb +64 -0
- data/lib/droonga/collectors.rb +18 -0
- data/lib/droonga/{catalog.rb → collectors/add.rb} +9 -7
- data/lib/droonga/{command_repository.rb → collectors/and.rb} +7 -14
- data/lib/droonga/collectors/sum.rb +26 -0
- data/lib/droonga/dispatcher.rb +74 -41
- data/lib/droonga/distributed_command_planner.rb +2 -2
- data/lib/droonga/engine.rb +13 -5
- data/lib/droonga/{message_processing_error.rb → error.rb} +33 -12
- data/lib/droonga/{plugin/planner/search.rb → error_messages.rb} +12 -10
- data/lib/droonga/farm.rb +15 -14
- data/lib/droonga/fluent_message_sender.rb +15 -11
- data/lib/droonga/forwarder.rb +22 -18
- data/lib/droonga/handler.rb +8 -2
- data/lib/droonga/handler_runner.rb +47 -26
- data/lib/droonga/input_message.rb +6 -6
- data/lib/droonga/{command.rb → loggable.rb} +7 -14
- data/lib/droonga/logger.rb +56 -15
- data/lib/droonga/message_matcher.rb +12 -7
- data/lib/droonga/message_pusher.rb +8 -4
- data/lib/droonga/message_receiver.rb +11 -9
- data/lib/droonga/output_message.rb +2 -0
- data/lib/droonga/planner.rb +21 -10
- data/lib/droonga/plugin.rb +15 -0
- data/lib/droonga/plugin/metadata/{adapter_message.rb → adapter_input_message.rb} +6 -14
- data/lib/droonga/plugin/metadata/adapter_output_message.rb +39 -0
- data/lib/droonga/plugin/metadata/collector_message.rb +39 -0
- data/lib/droonga/plugin/metadata/input_message.rb +15 -0
- data/lib/droonga/plugin_loader.rb +33 -25
- data/lib/droonga/plugin_registry.rb +9 -1
- data/lib/droonga/plugins/basic.rb +54 -0
- data/lib/droonga/plugins/crud.rb +36 -15
- data/lib/droonga/plugins/error.rb +5 -4
- data/lib/droonga/plugins/groonga.rb +9 -6
- data/lib/droonga/plugins/groonga/column_create.rb +10 -5
- data/lib/droonga/plugins/groonga/generic_command.rb +2 -8
- data/lib/droonga/plugins/groonga/generic_response.rb +2 -2
- data/lib/droonga/plugins/groonga/select.rb +2 -2
- data/lib/droonga/plugins/groonga/table_create.rb +9 -4
- data/lib/droonga/plugins/groonga/table_remove.rb +10 -5
- data/lib/droonga/plugins/search.rb +106 -5
- data/lib/droonga/plugins/search/distributed_search_planner.rb +398 -0
- data/lib/droonga/plugins/watch.rb +41 -20
- data/lib/droonga/processor.rb +12 -9
- data/lib/droonga/{plugin/collector/basic.rb → reducer.rb} +36 -50
- data/lib/droonga/replier.rb +7 -4
- data/lib/droonga/searcher.rb +40 -37
- data/lib/droonga/server.rb +8 -6
- data/lib/droonga/session.rb +17 -7
- data/lib/droonga/single_step.rb +53 -0
- data/lib/droonga/{plugin/planner/watch.rb → single_step_definition.rb} +27 -26
- data/lib/droonga/{partition.rb → slice.rb} +23 -12
- data/lib/droonga/status_code.rb +25 -0
- data/lib/droonga/step_runner.rb +63 -0
- data/lib/droonga/watch_schema.rb +7 -3
- data/lib/droonga/watcher.rb +4 -4
- data/lib/droonga/worker.rb +6 -6
- data/lib/fluent/plugin/out_droonga.rb +27 -2
- data/sample/cluster/catalog.json +33 -32
- data/test/command/config/default/catalog.json +72 -45
- data/test/command/config/version1/catalog.json +68 -0
- data/test/command/config/version1/fluentd.conf +11 -0
- data/test/command/suite/message/error/missing-dataset.expected +1 -1
- data/test/command/suite/message/error/unknown-dataset.expected +1 -1
- data/test/command/suite/message/error/unknown-type.expected +13 -0
- data/test/command/suite/message/error/{unknown-command.test → unknown-type.test} +1 -1
- data/test/command/suite/search/error/missing-source-parameter.expected +1 -1
- data/test/command/suite/search/error/unknown-source.expected +15 -3
- data/test/command/suite/watch/subscribe.expected +1 -3
- data/test/command/suite/watch/unsubscribe.expected +1 -3
- data/test/performance/watch/catalog.json +1 -0
- data/test/unit/catalog/test_dataset.rb +16 -358
- data/test/unit/catalog/test_schema.rb +285 -0
- data/test/unit/catalog/test_version1.rb +222 -28
- data/test/unit/catalog/test_version2.rb +155 -0
- data/test/unit/fixtures/catalog/version2.json +62 -0
- data/test/unit/helper/distributed_search_planner_helper.rb +2 -2
- data/test/unit/plugins/crud/test_add.rb +13 -13
- data/test/unit/plugins/groonga/test_column_create.rb +14 -11
- data/test/unit/plugins/groonga/test_table_create.rb +4 -9
- data/test/unit/plugins/groonga/test_table_remove.rb +4 -9
- data/test/unit/{plugin/planner/search_planner → plugins/search/planner}/test_basic.rb +0 -0
- data/test/unit/{plugin/planner/search_planner → plugins/search/planner}/test_group_by.rb +0 -0
- data/test/unit/{plugin/planner/search_planner → plugins/search/planner}/test_output.rb +0 -0
- data/test/unit/{plugin/planner/search_planner → plugins/search/planner}/test_sort_by.rb +0 -0
- data/test/unit/{plugin/collector/test_search.rb → plugins/search/test_collector.rb} +40 -39
- data/test/unit/plugins/{test_search.rb → search/test_handler.rb} +6 -5
- data/test/unit/{plugin/planner/test_search.rb → plugins/search/test_planner.rb} +3 -3
- data/test/unit/{plugin/collector → plugins}/test_basic.rb +68 -50
- data/test/unit/plugins/test_groonga.rb +2 -15
- data/test/unit/plugins/test_watch.rb +25 -22
- data/test/unit/test_message_matcher.rb +29 -6
- data/test/unit/test_output.rb +4 -0
- metadata +58 -50
- data/lib/droonga/collector_plugin.rb +0 -50
- data/lib/droonga/legacy_pluggable.rb +0 -66
- data/lib/droonga/legacy_plugin.rb +0 -57
- data/lib/droonga/legacy_plugin_repository.rb +0 -54
- data/lib/droonga/planner_plugin.rb +0 -54
- data/lib/droonga/plugin/collector/search.rb +0 -98
- data/lib/droonga/plugin/planner/crud.rb +0 -49
- data/lib/droonga/plugin/planner/distributed_search_planner.rb +0 -393
- data/lib/droonga/plugin/planner/groonga.rb +0 -54
- data/lib/droonga/plugin_registerable.rb +0 -75
- data/test/command/suite/message/error/unknown-command.expected +0 -13
- data/test/unit/test_command_repository.rb +0 -39
- data/test/unit/test_legacy_plugin.rb +0 -50
- data/test/unit/test_legacy_plugin_repository.rb +0 -89
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 611f2ebd66b47ba06e51dcba81545e17dc8759fb
|
|
4
|
+
data.tar.gz: 60378c2f9a04272698fbb64bbeb104ab7dd49b76
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 80eb92e66a2114940e77b7668941a2fd25d032d8caf1b3ca9752368b01027ed979049a4a90cfdcbb89a25e8ab85c3e91b7b9441da47fb2571a45b9e5fe271a71
|
|
7
|
+
data.tar.gz: a5dc67e0af98b68713b90ff8d15e8cf3923d86597d19777816a1a74391b5666295cfa74b3a569829b261e5eb629861cca79ecfcff3cbbb7259797f13e678a0e3
|
data/.dir-locals.el
ADDED
data/.travis.yml
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
notifications:
|
|
2
2
|
recipients:
|
|
3
3
|
- groonga-commit@lists.sourceforge.jp
|
|
4
|
+
env:
|
|
5
|
+
- DEFAULT_TEST_TASK=test:unit
|
|
6
|
+
- DEFAULT_TEST_TASK=test:command:default
|
|
7
|
+
- DEFAULT_TEST_TASK=test:command:version1
|
|
4
8
|
rvm:
|
|
5
9
|
- 1.9.3
|
|
6
10
|
- 2.0.0
|
|
7
|
-
- 2.1
|
|
8
|
-
- ruby-head
|
|
11
|
+
- 2.1
|
|
12
|
+
# - ruby-head
|
|
9
13
|
before_install:
|
|
10
14
|
- curl https://raw.github.com/groonga/groonga/master/data/travis/setup.sh | sh
|
data/README.md
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
# Fluent::Plugin::Droonga
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## What's "Droonga"?
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Droonga is a distributed fulltext search engine, named from "distributed-groonga".
|
|
8
|
-
This package provides droonga plugin for Fluent event collector.
|
|
5
|
+
Droonga is a scalable data processing engine, named from "Distributed
|
|
6
|
+
Groonga". Droonga can execute distributed fulltext search.
|
|
9
7
|
|
|
10
8
|
## Usage
|
|
11
9
|
|
|
12
|
-
|
|
10
|
+
See [droonga.org](http://droonga.org/). You can find overview, install
|
|
11
|
+
manual, reference manual and tutorial at the site.
|
|
13
12
|
|
|
14
13
|
## Copyright
|
|
15
14
|
|
|
16
|
-
* Copyright (c) 2013 Droonga Project
|
|
15
|
+
* Copyright (c) 2013-2014 Droonga Project
|
|
17
16
|
* License
|
|
18
17
|
* GNU Lesser General Public License version 2.1
|
data/Rakefile
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- ruby -*-
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2013 Droonga Project
|
|
3
|
+
# Copyright (C) 2013-2014 Droonga Project
|
|
4
4
|
#
|
|
5
5
|
# This library is free software; you can redistribute it and/or
|
|
6
6
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -29,19 +29,36 @@ Packnga::DocumentTask.new(spec) do |task|
|
|
|
29
29
|
task.translate_languages = ["ja"]
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
+
def run_command_test(*options)
|
|
33
|
+
ruby(File.join(File.dirname(__FILE__), "test", "command", "run-test.rb",),
|
|
34
|
+
*options)
|
|
35
|
+
end
|
|
36
|
+
|
|
32
37
|
namespace :test do
|
|
33
38
|
desc "Run unit test"
|
|
34
39
|
task :unit do
|
|
35
40
|
ruby(File.join(File.dirname(__FILE__), "test", "unit", "run-test.rb"))
|
|
36
41
|
end
|
|
37
42
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
namespace :command do
|
|
44
|
+
desc "Run command test: default"
|
|
45
|
+
task :default do
|
|
46
|
+
run_command_test
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
desc "Run command test: version1"
|
|
50
|
+
task :version1 do
|
|
51
|
+
run_command_test("--config", "version1")
|
|
52
|
+
end
|
|
41
53
|
end
|
|
42
54
|
end
|
|
43
55
|
|
|
44
56
|
desc "Run test"
|
|
45
|
-
task :test => [
|
|
57
|
+
task :test => [
|
|
58
|
+
"test:unit",
|
|
59
|
+
"test:command:default",
|
|
60
|
+
"test:command:version1",
|
|
61
|
+
]
|
|
46
62
|
|
|
47
|
-
|
|
63
|
+
test_task = ENV["DEFAULT_TEST_TASK"] || "test"
|
|
64
|
+
task :default => test_task
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
|
|
18
18
|
Gem::Specification.new do |gem|
|
|
19
19
|
gem.name = "fluent-plugin-droonga"
|
|
20
|
-
gem.version = "0.
|
|
20
|
+
gem.version = "1.0.0"
|
|
21
21
|
gem.authors = ["Droonga Project"]
|
|
22
22
|
gem.email = ["droonga@groonga.org"]
|
|
23
|
-
gem.description = "Droonga(distributed Groonga) plugin for Fluent event collector"
|
|
23
|
+
gem.description = "Droonga (distributed Groonga) plugin for Fluent event collector"
|
|
24
24
|
gem.summary = gem.description
|
|
25
25
|
gem.homepage = "https://github.com/droonga/fluent-plugin-droonga"
|
|
26
26
|
gem.files = `git ls-files`.split($/)
|
data/lib/droonga/adapter.rb
CHANGED
|
@@ -14,15 +14,24 @@
|
|
|
14
14
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
15
15
|
|
|
16
16
|
require "droonga/pluggable"
|
|
17
|
-
require "droonga/
|
|
17
|
+
require "droonga/loggable"
|
|
18
|
+
require "droonga/plugin/metadata/adapter_input_message"
|
|
19
|
+
require "droonga/plugin/metadata/adapter_output_message"
|
|
20
|
+
require "droonga/error_messages"
|
|
18
21
|
|
|
19
22
|
module Droonga
|
|
20
23
|
class Adapter
|
|
21
24
|
extend Pluggable
|
|
25
|
+
include Loggable
|
|
26
|
+
include ErrorMessages
|
|
22
27
|
|
|
23
28
|
class << self
|
|
24
|
-
def
|
|
25
|
-
Plugin::Metadata::
|
|
29
|
+
def input_message
|
|
30
|
+
Plugin::Metadata::AdapterInputMessage.new(self)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def output_message
|
|
34
|
+
Plugin::Metadata::AdapterOutputMessage.new(self)
|
|
26
35
|
end
|
|
27
36
|
|
|
28
37
|
def id
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
# License along with this library; if not, write to the Free Software
|
|
14
14
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
15
15
|
|
|
16
|
+
require "droonga/loggable"
|
|
16
17
|
require "droonga/message_matcher"
|
|
17
18
|
require "droonga/input_message"
|
|
18
19
|
require "droonga/output_message"
|
|
@@ -20,74 +21,78 @@ require "droonga/adapter"
|
|
|
20
21
|
|
|
21
22
|
module Droonga
|
|
22
23
|
class AdapterRunner
|
|
24
|
+
include Loggable
|
|
25
|
+
|
|
23
26
|
def initialize(dispatcher, plugins)
|
|
24
27
|
@dispatcher = dispatcher
|
|
25
28
|
default_plugins = ["error"]
|
|
26
29
|
plugins += (default_plugins - plugins)
|
|
30
|
+
logger.debug("activating plugins: #{plugins.join(", ")}")
|
|
27
31
|
@adapter_classes = Adapter.find_sub_classes(plugins)
|
|
32
|
+
logger.debug("activated:\n#{@adapter_classes.join("\n")}")
|
|
28
33
|
end
|
|
29
34
|
|
|
30
35
|
def shutdown
|
|
31
36
|
end
|
|
32
37
|
|
|
33
38
|
def adapt_input(message)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
logger.trace("adapt_input: start",
|
|
40
|
+
:dataset => message["dataset"],
|
|
41
|
+
:type => message["type"])
|
|
37
42
|
adapted_message = message
|
|
38
43
|
adapted_message["appliedAdapters"] = []
|
|
39
44
|
@adapter_classes.each do |adapter_class|
|
|
40
45
|
adapter_class_id = adapter_class.id
|
|
41
|
-
pattern = adapter_class.
|
|
46
|
+
pattern = adapter_class.input_message.pattern
|
|
42
47
|
if pattern
|
|
43
48
|
matcher = MessageMatcher.new(pattern)
|
|
44
|
-
|
|
45
|
-
|
|
49
|
+
logger.trace("adapt_input: skip: #{adapter_class_id}",
|
|
50
|
+
:pattern => pattern)
|
|
46
51
|
next unless matcher.match?(adapted_message)
|
|
47
52
|
end
|
|
48
|
-
|
|
53
|
+
logger.trace("adapt_input: use: #{adapter_class_id}")
|
|
49
54
|
input_message = InputMessage.new(adapted_message)
|
|
50
55
|
adapter = adapter_class.new
|
|
51
56
|
adapter.adapt_input(input_message)
|
|
52
57
|
adapted_message = input_message.adapted_message
|
|
53
58
|
adapted_message["appliedAdapters"] << adapter_class_id
|
|
54
59
|
end
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
60
|
+
logger.trace("adapt_input: done",
|
|
61
|
+
:dataset => adapted_message["dataset"],
|
|
62
|
+
:type => adapted_message["type"])
|
|
58
63
|
adapted_message
|
|
59
64
|
end
|
|
60
65
|
|
|
61
66
|
def adapt_output(message)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
67
|
+
logger.trace("adapt_output: start",
|
|
68
|
+
:dataset => message["dataset"],
|
|
69
|
+
:type => message["type"])
|
|
65
70
|
adapted_message = message
|
|
66
71
|
applied_adapters = adapted_message["appliedAdapters"]
|
|
67
72
|
@adapter_classes.reverse_each do |adapter_class|
|
|
68
73
|
adapter_class_id = adapter_class.id
|
|
69
74
|
if applied_adapters
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
75
|
+
logger.trace("adapt_output: skip: #{adapter_class_id}: " +
|
|
76
|
+
"input adapter wasn't applied",
|
|
77
|
+
:applied_adapters => applied_adapters)
|
|
73
78
|
next unless applied_adapters.include?(adapter_class.id)
|
|
74
79
|
end
|
|
75
|
-
pattern = adapter_class.
|
|
80
|
+
pattern = adapter_class.output_message.pattern
|
|
76
81
|
if pattern
|
|
77
82
|
matcher = MessageMatcher.new(pattern)
|
|
78
|
-
|
|
79
|
-
|
|
83
|
+
logger.trace("adapt_output: skip: #{adapter_class_id}",
|
|
84
|
+
:pattern => pattern)
|
|
80
85
|
next unless matcher.match?(adapted_message)
|
|
81
86
|
end
|
|
82
|
-
|
|
87
|
+
logger.trace("adapt_output: use: #{adapter_class_id}")
|
|
83
88
|
output_message = OutputMessage.new(adapted_message)
|
|
84
89
|
adapter = adapter_class.new
|
|
85
90
|
adapter.adapt_output(output_message)
|
|
86
91
|
adapted_message = output_message.adapted_message
|
|
87
92
|
end
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
93
|
+
logger.trace("adapt_output: done",
|
|
94
|
+
:dataset => adapted_message["dataset"],
|
|
95
|
+
:type => adapted_message["type"])
|
|
91
96
|
adapted_message
|
|
92
97
|
end
|
|
93
98
|
|
data/lib/droonga/catalog/base.rb
CHANGED
|
@@ -15,101 +15,18 @@
|
|
|
15
15
|
|
|
16
16
|
require "digest/sha1"
|
|
17
17
|
require "zlib"
|
|
18
|
-
require "
|
|
18
|
+
require "time"
|
|
19
|
+
require "droonga/error_messages"
|
|
20
|
+
require "droonga/catalog/errors"
|
|
19
21
|
|
|
20
22
|
module Droonga
|
|
21
23
|
module Catalog
|
|
22
24
|
class Base
|
|
23
|
-
attr_reader :base_path
|
|
24
|
-
def initialize(data,
|
|
25
|
+
attr_reader :path, :base_path
|
|
26
|
+
def initialize(data, path)
|
|
25
27
|
@data = data
|
|
26
|
-
@
|
|
27
|
-
|
|
28
|
-
@data["datasets"].each do |name, dataset|
|
|
29
|
-
number_of_partitions = dataset["number_of_partitions"]
|
|
30
|
-
next if number_of_partitions < 2
|
|
31
|
-
total_weight = compute_total_weight(dataset)
|
|
32
|
-
continuum = []
|
|
33
|
-
dataset["ring"].each do |key, value|
|
|
34
|
-
points = number_of_partitions * 160 * value["weight"] / total_weight
|
|
35
|
-
points.times do |point|
|
|
36
|
-
hash = Digest::SHA1.hexdigest("#{key}:#{point}")
|
|
37
|
-
continuum << [hash[0..7].to_i(16), key]
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
dataset["continuum"] = continuum.sort do |a, b| a[0] - b[0]; end
|
|
41
|
-
end
|
|
42
|
-
@options = @data["options"] || {}
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def option(name)
|
|
46
|
-
@options[name]
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def get_partitions(name)
|
|
50
|
-
device = @data["farms"][name]["device"]
|
|
51
|
-
pattern = Regexp.new("^#{name}\.")
|
|
52
|
-
results = {}
|
|
53
|
-
@data["datasets"].each do |key, dataset|
|
|
54
|
-
workers = dataset["workers"]
|
|
55
|
-
plugins = dataset["plugins"]
|
|
56
|
-
dataset["ring"].each do |key, part|
|
|
57
|
-
part["partitions"].each do |range, partitions|
|
|
58
|
-
partitions.each do |partition|
|
|
59
|
-
if partition =~ pattern
|
|
60
|
-
path = File.join([device, $POSTMATCH, "db"])
|
|
61
|
-
path = File.expand_path(path, base_path)
|
|
62
|
-
options = {
|
|
63
|
-
:database => path,
|
|
64
|
-
:n_workers => workers,
|
|
65
|
-
:plugins => plugins
|
|
66
|
-
}
|
|
67
|
-
results[partition] = options
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
return results
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def get_routes(name, args)
|
|
77
|
-
routes = []
|
|
78
|
-
dataset = dataset(name)
|
|
79
|
-
case args["type"]
|
|
80
|
-
when "broadcast"
|
|
81
|
-
dataset["ring"].each do |key, partition|
|
|
82
|
-
select_range_and_replicas(partition, args, routes)
|
|
83
|
-
end
|
|
84
|
-
when "scatter"
|
|
85
|
-
name = get_partition(dataset, args["key"])
|
|
86
|
-
partition = dataset["ring"][name]
|
|
87
|
-
select_range_and_replicas(partition, args, routes)
|
|
88
|
-
end
|
|
89
|
-
return routes
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def get_partition(dataset, key)
|
|
93
|
-
continuum = dataset["continuum"]
|
|
94
|
-
return dataset["ring"].keys[0] unless continuum
|
|
95
|
-
hash = Zlib.crc32(key)
|
|
96
|
-
min = 0
|
|
97
|
-
max = continuum.size - 1
|
|
98
|
-
while (min < max) do
|
|
99
|
-
index = (min + max) / 2
|
|
100
|
-
value, key = continuum[index]
|
|
101
|
-
return key if value == hash
|
|
102
|
-
if value > hash
|
|
103
|
-
max = index
|
|
104
|
-
else
|
|
105
|
-
min = index + 1
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
return continuum[max][1]
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def datasets
|
|
112
|
-
@data["datasets"] || {}
|
|
28
|
+
@path = path
|
|
29
|
+
@base_path = File.dirname(path)
|
|
113
30
|
end
|
|
114
31
|
|
|
115
32
|
def have_dataset?(name)
|
|
@@ -119,27 +36,6 @@ module Droonga
|
|
|
119
36
|
def dataset(name)
|
|
120
37
|
datasets[name]
|
|
121
38
|
end
|
|
122
|
-
|
|
123
|
-
def select_range_and_replicas(partition, args, routes)
|
|
124
|
-
date_range = args["date_range"] || 0..-1
|
|
125
|
-
partition["partitions"].sort[date_range].each do |time, replicas|
|
|
126
|
-
case args["replica"]
|
|
127
|
-
when "top"
|
|
128
|
-
routes << replicas[0]
|
|
129
|
-
when "random"
|
|
130
|
-
routes << replicas[rand(replicas.size)]
|
|
131
|
-
when "all"
|
|
132
|
-
routes.concat(replicas)
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
private
|
|
138
|
-
def compute_total_weight(dataset)
|
|
139
|
-
dataset["ring"].reduce(0) do |result, zone|
|
|
140
|
-
result + zone[1]["weight"]
|
|
141
|
-
end
|
|
142
|
-
end
|
|
143
39
|
end
|
|
144
40
|
end
|
|
145
41
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (C)
|
|
1
|
+
# Copyright (C) 2014 Droonga Project
|
|
2
2
|
#
|
|
3
3
|
# This library is free software; you can redistribute it and/or
|
|
4
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -13,41 +13,29 @@
|
|
|
13
13
|
# License along with this library; if not, write to the Free Software
|
|
14
14
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
15
15
|
|
|
16
|
-
require "
|
|
16
|
+
require "droonga/catalog/schema"
|
|
17
17
|
|
|
18
18
|
module Droonga
|
|
19
19
|
module Catalog
|
|
20
20
|
class Dataset
|
|
21
|
-
def initialize(data)
|
|
21
|
+
def initialize(name, data)
|
|
22
|
+
@name = name
|
|
22
23
|
@data = data
|
|
24
|
+
@schema = nil
|
|
23
25
|
end
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
# provided for compatibility
|
|
28
|
+
def [](key)
|
|
29
|
+
@data[key]
|
|
27
30
|
end
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
def
|
|
31
|
-
|
|
32
|
-
return [] if number_of_partitions < 2
|
|
33
|
-
total_weight = compute_total_weight
|
|
34
|
-
continuum = []
|
|
35
|
-
@data["ring"].each do |key, value|
|
|
36
|
-
points = number_of_partitions * 160 * value["weight"] / total_weight
|
|
37
|
-
points.times do |point|
|
|
38
|
-
hash = Digest::SHA1.hexdigest("#{key}:#{point}")
|
|
39
|
-
continuum << [hash[0..7].to_i(16), key]
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
continuum.sort do |a, b|
|
|
43
|
-
a[0] - b[0]
|
|
44
|
-
end
|
|
32
|
+
# provided for compatibility
|
|
33
|
+
def []=(key, value)
|
|
34
|
+
@data[key] = value
|
|
45
35
|
end
|
|
46
36
|
|
|
47
|
-
def
|
|
48
|
-
@data["
|
|
49
|
-
result + zone[1]["weight"]
|
|
50
|
-
end
|
|
37
|
+
def schema
|
|
38
|
+
@schema ||= Droonga::Catalog::Schema.new(@name, @data["schema"])
|
|
51
39
|
end
|
|
52
40
|
end
|
|
53
41
|
end
|