droonga-engine 1.0.5 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/droonga-engine-absorb-data +2 -1
- data/bin/droonga-engine-catalog-generate +21 -5
- data/bin/droonga-engine-catalog-modify +22 -6
- data/bin/droonga-engine-configure +215 -0
- data/bin/droonga-engine-join +48 -123
- data/bin/droonga-engine-unjoin +14 -1
- data/doc/text/news.md +21 -0
- data/droonga-engine.gemspec +12 -10
- data/install/centos/droonga-engine +60 -0
- data/install/centos/functions.sh +35 -0
- data/install/debian/droonga-engine +155 -0
- data/install/debian/functions.sh +33 -0
- data/install.sh +360 -0
- data/lib/droonga/address.rb +3 -1
- data/lib/droonga/catalog/dataset.rb +2 -0
- data/lib/droonga/catalog/version1.rb +16 -3
- data/lib/droonga/catalog/version2.rb +16 -3
- data/lib/droonga/catalog_fetcher.rb +51 -0
- data/lib/droonga/catalog_generator.rb +6 -5
- data/lib/droonga/catalog_modifier.rb +45 -0
- data/lib/droonga/command/droonga_engine.rb +96 -29
- data/lib/droonga/command/droonga_engine_service.rb +5 -0
- data/lib/droonga/command/remote.rb +368 -0
- data/lib/droonga/command/serf_event_handler.rb +37 -304
- data/lib/droonga/dispatcher.rb +15 -1
- data/lib/droonga/engine/version.rb +1 -1
- data/lib/droonga/engine.rb +11 -4
- data/lib/droonga/engine_state.rb +2 -0
- data/lib/droonga/farm.rb +14 -5
- data/lib/droonga/fluent_message_receiver.rb +23 -6
- data/lib/droonga/fluent_message_sender.rb +5 -1
- data/lib/droonga/node_status.rb +67 -0
- data/lib/droonga/path.rb +28 -4
- data/lib/droonga/plugins/catalog.rb +40 -0
- data/lib/droonga/safe_file_writer.rb +1 -1
- data/lib/droonga/searcher.rb +3 -15
- data/lib/droonga/serf.rb +17 -32
- data/lib/droonga/serf_downloader.rb +26 -1
- data/lib/droonga/service_installation.rb +123 -0
- data/lib/droonga/session.rb +4 -0
- data/lib/droonga/slice.rb +22 -12
- data/lib/droonga/supervisor.rb +16 -2
- data/lib/droonga/worker_process_agent.rb +13 -1
- data/sample/droonga-engine.yaml +5 -0
- data/test/command/config/default/catalog.json +1 -1
- data/test/command/config/default/droonga-engine.yaml +4 -0
- data/test/command/config/version1/catalog.json +1 -1
- data/test/command/suite/catalog/fetch.expected +64 -0
- data/test/command/suite/catalog/fetch.test +6 -0
- data/test/unit/catalog/test_version1.rb +2 -2
- data/test/unit/catalog/test_version2.rb +3 -3
- data/test/unit/helper/sandbox.rb +3 -1
- data/test/unit/plugins/catalog/test_fetch.rb +76 -0
- data/test/unit/test_catalog_generator.rb +7 -3
- metadata +74 -27
- data/bin/droonga-engine-data-publisher +0 -66
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e2a22b317f8d67460835b19b148b87065317f62
|
4
|
+
data.tar.gz: 2dd51cbb6b2ed3f667474d45f0735f5626a989e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64d02366c1dc7945091afeec62787ea1082091edb08e34f844d32cbc39ebed5839ff36cf840c4dbd7c89dff92d95e5037fbdfeadaee58af129c1aeaea8316a5c
|
7
|
+
data.tar.gz: b7c88b9cab4a8f5b438d789cb78cee50080efb4d78b826829b1057a3412d7b930fe99ab52ee2e2d899e98ca3725c4df244461671598e51adf455dafb99d55ce7
|
@@ -79,7 +79,8 @@ end
|
|
79
79
|
destination_node = "#{options.destination_host}:#{options.port}/#{options.tag}"
|
80
80
|
|
81
81
|
def run_remote_command(target, command, options)
|
82
|
-
|
82
|
+
serf = Droonga::Serf.new(nil, target)
|
83
|
+
result = serf.send_query(command, options)
|
83
84
|
puts result[:result]
|
84
85
|
puts result[:error] unless result[:error].empty?
|
85
86
|
result[:response]
|
@@ -23,6 +23,10 @@ require "pathname"
|
|
23
23
|
require "droonga/engine/version"
|
24
24
|
require "droonga/catalog_generator"
|
25
25
|
require "droonga/safe_file_writer"
|
26
|
+
require "droonga/service_installation"
|
27
|
+
|
28
|
+
service_installation = Droonga::ServiceInstallation.new
|
29
|
+
service_installation.ensure_using_service_base_directory
|
26
30
|
|
27
31
|
generator = Droonga::CatalogGenerator.new
|
28
32
|
current_dataset = {}
|
@@ -31,7 +35,11 @@ datasets = {
|
|
31
35
|
}
|
32
36
|
|
33
37
|
options = OpenStruct.new
|
34
|
-
|
38
|
+
if service_installation.user_exist?
|
39
|
+
options.output_path = Droonga::Path.catalog
|
40
|
+
else
|
41
|
+
options.output_path = "-"
|
42
|
+
end
|
35
43
|
parser = OptionParser.new
|
36
44
|
parser.version = Droonga::Engine::VERSION
|
37
45
|
parser.on("--output=PATH",
|
@@ -98,21 +106,29 @@ if datasets[Droonga::CatalogGenerator::DEFAULT_DATASET].empty?
|
|
98
106
|
datasets.delete(Droonga::CatalogGenerator::DEFAULT_DATASET)
|
99
107
|
end
|
100
108
|
|
109
|
+
if service_installation.user_exist? and
|
110
|
+
options.output_path == Droonga::Path.catalog
|
111
|
+
options.for_service = true
|
112
|
+
end
|
113
|
+
|
101
114
|
datasets.each do |name, options|
|
102
115
|
generator.add_dataset(name, options)
|
103
116
|
end
|
104
117
|
|
105
118
|
def open_output(path)
|
106
119
|
if path == "-"
|
107
|
-
yield($stdout)
|
120
|
+
yield($stdout, nil)
|
108
121
|
else
|
109
|
-
Droonga::SafeFileWriter.write(path) do |output|
|
110
|
-
yield(output)
|
122
|
+
Droonga::SafeFileWriter.write(path) do |output, file|
|
123
|
+
yield(output, file)
|
111
124
|
end
|
112
125
|
end
|
113
126
|
end
|
114
127
|
|
115
128
|
catalog = generator.generate
|
116
|
-
open_output(options.output_path) do |output|
|
129
|
+
open_output(options.output_path) do |output, file|
|
117
130
|
output.puts(JSON.pretty_generate(catalog))
|
131
|
+
if file and options.for_service
|
132
|
+
service_installation.ensure_correct_file_permission(file)
|
133
|
+
end
|
118
134
|
end
|
@@ -23,6 +23,10 @@ require "pathname"
|
|
23
23
|
require "droonga/engine/version"
|
24
24
|
require "droonga/catalog_generator"
|
25
25
|
require "droonga/safe_file_writer"
|
26
|
+
require "droonga/service_installation"
|
27
|
+
|
28
|
+
service_installation = Droonga::ServiceInstallation.new
|
29
|
+
service_installation.ensure_using_service_base_directory
|
26
30
|
|
27
31
|
generator = Droonga::CatalogGenerator.new
|
28
32
|
current_dataset = {}
|
@@ -31,9 +35,14 @@ datasets = {
|
|
31
35
|
}
|
32
36
|
|
33
37
|
options = OpenStruct.new
|
34
|
-
options.source_path = "./catalog.json"
|
35
38
|
options.output_path = "-"
|
36
|
-
|
39
|
+
if service_installation.user_exist?
|
40
|
+
options.source_path = Droonga::Path.catalog
|
41
|
+
options.update = true
|
42
|
+
else
|
43
|
+
options.source_path = "./catalog.json"
|
44
|
+
options.update = false
|
45
|
+
end
|
37
46
|
parser = OptionParser.new
|
38
47
|
parser.version = Droonga::Engine::VERSION
|
39
48
|
parser.on("--source=PATH",
|
@@ -76,6 +85,10 @@ parser.parse!(ARGV)
|
|
76
85
|
if options.source_path != "-" and options.update
|
77
86
|
options.output_path = options.source_path
|
78
87
|
end
|
88
|
+
if service_installation.user_exist? and
|
89
|
+
options.output_path == Droonga::Path.catalog
|
90
|
+
options.for_service = true
|
91
|
+
end
|
79
92
|
|
80
93
|
def load_source(path)
|
81
94
|
source = nil
|
@@ -94,15 +107,18 @@ generator.modify(datasets)
|
|
94
107
|
|
95
108
|
def open_output(path)
|
96
109
|
if path == "-"
|
97
|
-
yield($stdout)
|
110
|
+
yield($stdout, nil)
|
98
111
|
else
|
99
|
-
Droonga::SafeFileWriter.write(path) do |output|
|
100
|
-
yield(output)
|
112
|
+
Droonga::SafeFileWriter.write(path) do |output, file|
|
113
|
+
yield(output, file)
|
101
114
|
end
|
102
115
|
end
|
103
116
|
end
|
104
117
|
|
105
118
|
catalog = generator.generate
|
106
|
-
open_output(options.output_path) do |output|
|
119
|
+
open_output(options.output_path) do |output, file|
|
107
120
|
output.puts(JSON.pretty_generate(catalog))
|
121
|
+
if file and options.for_service
|
122
|
+
service_installation.ensure_correct_file_permission(file)
|
123
|
+
end
|
108
124
|
end
|
@@ -0,0 +1,215 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (C) 2014 Droonga Project
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License version 2.1 as published by the Free Software Foundation.
|
8
|
+
#
|
9
|
+
# This library is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
12
|
+
# Lesser General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
15
|
+
# License along with this library; if not, write to the Free Software
|
16
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
17
|
+
|
18
|
+
require "optparse"
|
19
|
+
require "fileutils"
|
20
|
+
require "yaml"
|
21
|
+
|
22
|
+
require "droonga/path"
|
23
|
+
require "droonga/command/droonga_engine"
|
24
|
+
require "droonga/safe_file_writer"
|
25
|
+
require "droonga/service_installation"
|
26
|
+
|
27
|
+
options = {
|
28
|
+
:quiet => nil,
|
29
|
+
:clear => nil,
|
30
|
+
:reset_config => nil,
|
31
|
+
:reset_catalog => nil,
|
32
|
+
}
|
33
|
+
|
34
|
+
configuration = Droonga::Command::DroongaEngine::Configuration.new
|
35
|
+
parser = OptionParser.new
|
36
|
+
parser.on("--quiet", "Run with no prompt.") do |host|
|
37
|
+
options[:quiet] = true
|
38
|
+
end
|
39
|
+
parser.on("--clear", "Clear any existing data.") do |host|
|
40
|
+
options[:clear] = true
|
41
|
+
end
|
42
|
+
parser.on("--reset-config", "Regenerate the configuration file \"droonga-engine.yaml\".") do |host|
|
43
|
+
options[:reset_config] = true
|
44
|
+
end
|
45
|
+
parser.on("--reset-catalog", "Regenerate the \"catalog.json\".") do |host|
|
46
|
+
options[:reset_catalog] = true
|
47
|
+
end
|
48
|
+
configuration.add_command_line_options(parser)
|
49
|
+
parser.parse!(ARGV)
|
50
|
+
|
51
|
+
|
52
|
+
def unjoin(configuration)
|
53
|
+
system("droonga-engine-unjoin",
|
54
|
+
"--host", configuration.host,
|
55
|
+
:out => "/dev/null",
|
56
|
+
:err => "/dev/null")
|
57
|
+
end
|
58
|
+
|
59
|
+
def input(message, default_value=nil)
|
60
|
+
print "#{message} [#{default_value}]: "
|
61
|
+
response = gets.strip
|
62
|
+
if response.empty?
|
63
|
+
default_value
|
64
|
+
else
|
65
|
+
response
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def confirmed?(message)
|
70
|
+
while true
|
71
|
+
print "#{message} (y/N): "
|
72
|
+
response = gets
|
73
|
+
case response
|
74
|
+
when /\Ay/i
|
75
|
+
return true
|
76
|
+
when /\An/i, /^$/
|
77
|
+
return false
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def path_from_base_dir(path)
|
83
|
+
path = path.to_s
|
84
|
+
base = "#{Droonga::Path.base.to_s}/"
|
85
|
+
if path.start_with?(base)
|
86
|
+
path.sub(base, "")
|
87
|
+
else
|
88
|
+
path
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
service_installation = Droonga::ServiceInstallation.new
|
94
|
+
service_installation.ensure_using_service_base_directory
|
95
|
+
|
96
|
+
running = false
|
97
|
+
begin
|
98
|
+
if service_installation.running?
|
99
|
+
if !options[:quiet]
|
100
|
+
puts("The droonga-engine service is now running.")
|
101
|
+
puts("Before reconfiguration, the service is going to be stopped " +
|
102
|
+
"and this node will be unjoined from the cluster.")
|
103
|
+
unless confirmed?("Are you sure you want to continue reconfiguration?")
|
104
|
+
exit(false)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
running = true
|
108
|
+
end
|
109
|
+
rescue Droonga::ServiceInstallation::NotInstalledAsService
|
110
|
+
puts("Not installed as a service yet.")
|
111
|
+
end
|
112
|
+
|
113
|
+
unless service_installation.have_write_permission?
|
114
|
+
puts("You have no permission to write files under " +
|
115
|
+
"<#{Droonga::Path.base.to_s}>.")
|
116
|
+
puts("Try again with right permission.")
|
117
|
+
exit(false)
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
data_files = [
|
122
|
+
Droonga::Path.databases,
|
123
|
+
Droonga::Path.state,
|
124
|
+
]
|
125
|
+
have_data = data_files.any?(&:exist?)
|
126
|
+
options[:clear] = false unless have_data
|
127
|
+
|
128
|
+
if !options[:quiet] and options[:clear].nil?
|
129
|
+
options[:clear] = confirmed?("Do you want all data to be cleared?")
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
options[:reset_config] = true unless Droonga::Path.config.exist?
|
134
|
+
if !options[:quiet] and options[:reset_config].nil?
|
135
|
+
options[:reset_config] = confirmed?("Do you want the configuration file " +
|
136
|
+
"\"droonga-engine.yaml\" to be regenerated?")
|
137
|
+
end
|
138
|
+
|
139
|
+
options[:reset_catalog] = true unless Droonga::Path.catalog.exist?
|
140
|
+
if !options[:quiet] and options[:reset_catalog].nil?
|
141
|
+
options[:reset_catalog] = confirmed?("Do you want the file \"catalog.json\" " +
|
142
|
+
"to be regenerated?")
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
if running
|
147
|
+
unjoin(configuration)
|
148
|
+
service_installation.stop
|
149
|
+
end
|
150
|
+
|
151
|
+
if options[:clear]
|
152
|
+
data_files.each do |file|
|
153
|
+
FileUtils.rm_rf(file.to_s)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
if options[:reset_config] or options[:reset_catalog]
|
158
|
+
if configuration.have_given_host? or options[:quiet]
|
159
|
+
host = configuration.host
|
160
|
+
else
|
161
|
+
host = input("host", configuration.host)
|
162
|
+
end
|
163
|
+
|
164
|
+
if configuration.have_given_port? or options[:quiet]
|
165
|
+
port = configuration.port
|
166
|
+
else
|
167
|
+
port = input("port", configuration.port).to_i
|
168
|
+
end
|
169
|
+
|
170
|
+
if configuration.have_given_tag? or options[:quiet]
|
171
|
+
tag = configuration.tag
|
172
|
+
else
|
173
|
+
tag = input("tag", configuration.tag)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
if options[:reset_config]
|
178
|
+
if configuration.have_given_log_level? or options[:quiet]
|
179
|
+
log_level = configuration.log_level
|
180
|
+
else
|
181
|
+
log_level = input("log level", configuration.log_level)
|
182
|
+
end
|
183
|
+
|
184
|
+
new_configuration = {
|
185
|
+
"host" => host,
|
186
|
+
"port" => port,
|
187
|
+
"tag" => tag,
|
188
|
+
"log_file" => path_from_base_dir(Droonga::Path.default_log_file),
|
189
|
+
"log_level" => log_level,
|
190
|
+
}
|
191
|
+
Droonga::SafeFileWriter.write(Droonga::Path.config,
|
192
|
+
YAML.dump(new_configuration))
|
193
|
+
end
|
194
|
+
|
195
|
+
if options[:reset_catalog]
|
196
|
+
system("droonga-engine-catalog-generate",
|
197
|
+
"--output", Droonga::Path.catalog.to_s,
|
198
|
+
"--hosts", host,
|
199
|
+
"--port", port.to_s,
|
200
|
+
"--tag", tag)
|
201
|
+
end
|
202
|
+
|
203
|
+
if options[:reset_config] or options[:reset_catalog]
|
204
|
+
service_installation.ensure_correct_file_permission(Droonga::Path.base)
|
205
|
+
end
|
206
|
+
|
207
|
+
if running
|
208
|
+
successfully_started = service_installation.start
|
209
|
+
unless successfully_started
|
210
|
+
puts("The droonga-engine service is still stopped.")
|
211
|
+
puts("You need to start the service again manually.")
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
exit(true)
|
data/bin/droonga-engine-join
CHANGED
@@ -15,8 +15,7 @@
|
|
15
15
|
# License along with this library; if not, write to the Free Software
|
16
16
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
17
17
|
|
18
|
-
require "
|
19
|
-
require "optparse"
|
18
|
+
require "slop"
|
20
19
|
require "json"
|
21
20
|
require "pathname"
|
22
21
|
|
@@ -27,144 +26,70 @@ require "droonga/safe_file_writer"
|
|
27
26
|
require "droonga/data_absorber"
|
28
27
|
require "droonga/serf"
|
29
28
|
|
30
|
-
options =
|
31
|
-
|
32
|
-
options
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
parser.separator("")
|
54
|
-
parser.separator("Connections:")
|
55
|
-
parser.on("--host=HOST",
|
56
|
-
"Host name of the node to be joined.") do |host|
|
57
|
-
options.joining_host = host
|
58
|
-
end
|
59
|
-
parser.on("--replica-source-host=HOST",
|
60
|
-
"Host name of the soruce cluster to be connected.") do |host|
|
61
|
-
options.replica_source_host = host
|
62
|
-
end
|
63
|
-
parser.on("--dataset=DATASET",
|
64
|
-
"Tag dataset name of the cluster to be joined as a node.",
|
65
|
-
"(#{options.dataset})") do |dataset|
|
66
|
-
options.dataset = dataset
|
67
|
-
end
|
68
|
-
parser.on("--port=PORT", Integer,
|
69
|
-
"Port number of the source cluster to be connected.",
|
70
|
-
"(#{options.port})") do |port|
|
71
|
-
options.port = port
|
72
|
-
end
|
73
|
-
parser.on("--tag=TAG",
|
74
|
-
"Tag name of the soruce cluster to be connected.",
|
75
|
-
"(#{options.tag})") do |tag|
|
76
|
-
options.tag = tag
|
77
|
-
end
|
78
|
-
|
79
|
-
parser.parse!(ARGV)
|
80
|
-
|
81
|
-
|
82
|
-
base_dir = Pathname(options.base_dir).expand_path
|
83
|
-
ENV[Droonga::Path::BASE_DIR_ENV_NAME] = base_dir.to_s
|
84
|
-
|
85
|
-
catalog_path = Droonga::Path.catalog
|
86
|
-
unless catalog_path.exist?
|
87
|
-
raise "Cannot load 'catalog.json'. You must specify correct path " +
|
88
|
-
"to the base directory via --base-dir option."
|
89
|
-
end
|
90
|
-
source_catalog = JSON.parse(catalog_path.read)
|
91
|
-
|
92
|
-
|
93
|
-
unless options.joining_host
|
94
|
-
raise "You must specify the host name or the IP address of the node " +
|
95
|
-
"to be joined via --host option."
|
96
|
-
end
|
97
|
-
unless options.replica_source_host
|
98
|
-
raise "You must specify the host name or the IP address of a node " +
|
99
|
-
"of an existing cluster via --replica-source-host option."
|
100
|
-
end
|
101
|
-
|
102
|
-
|
103
|
-
generator = Droonga::CatalogGenerator.new
|
104
|
-
generator.load(source_catalog)
|
105
|
-
|
106
|
-
dataset = generator.dataset_for_host(options.replica_source_host)
|
107
|
-
if dataset
|
108
|
-
if generator.dataset_for_host(options.joining_host)
|
109
|
-
raise "The joining node is already a member of the cluster. " +
|
110
|
-
"You cannot join a member twice."
|
29
|
+
options = nil
|
30
|
+
begin
|
31
|
+
options = Slop.parse(:help => true) do |option|
|
32
|
+
option.on("no-copy", "Don't copy data from the source cluster.",
|
33
|
+
:default => false)
|
34
|
+
|
35
|
+
option.separator("Connections:")
|
36
|
+
option.on(:host=,
|
37
|
+
"Host name of the node to be joined.",
|
38
|
+
:required => true)
|
39
|
+
option.on("replica-source-host=",
|
40
|
+
"Host name of the soruce cluster to be connected.",
|
41
|
+
:required => true)
|
42
|
+
option.on(:dataset=,
|
43
|
+
"Tag dataset name of the cluster to be joined as a node.",
|
44
|
+
:default => Droonga::CatalogGenerator::DEFAULT_DATASET)
|
45
|
+
option.on(:port=,
|
46
|
+
"Port number of the source cluster to be connected.",
|
47
|
+
:as => Integer,
|
48
|
+
:default => Droonga::CatalogGenerator::DEFAULT_PORT)
|
49
|
+
option.on(:tag=,
|
50
|
+
"Tag name of the soruce cluster to be connected.",
|
51
|
+
:default => Droonga::CatalogGenerator::DEFAULT_TAG)
|
111
52
|
end
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
options.port = dataset.replicas.port
|
53
|
+
rescue Slop::MissingOptionError => e
|
54
|
+
$stderr.puts(e)
|
55
|
+
exit(false)
|
116
56
|
end
|
117
57
|
|
118
|
-
|
119
|
-
|
58
|
+
joining_node = "#{options[:host]}:#{options[:port]}/#{options[:tag]}"
|
59
|
+
source_node = "#{options["replica-source-host"]}:#{options[:port]}/#{options[:tag]}"
|
120
60
|
|
121
61
|
def run_remote_command(target, command, options)
|
122
|
-
|
123
|
-
|
124
|
-
puts
|
62
|
+
serf = Droonga::Serf.new(nil, target)
|
63
|
+
result = serf.send_query(command, options)
|
64
|
+
puts(result[:result])
|
65
|
+
puts(result[:error]) unless result[:error].empty?
|
125
66
|
result[:response]
|
126
67
|
end
|
127
68
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
"
|
134
|
-
"
|
135
|
-
sleep(3) # wait until the HTTP server becomes ready
|
136
|
-
=end
|
137
|
-
|
138
|
-
puts "Joining new replica to the cluster..."
|
139
|
-
run_remote_command(options.joining_node, "join",
|
140
|
-
"node" => options.joining_node,
|
141
|
-
"type" => "replica",
|
142
|
-
"source" => options.source_node,
|
143
|
-
# "fetch_port" => publish_port,
|
144
|
-
"copy" => options.copy)
|
69
|
+
puts("Joining new replica to the cluster...")
|
70
|
+
run_remote_command(joining_node, "join",
|
71
|
+
"node" => joining_node,
|
72
|
+
"type" => "replica",
|
73
|
+
"source" => source_node,
|
74
|
+
"dataset" => options[:dataset],
|
75
|
+
"copy" => !options["no-copy"])
|
145
76
|
sleep(5) #TODO: wait for restarting of the joining node. this should be done more safely.
|
146
77
|
|
147
78
|
while true
|
148
79
|
sleep(3)
|
149
|
-
response = run_remote_command(
|
150
|
-
"node" =>
|
151
|
-
"key"
|
80
|
+
response = run_remote_command(joining_node, "report_status",
|
81
|
+
"node" => joining_node,
|
82
|
+
"key" => "absorbing")
|
152
83
|
absorbing = response["value"]
|
153
84
|
break unless absorbing
|
154
85
|
end
|
155
86
|
|
156
|
-
puts
|
157
|
-
run_remote_command(
|
158
|
-
"dataset" => options
|
159
|
-
"hosts" => [options
|
87
|
+
puts("Update existing hosts in the cluster...")
|
88
|
+
run_remote_command(source_node, "add_replicas",
|
89
|
+
"dataset" => options[:dataset],
|
90
|
+
"hosts" => [options[:host]])
|
160
91
|
|
161
|
-
=begin
|
162
|
-
XXX disable fetching until it become working
|
163
|
-
run_remote_command(options.source_node, "unpublish_catalog",
|
164
|
-
"node" => options.source_node,
|
165
|
-
"port" => publish_port)
|
166
|
-
=end
|
167
92
|
|
168
|
-
puts
|
93
|
+
puts("Done.")
|
169
94
|
|
170
95
|
exit(true)
|
data/bin/droonga-engine-unjoin
CHANGED
@@ -24,8 +24,12 @@ require "droonga/engine/version"
|
|
24
24
|
require "droonga/path"
|
25
25
|
require "droonga/catalog_generator"
|
26
26
|
require "droonga/safe_file_writer"
|
27
|
+
require "droonga/service_installation"
|
27
28
|
require "droonga/serf"
|
28
29
|
|
30
|
+
service_installation = Droonga::ServiceInstallation.new
|
31
|
+
service_installation.ensure_using_service_base_directory
|
32
|
+
|
29
33
|
options = OpenStruct.new
|
30
34
|
options.base_dir = ENV[Droonga::Path::BASE_DIR_ENV_NAME] || Dir.pwd
|
31
35
|
|
@@ -48,6 +52,7 @@ parser.parse!(ARGV)
|
|
48
52
|
base_dir = Pathname(options.base_dir).expand_path
|
49
53
|
ENV[Droonga::Path::BASE_DIR_ENV_NAME] = base_dir.to_s
|
50
54
|
|
55
|
+
|
51
56
|
catalog_path = Droonga::Path.catalog
|
52
57
|
unless catalog_path.exist?
|
53
58
|
raise "Cannot load 'catalog.json'. You must specify correct path " +
|
@@ -59,6 +64,13 @@ unless options.replica_remove_host
|
|
59
64
|
"be removed from the cluster via --replica-remove-host option."
|
60
65
|
end
|
61
66
|
|
67
|
+
unless service_installation.have_read_permission?
|
68
|
+
puts("You have no permission to read files under " +
|
69
|
+
"<#{Droonga::Path.base.to_s}>.")
|
70
|
+
puts("Try again with right permission.")
|
71
|
+
exit(false)
|
72
|
+
end
|
73
|
+
|
62
74
|
source_catalog = JSON.parse(catalog_path.read)
|
63
75
|
generator = Droonga::CatalogGenerator.new
|
64
76
|
generator.load(source_catalog)
|
@@ -80,7 +92,8 @@ options.remaining_node = "#{remaining_host}:#{options.port}/#{options.tag}"
|
|
80
92
|
|
81
93
|
|
82
94
|
def run_remote_command(target, command, options)
|
83
|
-
|
95
|
+
serf = Droonga::Serf.new(nil, target)
|
96
|
+
result = serf.send_query(command, options)
|
84
97
|
puts result[:result]
|
85
98
|
puts result[:error] unless result[:error].empty?
|
86
99
|
end
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 1.0.6: 2014-09-29
|
4
|
+
|
5
|
+
* The installation script is now available.
|
6
|
+
It automatically installs required softwares and configure the `droonga-engine` as a system service.
|
7
|
+
Currently it works only for Debian, Ubuntu, and CentOS 7.
|
8
|
+
* The service works as a process belonging to a user `droonga-engine` who is specific for the service.
|
9
|
+
The configuration directory for the service is placed under the home directory of the user.
|
10
|
+
* A static configuration file to define default parameters (`host` and so on) is now available.
|
11
|
+
It must be placed into the directory same to `catalog.json`.
|
12
|
+
You don't have to run `droonga-engine` command with many options, anymore.
|
13
|
+
* `droonga-engine-join` now automatically fetches `catalog.json` from the specified source replica node.
|
14
|
+
Now you don't have to copy `catalog.json` from another node before you run `droonga-engine-join` anymore.
|
15
|
+
* A new `catalog` plugin is introduced as one of default plugins, to fetch `catalog.json` from existing cluster.
|
16
|
+
The list of plugins in your `catalog.json` must include it.
|
17
|
+
* A new command line utility `droonga-engine-configure` is available.
|
18
|
+
It generates the static configuration file, the `catalog.json` for the service.
|
19
|
+
Moreover, it clears old stored data to make the node empty.
|
20
|
+
* Some options for utility commands become optional.
|
21
|
+
Important parameters are automatically detected.
|
22
|
+
* Restarts server processes more gracefully.
|
23
|
+
|
3
24
|
## 1.0.5: 2014-07-29
|
4
25
|
|
5
26
|
* Restarts server processes more gracefully.
|
data/droonga-engine.gemspec
CHANGED
@@ -35,22 +35,24 @@ Gem::Specification.new do |gem|
|
|
35
35
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
36
36
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
37
37
|
gem.require_paths = ["lib"]
|
38
|
-
gem.add_dependency "
|
39
|
-
gem.add_dependency "groonga-command-parser"
|
40
|
-
gem.add_dependency "json"
|
38
|
+
gem.add_dependency "archive-zip"
|
41
39
|
gem.add_dependency "cool.io"
|
42
|
-
gem.add_dependency "
|
40
|
+
gem.add_dependency "drndump"
|
41
|
+
gem.add_dependency "droonga-client", ">= 0.1.9"
|
42
|
+
gem.add_dependency "droonga-message-pack-packer", ">= 1.0.2"
|
43
|
+
gem.add_dependency "groonga-command-parser"
|
43
44
|
gem.add_dependency "faraday"
|
44
45
|
gem.add_dependency "faraday_middleware"
|
45
|
-
gem.add_dependency "
|
46
|
+
gem.add_dependency "json"
|
47
|
+
gem.add_dependency "rroonga", ">= 4.0.4"
|
46
48
|
gem.add_dependency "sigdump"
|
47
|
-
gem.add_dependency "
|
48
|
-
gem.add_dependency "
|
49
|
-
gem.add_development_dependency "
|
49
|
+
gem.add_dependency "slop"
|
50
|
+
gem.add_dependency "sys-proctable"
|
51
|
+
gem.add_development_dependency "kramdown"
|
50
52
|
gem.add_development_dependency "bundler"
|
53
|
+
gem.add_development_dependency "packnga"
|
54
|
+
gem.add_development_dependency "rake"
|
51
55
|
gem.add_development_dependency "test-unit"
|
52
56
|
gem.add_development_dependency "test-unit-notify"
|
53
57
|
gem.add_development_dependency "test-unit-rr"
|
54
|
-
gem.add_development_dependency "packnga"
|
55
|
-
gem.add_development_dependency "kramdown"
|
56
58
|
end
|