droonga-engine 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +7 -0
- data/bin/droonga-engine-absorb-data +82 -0
- data/bin/droonga-engine-catalog-generate +16 -13
- data/bin/droonga-engine-catalog-modify +108 -0
- data/bin/droonga-engine-join +115 -0
- data/bin/droonga-engine-unjoin +90 -0
- data/doc/text/news.md +8 -0
- data/droonga-engine.gemspec +2 -1
- data/lib/droonga/buffered_tcp_socket.rb +132 -0
- data/lib/droonga/catalog_generator.rb +87 -4
- data/lib/droonga/command/droonga_engine.rb +27 -7
- data/lib/droonga/command/droonga_engine_service.rb +3 -2
- data/lib/droonga/command/serf_event_handler.rb +211 -14
- data/lib/droonga/data_absorber.rb +55 -0
- data/lib/droonga/dispatcher.rb +25 -11
- data/lib/droonga/engine/version.rb +1 -1
- data/lib/droonga/engine.rb +24 -24
- data/lib/droonga/engine_state.rb +23 -0
- data/lib/droonga/{catalog_observer.rb → file_observer.rb} +12 -7
- data/lib/droonga/fluent_message_sender.rb +24 -37
- data/lib/droonga/forwarder.rb +30 -5
- data/lib/droonga/handler_messenger.rb +3 -2
- data/lib/droonga/handler_runner.rb +29 -16
- data/lib/droonga/job_pusher.rb +12 -0
- data/lib/droonga/line_buffer.rb +42 -0
- data/lib/droonga/logger.rb +10 -6
- data/lib/droonga/path.rb +16 -0
- data/lib/droonga/plugins/search/distributed_search_planner.rb +1 -1
- data/lib/droonga/plugins/system.rb +50 -0
- data/lib/droonga/processor.rb +9 -4
- data/lib/droonga/safe_file_writer.rb +39 -0
- data/lib/droonga/serf.rb +212 -14
- data/lib/droonga/test/stub_handler_messenger.rb +3 -0
- data/lib/droonga/worker.rb +6 -1
- data/test/command/config/default/catalog.json +1 -1
- data/test/command/config/version1/catalog.json +2 -2
- data/test/command/suite/system/status.expected +12 -0
- data/test/command/suite/system/status.test +5 -0
- data/test/unit/plugins/system/test_status.rb +79 -0
- data/test/unit/test_catalog_generator.rb +1 -1
- data/test/unit/test_line_buffer.rb +62 -0
- metadata +46 -12
- data/lib/droonga/live_nodes_list_observer.rb +0 -72
data/lib/droonga/engine.rb
CHANGED
@@ -22,24 +22,21 @@ require "droonga/loggable"
|
|
22
22
|
require "droonga/engine_state"
|
23
23
|
require "droonga/catalog_loader"
|
24
24
|
require "droonga/dispatcher"
|
25
|
-
require "droonga/
|
25
|
+
require "droonga/file_observer"
|
26
|
+
require "droonga/live_nodes_list_loader"
|
26
27
|
|
27
28
|
module Droonga
|
28
29
|
class Engine
|
29
30
|
include Loggable
|
30
31
|
|
31
|
-
LAST_PROCESSED_TIMESTAMP = "last-processed.timestamp"
|
32
|
-
EFFECTIVE_MESSAGE_TIMESTAMP = "effective-message.timestamp"
|
33
|
-
|
34
32
|
def initialize(loop, name, internal_name)
|
35
33
|
@state = EngineState.new(loop, name, internal_name)
|
36
34
|
@catalog = load_catalog
|
37
|
-
@
|
35
|
+
@state.catalog = @catalog
|
38
36
|
@dispatcher = create_dispatcher
|
39
|
-
@live_nodes_list_observer =
|
40
|
-
@live_nodes_list_observer.
|
41
|
-
@live_nodes =
|
42
|
-
@dispatcher.live_nodes = live_nodes if @dispatcher
|
37
|
+
@live_nodes_list_observer = FileObserver.new(loop, Path.live_nodes)
|
38
|
+
@live_nodes_list_observer.on_change = lambda do
|
39
|
+
@state.live_nodes = load_live_nodes
|
43
40
|
end
|
44
41
|
end
|
45
42
|
|
@@ -95,22 +92,28 @@ module Droonga
|
|
95
92
|
catalog
|
96
93
|
end
|
97
94
|
|
95
|
+
def load_live_nodes
|
96
|
+
path = Path.live_nodes
|
97
|
+
loader = LiveNodesListLoader.new(path)
|
98
|
+
live_nodes = loader.load
|
99
|
+
logger.info("live-nodes loaded",
|
100
|
+
:path => path,
|
101
|
+
:mtime => path.mtime)
|
102
|
+
live_nodes
|
103
|
+
end
|
104
|
+
|
98
105
|
def create_dispatcher
|
99
|
-
|
100
|
-
dispatcher.live_nodes = @live_nodes
|
101
|
-
dispatcher
|
106
|
+
Dispatcher.new(@state, @catalog)
|
102
107
|
end
|
103
108
|
|
104
109
|
def output_last_processed_timestamp
|
105
|
-
|
110
|
+
path = Path.last_processed_timestamp
|
111
|
+
FileUtils.mkdir_p(path.dirname.to_s)
|
112
|
+
path.open("w") do |file|
|
106
113
|
file.write(@last_processed_timestamp)
|
107
114
|
end
|
108
115
|
end
|
109
116
|
|
110
|
-
def last_processed_timestamp_file
|
111
|
-
@last_processed_timestamp_file ||= File.join(Droonga::Path.state, LAST_PROCESSED_TIMESTAMP)
|
112
|
-
end
|
113
|
-
|
114
117
|
def effective_message?(message)
|
115
118
|
effective_timestamp = effective_message_timestamp
|
116
119
|
return true if effective_timestamp.nil?
|
@@ -118,14 +121,15 @@ module Droonga
|
|
118
121
|
message_timestamp = Time.parse(message["date"])
|
119
122
|
return false if effective_timestamp >= message_timestamp
|
120
123
|
|
121
|
-
FileUtils.rm(
|
124
|
+
FileUtils.rm(Path.effective_timestamp.to_s)
|
122
125
|
true
|
123
126
|
end
|
124
127
|
|
125
128
|
def effective_message_timestamp
|
126
|
-
|
129
|
+
path = Path.effective_message_timestamp
|
130
|
+
return nil unless path.exist?
|
127
131
|
|
128
|
-
timestamp =
|
132
|
+
timestamp = path.read
|
129
133
|
begin
|
130
134
|
Time.parse(timestamp)
|
131
135
|
rescue ArgumentError
|
@@ -133,10 +137,6 @@ module Droonga
|
|
133
137
|
end
|
134
138
|
end
|
135
139
|
|
136
|
-
def effective_message_timestamp_file
|
137
|
-
@effective_message_timestamp_file ||= File.join(Droonga::Path.state, EFFECTIVE_MESSAGE_TIMESTAMP)
|
138
|
-
end
|
139
|
-
|
140
140
|
def log_tag
|
141
141
|
"engine"
|
142
142
|
end
|
data/lib/droonga/engine_state.rb
CHANGED
@@ -32,6 +32,8 @@ module Droonga
|
|
32
32
|
attr_reader :forwarder
|
33
33
|
attr_reader :replier
|
34
34
|
attr_accessor :on_finish
|
35
|
+
attr_accessor :catalog
|
36
|
+
attr_writer :dead_nodes
|
35
37
|
def initialize(loop, name, internal_name)
|
36
38
|
@loop = loop
|
37
39
|
@name = name
|
@@ -39,8 +41,11 @@ module Droonga
|
|
39
41
|
@sessions = {}
|
40
42
|
@current_id = 0
|
41
43
|
@forwarder = Forwarder.new(@loop)
|
44
|
+
@forwarder.resume
|
42
45
|
@replier = Replier.new(@forwarder)
|
43
46
|
@on_finish = nil
|
47
|
+
@catalog = nil
|
48
|
+
@live_nodes = nil
|
44
49
|
end
|
45
50
|
|
46
51
|
def start
|
@@ -97,6 +102,24 @@ module Droonga
|
|
97
102
|
not @sessions.empty?
|
98
103
|
end
|
99
104
|
|
105
|
+
def all_nodes
|
106
|
+
@catalog.all_nodes
|
107
|
+
end
|
108
|
+
|
109
|
+
def live_nodes
|
110
|
+
@live_nodes || @catalog.all_nodes
|
111
|
+
end
|
112
|
+
|
113
|
+
def live_nodes=(nodes)
|
114
|
+
@live_nodes = nodes
|
115
|
+
@dead_nodes = all_nodes - @live_nodes
|
116
|
+
@live_nodes
|
117
|
+
end
|
118
|
+
|
119
|
+
def dead_nodes
|
120
|
+
@dead_nodes || []
|
121
|
+
end
|
122
|
+
|
100
123
|
private
|
101
124
|
def log_tag
|
102
125
|
"engine_state"
|
@@ -21,22 +21,26 @@ require "droonga/path"
|
|
21
21
|
require "droonga/loggable"
|
22
22
|
|
23
23
|
module Droonga
|
24
|
-
class
|
24
|
+
class FileObserver
|
25
25
|
include Loggable
|
26
26
|
|
27
27
|
CHECK_INTERVAL = 1
|
28
28
|
|
29
29
|
attr_accessor :on_change
|
30
30
|
|
31
|
-
def initialize(loop)
|
31
|
+
def initialize(loop, path)
|
32
32
|
@loop = loop
|
33
|
-
@path =
|
34
|
-
|
33
|
+
@path = path
|
34
|
+
if @path.exist?
|
35
|
+
@mtime = @path.mtime
|
36
|
+
else
|
37
|
+
@mtime = nil
|
38
|
+
end
|
35
39
|
@on_change = nil
|
36
40
|
end
|
37
41
|
|
38
42
|
def start
|
39
|
-
@watcher =
|
43
|
+
@watcher = Coolio::TimerWatcher.new(CHECK_INTERVAL, true)
|
40
44
|
on_timer = lambda do
|
41
45
|
if updated?
|
42
46
|
@mtime = @path.mtime
|
@@ -55,11 +59,12 @@ module Droonga
|
|
55
59
|
|
56
60
|
private
|
57
61
|
def updated?
|
58
|
-
@path.
|
62
|
+
return false unless @path.exist?
|
63
|
+
@mtime.nil? or @path.mtime > @mtime
|
59
64
|
end
|
60
65
|
|
61
66
|
def log_tag
|
62
|
-
"
|
67
|
+
"file-observer"
|
63
68
|
end
|
64
69
|
end
|
65
70
|
end
|
@@ -15,6 +15,7 @@
|
|
15
15
|
# License along with this library; if not, write to the Free Software
|
16
16
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
17
17
|
|
18
|
+
require "fileutils"
|
18
19
|
require "thread"
|
19
20
|
|
20
21
|
require "cool.io"
|
@@ -22,6 +23,7 @@ require "cool.io"
|
|
22
23
|
require "droonga/message-pack-packer"
|
23
24
|
|
24
25
|
require "droonga/loggable"
|
26
|
+
require "droonga/buffered_tcp_socket"
|
25
27
|
|
26
28
|
module Droonga
|
27
29
|
class FluentMessageSender
|
@@ -32,37 +34,40 @@ module Droonga
|
|
32
34
|
@host = host
|
33
35
|
@port = port
|
34
36
|
@socket = nil
|
35
|
-
@buffer = []
|
36
|
-
@write_mutex = Mutex.new
|
37
37
|
end
|
38
38
|
|
39
39
|
def start
|
40
40
|
logger.trace("start: start")
|
41
|
-
start_writer
|
42
41
|
logger.trace("start: done")
|
43
42
|
end
|
44
43
|
|
45
44
|
def shutdown
|
46
45
|
logger.trace("shutdown: start")
|
47
|
-
shutdown_writer
|
48
46
|
shutdown_socket
|
49
47
|
logger.trace("shutdown: done")
|
50
48
|
end
|
51
49
|
|
52
50
|
def send(tag, data)
|
53
51
|
logger.trace("send: start")
|
54
|
-
|
55
|
-
|
56
|
-
@
|
57
|
-
@buffer << packed_fluent_message
|
58
|
-
unless @signaling
|
59
|
-
@signaling = true
|
60
|
-
@writer.signal
|
61
|
-
end
|
62
|
-
end
|
52
|
+
packed_fluent_message = create_packed_fluent_message(tag, data)
|
53
|
+
connect unless connected?
|
54
|
+
@socket.write(packed_fluent_message)
|
63
55
|
logger.trace("send: done")
|
64
56
|
end
|
65
57
|
|
58
|
+
def reserve_send(tag, data)
|
59
|
+
logger.trace("reserve_send: start")
|
60
|
+
packed_fluent_message = create_packed_fluent_message(tag, data)
|
61
|
+
connect unless connected?
|
62
|
+
@socket.reserve_write(packed_fluent_message)
|
63
|
+
logger.trace("reserve_send: done")
|
64
|
+
end
|
65
|
+
|
66
|
+
def resume
|
67
|
+
connect
|
68
|
+
@socket.resume
|
69
|
+
end
|
70
|
+
|
66
71
|
private
|
67
72
|
def connected?
|
68
73
|
not @socket.nil?
|
@@ -85,7 +90,9 @@ module Droonga
|
|
85
90
|
@socket = nil
|
86
91
|
end
|
87
92
|
|
88
|
-
|
93
|
+
data_directory = Path.buffer + "#{@host}:#{@port}"
|
94
|
+
FileUtils.mkdir_p(data_directory.to_s)
|
95
|
+
@socket = BufferedTCPSocket.connect(@host, @port, data_directory)
|
89
96
|
@socket.on_write_complete do
|
90
97
|
log_write_complete.call
|
91
98
|
end
|
@@ -108,29 +115,9 @@ module Droonga
|
|
108
115
|
@socket.close unless @socket.closed?
|
109
116
|
end
|
110
117
|
|
111
|
-
def
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
on_signal = lambda do
|
116
|
-
@write_mutex.synchronize do
|
117
|
-
@signaling = false
|
118
|
-
connect unless connected?
|
119
|
-
@buffer.each do |data|
|
120
|
-
@socket.write(data)
|
121
|
-
end
|
122
|
-
@buffer.clear
|
123
|
-
end
|
124
|
-
end
|
125
|
-
@writer.on_signal do
|
126
|
-
on_signal.call
|
127
|
-
end
|
128
|
-
|
129
|
-
@loop.attach(@writer)
|
130
|
-
end
|
131
|
-
|
132
|
-
def shutdown_writer
|
133
|
-
@writer.detach
|
118
|
+
def create_packed_fluent_message(tag, data)
|
119
|
+
fluent_message = [tag, Time.now.to_i, data]
|
120
|
+
MessagePackPacker.pack(fluent_message)
|
134
121
|
end
|
135
122
|
|
136
123
|
def log_tag
|
data/lib/droonga/forwarder.rb
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
17
17
|
|
18
18
|
require "droonga/loggable"
|
19
|
+
require "droonga/path"
|
19
20
|
require "droonga/event_loop"
|
20
21
|
require "droonga/fluent_message_sender"
|
21
22
|
|
@@ -46,15 +47,35 @@ module Droonga
|
|
46
47
|
command = destination["type"]
|
47
48
|
receiver = destination["to"]
|
48
49
|
arguments = destination["arguments"]
|
49
|
-
|
50
|
+
reserve = destination["reserve"]
|
51
|
+
output(receiver, message, command, arguments, :reserve => reserve)
|
50
52
|
logger.trace("forward: done")
|
51
53
|
end
|
52
54
|
|
55
|
+
def resume
|
56
|
+
return unless Path.buffer.exist?
|
57
|
+
Pathname.glob("#{Path.buffer}/*") do |path|
|
58
|
+
next unless path.directory?
|
59
|
+
next if Pathname.glob("#{path.to_s}/*").empty?
|
60
|
+
|
61
|
+
destination = path.basename.to_s
|
62
|
+
next if @senders.key?(destination)
|
63
|
+
|
64
|
+
components = destination.split(":")
|
65
|
+
port = components.pop.to_i
|
66
|
+
next if port.zero?
|
67
|
+
host = components.join(":")
|
68
|
+
|
69
|
+
sender = create_sender(host, port)
|
70
|
+
sender.resume
|
71
|
+
@senders[destination] = sender
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
53
75
|
private
|
54
|
-
def output(receiver, message, command, arguments)
|
76
|
+
def output(receiver, message, command, arguments, options={})
|
55
77
|
logger.trace("output: start")
|
56
|
-
|
57
|
-
unless receiver.is_a?(String) and command.is_a?(String)
|
78
|
+
if not receiver.is_a?(String) or not command.is_a?(String)
|
58
79
|
logger.trace("output: abort: invalid argument",
|
59
80
|
:receiver => receiver,
|
60
81
|
:command => command)
|
@@ -83,7 +104,11 @@ module Droonga
|
|
83
104
|
output_tag = "#{tag}.message"
|
84
105
|
log_info = "<#{receiver}>:<#{output_tag}>"
|
85
106
|
logger.trace("output: post: start: #{log_info}")
|
86
|
-
|
107
|
+
if options[:reserve]
|
108
|
+
sender.reserve_send(output_tag, message)
|
109
|
+
else
|
110
|
+
sender.send(output_tag, message)
|
111
|
+
end
|
87
112
|
logger.trace("output: post: done: #{log_info}")
|
88
113
|
logger.trace("output: done")
|
89
114
|
end
|
@@ -18,14 +18,15 @@ require "droonga/forwarder"
|
|
18
18
|
|
19
19
|
module Droonga
|
20
20
|
class HandlerMessenger
|
21
|
-
attr_reader :database_name
|
21
|
+
attr_reader :database_name, :dispatcher, :engine_state
|
22
22
|
|
23
23
|
def initialize(forwarder, message, options={})
|
24
24
|
@forwarder = forwarder
|
25
25
|
@message = message
|
26
26
|
@options = options
|
27
27
|
@replier = Replier.new(@forwarder)
|
28
|
-
@dispatcher =
|
28
|
+
@dispatcher = options[:dispatcher]
|
29
|
+
@engine_state = options[:engine_state]
|
29
30
|
@database_name = options[:database]
|
30
31
|
end
|
31
32
|
|
@@ -16,7 +16,6 @@
|
|
16
16
|
require "groonga"
|
17
17
|
|
18
18
|
require "droonga/loggable"
|
19
|
-
require "droonga/forwarder"
|
20
19
|
require "droonga/handler_message"
|
21
20
|
require "droonga/handler_messenger"
|
22
21
|
require "droonga/step_runner"
|
@@ -36,18 +35,12 @@ module Droonga
|
|
36
35
|
|
37
36
|
def start
|
38
37
|
logger.trace("start: start")
|
39
|
-
@forwarder.start
|
40
38
|
logger.trace("start: done")
|
41
39
|
end
|
42
40
|
|
43
41
|
def shutdown
|
44
42
|
logger.trace("shutdown: start")
|
45
|
-
@
|
46
|
-
if @database
|
47
|
-
@database.close
|
48
|
-
@context.close
|
49
|
-
@database = @context = nil
|
50
|
-
end
|
43
|
+
close_database if @database
|
51
44
|
logger.trace("shutdown: done")
|
52
45
|
end
|
53
46
|
|
@@ -62,12 +55,17 @@ module Droonga
|
|
62
55
|
def process(message)
|
63
56
|
logger.trace("process: start")
|
64
57
|
type = message["type"]
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
58
|
+
if type == "database.reopen"
|
59
|
+
handler_class = nil
|
60
|
+
reopen
|
61
|
+
else
|
62
|
+
handler_class = find_handler_class(type)
|
63
|
+
if handler_class.nil?
|
64
|
+
logger.trace("process: done: no handler: <#{type}>")
|
65
|
+
return
|
66
|
+
end
|
67
|
+
process_type(handler_class, type, message)
|
69
68
|
end
|
70
|
-
process_type(handler_class, type, message)
|
71
69
|
logger.trace("process: done: <#{type}>",
|
72
70
|
:handler => handler_class)
|
73
71
|
end
|
@@ -75,13 +73,28 @@ module Droonga
|
|
75
73
|
private
|
76
74
|
def prepare
|
77
75
|
if @database_name and !@database_name.empty?
|
78
|
-
|
79
|
-
@database = @context.open_database(@database_name)
|
76
|
+
open_database
|
80
77
|
end
|
81
78
|
logger.debug("#{self.class.name}: activating plugins for the dataset \"#{@dataset_name}\": " +
|
82
79
|
"#{@options[:plugins].join(", ")}")
|
83
80
|
@step_runner = StepRunner.new(nil, @options[:plugins] || [])
|
84
|
-
@forwarder =
|
81
|
+
@forwarder = @options[:forwarder]
|
82
|
+
end
|
83
|
+
|
84
|
+
def close_database
|
85
|
+
@database.close
|
86
|
+
@context.close
|
87
|
+
@database = @context = nil
|
88
|
+
end
|
89
|
+
|
90
|
+
def open_database
|
91
|
+
@context = Groonga::Context.new
|
92
|
+
@database = @context.open_database(@database_name)
|
93
|
+
end
|
94
|
+
|
95
|
+
def reopen
|
96
|
+
close_database
|
97
|
+
open_database
|
85
98
|
end
|
86
99
|
|
87
100
|
def find_handler_class(type)
|
data/lib/droonga/job_pusher.rb
CHANGED
@@ -57,6 +57,12 @@ module Droonga
|
|
57
57
|
logger.trace("push: done")
|
58
58
|
end
|
59
59
|
|
60
|
+
def broadcast(message)
|
61
|
+
logger.trace("broadcast start")
|
62
|
+
@job_queue.broadcast(message)
|
63
|
+
logger.trace("broadcast done")
|
64
|
+
end
|
65
|
+
|
60
66
|
private
|
61
67
|
def log_tag
|
62
68
|
"job_pusher"
|
@@ -104,6 +110,12 @@ module Droonga
|
|
104
110
|
end
|
105
111
|
end
|
106
112
|
|
113
|
+
def broadcast(message)
|
114
|
+
@workers.each do |worker|
|
115
|
+
worker.write(message.to_msgpack)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
107
119
|
private
|
108
120
|
def supply_job(worker)
|
109
121
|
if @buffers.empty?
|
@@ -0,0 +1,42 @@
|
|
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
15
|
+
|
16
|
+
module Droonga
|
17
|
+
class LineBuffer
|
18
|
+
def initialize
|
19
|
+
@buffer = ""
|
20
|
+
end
|
21
|
+
|
22
|
+
def feed(data)
|
23
|
+
position = 0
|
24
|
+
loop do
|
25
|
+
new_line_position = data.index("\n", position)
|
26
|
+
if new_line_position.nil?
|
27
|
+
@buffer << data[position..-1]
|
28
|
+
break
|
29
|
+
end
|
30
|
+
|
31
|
+
line = data[position..new_line_position]
|
32
|
+
if position.zero?
|
33
|
+
yield(@buffer + line)
|
34
|
+
@buffer.clear
|
35
|
+
else
|
36
|
+
yield(line)
|
37
|
+
end
|
38
|
+
position = new_line_position + 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/droonga/logger.rb
CHANGED
@@ -49,12 +49,12 @@ module Droonga
|
|
49
49
|
LABELS[level]
|
50
50
|
end
|
51
51
|
|
52
|
-
def
|
53
|
-
|
52
|
+
def value(label)
|
53
|
+
LABELS.index(label.to_s)
|
54
54
|
end
|
55
55
|
|
56
|
-
def
|
57
|
-
label(
|
56
|
+
def default
|
57
|
+
ENV["DROONGA_LOG_LEVEL"] || label(WARN)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
@@ -73,7 +73,7 @@ module Droonga
|
|
73
73
|
def initialize(options={})
|
74
74
|
@output = options[:output] || self.class.default_output
|
75
75
|
@tag = options[:tag]
|
76
|
-
self.level =
|
76
|
+
self.level = options[:level] || Level.default
|
77
77
|
end
|
78
78
|
|
79
79
|
def level
|
@@ -81,7 +81,11 @@ module Droonga
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def level=(level)
|
84
|
-
|
84
|
+
if level.is_a?(Numeric)
|
85
|
+
@level = level
|
86
|
+
else
|
87
|
+
@level = Level.value(level)
|
88
|
+
end
|
85
89
|
end
|
86
90
|
|
87
91
|
def trace(message, data={})
|
data/lib/droonga/path.rb
CHANGED
@@ -38,10 +38,26 @@ module Droonga
|
|
38
38
|
base + "state"
|
39
39
|
end
|
40
40
|
|
41
|
+
def live_nodes
|
42
|
+
state + "live-nodes.json"
|
43
|
+
end
|
44
|
+
|
45
|
+
def last_processed_timestamp
|
46
|
+
state + "last-processed.timestamp"
|
47
|
+
end
|
48
|
+
|
49
|
+
def effective_message_timestamp
|
50
|
+
state + "effective-message.timestamp"
|
51
|
+
end
|
52
|
+
|
41
53
|
def catalog
|
42
54
|
base_file_name = ENV["DROONGA_CATALOG"] || "catalog.json"
|
43
55
|
Pathname.new(base_file_name).expand_path(base)
|
44
56
|
end
|
57
|
+
|
58
|
+
def buffer
|
59
|
+
state + "buffer"
|
60
|
+
end
|
45
61
|
end
|
46
62
|
end
|
47
63
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# Copyright (C) 2013-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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
15
|
+
|
16
|
+
require "droonga/plugin"
|
17
|
+
|
18
|
+
module Droonga
|
19
|
+
module Plugins
|
20
|
+
module System
|
21
|
+
extend Plugin
|
22
|
+
register("system")
|
23
|
+
|
24
|
+
class StatusHandler < Droonga::Handler
|
25
|
+
action.synchronous = true
|
26
|
+
|
27
|
+
def handle(message)
|
28
|
+
engine_state = @messenger.engine_state
|
29
|
+
live_nodes = engine_state.live_nodes
|
30
|
+
nodes = {}
|
31
|
+
engine_state.all_nodes.collect do |identifier|
|
32
|
+
nodes[identifier] = {
|
33
|
+
"live" => live_nodes.include?(identifier),
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
{
|
38
|
+
"nodes" => nodes,
|
39
|
+
}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
define_single_step do |step|
|
44
|
+
step.name = "system.status"
|
45
|
+
step.handler = StatusHandler
|
46
|
+
step.collector = Collectors::Or
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/droonga/processor.rb
CHANGED
@@ -15,7 +15,6 @@
|
|
15
15
|
|
16
16
|
require "droonga/loggable"
|
17
17
|
require "droonga/handler_runner"
|
18
|
-
require "fileutils"
|
19
18
|
|
20
19
|
module Droonga
|
21
20
|
class Processor
|
@@ -47,9 +46,9 @@ module Droonga
|
|
47
46
|
synchronous = @handler_runner.prefer_synchronous?(type)
|
48
47
|
if @n_workers.zero? or synchronous
|
49
48
|
@handler_runner.process(message)
|
50
|
-
|
51
|
-
|
52
|
-
|
49
|
+
if synchronous
|
50
|
+
@job_pusher.broadcast(database_reopen_message)
|
51
|
+
end
|
53
52
|
else
|
54
53
|
@job_pusher.push(message)
|
55
54
|
end
|
@@ -60,6 +59,12 @@ module Droonga
|
|
60
59
|
end
|
61
60
|
|
62
61
|
private
|
62
|
+
def database_reopen_message
|
63
|
+
{
|
64
|
+
"type" => "database.reopen",
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
63
68
|
def log_tag
|
64
69
|
"processor"
|
65
70
|
end
|