dango 0.4.8 → 0.5.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.
- data/lib/dango/client_framework.rb +13 -12
- data/lib/dango/controller_plugin/dango_controller_plugin.rb +7 -3
- data/lib/dango/dango_g_server.rb +7 -6
- data/lib/dango/dango_logger.rb +115 -0
- data/lib/dango/dango_mutex.rb +64 -0
- data/lib/dango/default_dango_receive.rb +140 -0
- data/lib/dango/error_message.rb +30 -0
- data/lib/dango/framework_base.rb +112 -79
- data/lib/dango/monitor/server_monitor_module.rb +131 -0
- data/lib/dango/server_framework.rb +215 -145
- data/lib/dango/session_manager.rb +15 -10
- data/lib/dango/shared/memory_store.rb +10 -10
- data/lib/dango/socket_list.rb +5 -5
- data/lib/dango/tasks/dango_rake.rb +379 -166
- data/lib/dango/tester/dango_tester_client.rb +1 -6
- data/lib/dango/version.rb +2 -2
- metadata +8 -3
@@ -3,13 +3,14 @@
|
|
3
3
|
# sessionとsidの管理(1セッションごとにインスタンス化される)
|
4
4
|
class SessionManager
|
5
5
|
MaxSidCounter = 999999
|
6
|
-
|
6
|
+
|
7
|
+
# initialize
|
7
8
|
def initialize(shared, rails_env)
|
8
9
|
@shared = shared
|
9
10
|
@rails_env = rails_env
|
10
11
|
|
11
12
|
@session_list = {}
|
12
|
-
@session_mutex =
|
13
|
+
@session_mutex = DangoMutex.new(:session_mutex)
|
13
14
|
|
14
15
|
@shared[:_session_manager] = {}
|
15
16
|
end
|
@@ -17,26 +18,30 @@ class SessionManager
|
|
17
18
|
|
18
19
|
# session開始
|
19
20
|
def start_session()
|
20
|
-
|
21
|
+
sid = nil
|
22
|
+
@session_mutex.timeout_sync(3, :start_session) do
|
21
23
|
sid = generate_sid()
|
22
|
-
@session_list[Thread.current.object_id] = {:sid => sid}
|
23
24
|
end
|
25
|
+
@session_list[Thread.current.object_id] = {:sid => sid}
|
24
26
|
end
|
25
27
|
|
26
28
|
# session終了
|
27
29
|
def close_session(sid)
|
28
|
-
@session_mutex.
|
30
|
+
@session_mutex.timeout_sync(3, :close_session) do
|
29
31
|
drop_sid()
|
30
|
-
# @session_list[Thread.current.object_id] = nil
|
31
|
-
@session_list.delete(Thread.current.object_id)
|
32
32
|
end
|
33
|
+
# @session_list[Thread.current.object_id] = nil
|
34
|
+
@session_list.delete(Thread.current.object_id)
|
33
35
|
end
|
34
36
|
|
35
37
|
# sessionへのアクセス
|
36
38
|
def session
|
37
|
-
@
|
38
|
-
|
39
|
-
|
39
|
+
@session_list[Thread.current.object_id]
|
40
|
+
end
|
41
|
+
|
42
|
+
# session_listへのアクセス
|
43
|
+
def session_list
|
44
|
+
@session_list
|
40
45
|
end
|
41
46
|
|
42
47
|
|
@@ -12,7 +12,7 @@ module DangoFrameworkModule
|
|
12
12
|
@config = config
|
13
13
|
@data = {}
|
14
14
|
@mutex = {}
|
15
|
-
# @mutex =
|
15
|
+
# @mutex = DangoMutex.new(:shared_mutex)
|
16
16
|
|
17
17
|
@transact_key = {}
|
18
18
|
@transact_thread = {}
|
@@ -42,8 +42,8 @@ module DangoFrameworkModule
|
|
42
42
|
raise(DangoFrameworkException, "Shared key is not exist.")
|
43
43
|
end
|
44
44
|
|
45
|
-
# @mutex[key].
|
46
|
-
@mutex.
|
45
|
+
# @mutex[key].timeout_sync(3, "transaction_old #{key}") do
|
46
|
+
@mutex.timeout_sync(3, "transaction_old") do
|
47
47
|
# data = yield(@data[key].deep_dup)
|
48
48
|
data = yield(@data[key])
|
49
49
|
@data[key] = data.deep_dup
|
@@ -66,8 +66,8 @@ module DangoFrameworkModule
|
|
66
66
|
raise(DangoFrameworkException, "Shared key is not exist.")
|
67
67
|
end
|
68
68
|
|
69
|
-
@mutex[key].
|
70
|
-
# @mutex.
|
69
|
+
@mutex[key].timeout_sync(3, "transaction #{key}") do
|
70
|
+
# @mutex.timeout_sync(3, "transaction") do
|
71
71
|
@transact_key[Thread.current] = key # 違うスレッドからcommitできないように
|
72
72
|
|
73
73
|
raise("nested transaction #{key}") if @transact_thread.has_key?(key)
|
@@ -148,8 +148,8 @@ module DangoFrameworkModule
|
|
148
148
|
# raise(DangoFrameworkException, "Shared key is not exist.")
|
149
149
|
end
|
150
150
|
|
151
|
-
@mutex[key].
|
152
|
-
# @mutex.
|
151
|
+
@mutex[key].timeout_sync(3, "[] #{key}") do
|
152
|
+
# @mutex.timeout_sync(3, "[]") do
|
153
153
|
@data[key].deep_dup
|
154
154
|
end
|
155
155
|
end
|
@@ -165,12 +165,12 @@ module DangoFrameworkModule
|
|
165
165
|
|
166
166
|
# 未定義なら定義する
|
167
167
|
if !@data.has_key?(key)
|
168
|
-
@mutex[key] =
|
168
|
+
@mutex[key] = DangoMutex.new("shared_mutex_#{key}")
|
169
169
|
end
|
170
170
|
|
171
171
|
# ロックしてデータを入れる
|
172
|
-
@mutex[key].
|
173
|
-
# @mutex.
|
172
|
+
@mutex[key].timeout_sync(3, "[]= #{key}") do
|
173
|
+
# @mutex.timeout_sync(3, "[]=") do
|
174
174
|
@data[key] = value.deep_dup
|
175
175
|
end
|
176
176
|
|
data/lib/dango/socket_list.rb
CHANGED
@@ -4,23 +4,23 @@
|
|
4
4
|
class SocketList
|
5
5
|
def initialize
|
6
6
|
@sl_hash = Hash.new
|
7
|
-
@sl_mutex =
|
7
|
+
@sl_mutex = DangoMutex.new(:socket_list_mutex)
|
8
8
|
end
|
9
9
|
|
10
10
|
def all_sid()
|
11
|
-
@sl_mutex.
|
11
|
+
@sl_mutex.timeout_sync(4, :all_sid) do
|
12
12
|
@sl_hash.keys
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def delete(sid)
|
17
|
-
@sl_mutex.
|
17
|
+
@sl_mutex.timeout_sync(4, :delete) do
|
18
18
|
@sl_hash.delete(sid)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
def add(sid, sock)
|
23
|
-
@sl_mutex.
|
23
|
+
@sl_mutex.timeout_sync(4, :add) do
|
24
24
|
raise("already exist sid(#{sid.inspect})") if @sl_hash.has_key?(sid)
|
25
25
|
raise("sock(#{sock.inspect}) is not Socket") if sock.kind_of?(Socket)
|
26
26
|
@sl_hash[sid] = sock
|
@@ -28,7 +28,7 @@ class SocketList
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def [](sid)
|
31
|
-
@sl_mutex.
|
31
|
+
@sl_mutex.timeout_sync(4, "[]") do
|
32
32
|
# raise("not exist sid(#{sid.inspect})") if ! @sl_hash.has_key?(sid)
|
33
33
|
return(nil) if ! @sl_hash.has_key?(sid)
|
34
34
|
@sl_hash[sid]
|
@@ -3,251 +3,464 @@ ENV['RAILS_ENV'] = ENV['RAILS_ENV'] || 'development'
|
|
3
3
|
|
4
4
|
require "pp"
|
5
5
|
require "timeout"
|
6
|
+
require "yaml"
|
7
|
+
require "find"
|
6
8
|
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
require "dango/framework_base"
|
11
|
+
|
12
|
+
class DangoRakeUtil
|
13
|
+
CheckConnectLogFile = "log/check_dango_connect.log" # テスト接続のログ
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
rescue
|
18
|
-
pid = nil
|
15
|
+
include DangoUtilModule
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@log = ""
|
19
19
|
end
|
20
|
-
|
21
|
-
pid
|
22
|
-
end
|
20
|
+
attr_accessor(:log)
|
23
21
|
|
24
|
-
#
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
22
|
+
# verboseモードのフラグを立てる処理
|
23
|
+
def check_verbose_mode()
|
24
|
+
$is_verbose = (ENV["verbose"] == "true" || ENV["verbose"] == "on") ? true : false
|
25
|
+
end
|
26
|
+
|
27
|
+
# 出力+ログ
|
28
|
+
def puts_noverbose(str)
|
29
|
+
@log += "#{Time.now_to_s} #{str.to_s}\n"
|
30
|
+
puts str.to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
# 出力+ログ(verbose)
|
34
|
+
def puts_verbose(str)
|
35
|
+
@log += "#{Time.now_to_s} #{str.to_s}\n"
|
36
|
+
puts str.to_s if $is_verbose
|
37
|
+
end
|
38
|
+
|
39
|
+
# pid保存ファイルの読み出し
|
40
|
+
def get_dango_pid()
|
34
41
|
begin
|
35
|
-
|
36
|
-
n_service = n_locator.ConnectServer
|
42
|
+
pid = open("tmp/pids/dango.#{ENV['RAILS_ENV']}.pid", "rb"){|fh| fh.read }.to_i
|
37
43
|
rescue
|
38
|
-
|
39
|
-
return
|
44
|
+
pid = nil
|
40
45
|
end
|
46
|
+
puts_verbose "pid=#{pid.inspect}"
|
47
|
+
pid
|
48
|
+
end
|
49
|
+
|
50
|
+
# pidのプロセスがあるかどうかのチェック
|
51
|
+
def check_exist_dango_process(pid)
|
52
|
+
puts_verbose "check_exist_dango_process(pid=#{pid})"
|
41
53
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
54
|
+
# そのpidのプロセスがあるかのチェック
|
55
|
+
is_pid_exist = nil
|
56
|
+
|
57
|
+
if RUBY_PLATFORM == 'i386-mswin32'
|
58
|
+
# WbemからProcessIDを取得
|
59
|
+
require "win32ole"
|
60
|
+
begin
|
61
|
+
n_locator = WIN32OLE.new("WbemScripting.SWbemLocator.1")
|
62
|
+
n_service = n_locator.ConnectServer
|
63
|
+
rescue
|
64
|
+
puts_verbose "failed connect to Wbem:#{$!.inspect}"
|
65
|
+
return
|
66
|
+
end
|
67
|
+
|
68
|
+
set = n_service.ExecQuery("select Caption, ProcessID from Win32_Process where ProcessID = #{pid}")
|
69
|
+
set.each do |one|
|
70
|
+
puts_verbose(sprintf("Win32_Process %8d %s", one.ProcessID, one.Caption))
|
71
|
+
if one.ProcessID == pid
|
72
|
+
is_pid_exist = true
|
73
|
+
end
|
47
74
|
end
|
75
|
+
|
76
|
+
else ## i386-mswin32以外
|
77
|
+
is_pid_exist = FileTest.exist?("/proc/#{pid}")
|
48
78
|
end
|
49
79
|
|
50
|
-
|
51
|
-
|
80
|
+
if is_pid_exist
|
81
|
+
puts_verbose "dango_process is exist."
|
82
|
+
else
|
83
|
+
puts_verbose "dango_process is not exist."
|
84
|
+
end
|
85
|
+
|
86
|
+
is_pid_exist
|
52
87
|
end
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
88
|
+
|
89
|
+
# プロセス停止
|
90
|
+
def stop_process(pid)
|
91
|
+
puts_verbose "stop process (pid=#{pid})"
|
92
|
+
|
93
|
+
if RUBY_PLATFORM == 'i386-mswin32'
|
94
|
+
# WbemからProcessIDを取得
|
95
|
+
require "win32ole"
|
96
|
+
begin
|
97
|
+
n_locator = WIN32OLE.new("WbemScripting.SWbemLocator.1")
|
98
|
+
n_service = n_locator.ConnectServer
|
99
|
+
rescue
|
100
|
+
puts_verbose "failed connect to Wbem:#{$!.inspect}"
|
101
|
+
return
|
102
|
+
end
|
103
|
+
|
104
|
+
set = n_service.ExecQuery("select Caption, name, ProcessID from Win32_Process where ProcessID = '#{pid}'")
|
105
|
+
set.each do |process|
|
106
|
+
puts_verbose "stopping #{process.Caption} #{process.name} #{process.ProcessID}"
|
107
|
+
process.Terminate 0
|
108
|
+
end
|
109
|
+
|
110
|
+
else ## i386-mswin32以外
|
111
|
+
# system("kill #{pid}")
|
112
|
+
ret_kill = Process.kill("TERM", pid) rescue nil
|
113
|
+
puts_verbose "kill TERM ret_kill=#{ret_kill.inspect}"
|
114
|
+
|
115
|
+
|
116
|
+
# きちんと落ちたかチェック
|
117
|
+
is_kill = false
|
118
|
+
20.times do
|
119
|
+
sleep 1
|
120
|
+
if !File.exist?("/proc/#{pid}")
|
121
|
+
is_kill = true
|
122
|
+
break
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
if !is_kill # 落ちていなければ、-9で終了
|
127
|
+
# system("kill -9 #{pid}")
|
128
|
+
begin
|
129
|
+
Process.kill("KILL", pid)
|
130
|
+
rescue
|
131
|
+
puts_verbose "process pid(#{pid}) is exist. but failed kill -9 #{pid}"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
58
135
|
end
|
59
|
-
|
60
|
-
is_pid_exist
|
61
|
-
end
|
62
136
|
|
63
|
-
#
|
64
|
-
def
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
#
|
69
|
-
|
137
|
+
# サーバーへの通信を使ったチェック
|
138
|
+
def check_dango_connect()
|
139
|
+
require 'dango/tester/dango_tester_client'
|
140
|
+
|
141
|
+
# コンフィグから check_dango_process_cmd を取得
|
142
|
+
config = YAML.load(open("#{RAILS_ROOT}/config/dango/#{ENV['RAILS_ENV']}.yml", "rb"){|fh| fh.read})
|
143
|
+
|
144
|
+
serv_info = {}
|
145
|
+
serv_info["host"] = config['network']['host'] || 'localhost'
|
146
|
+
serv_info["port"] = config['network']['port'] || 15000
|
147
|
+
serv_info["log_file"] = CheckConnectLogFile
|
148
|
+
serv_info["log_level"] = Logger::DEBUG
|
149
|
+
serv_info["log_max_size"] = 10000000
|
150
|
+
serv_info["log_shift_age"] = 1
|
151
|
+
|
152
|
+
# pp serv_info
|
153
|
+
|
154
|
+
sid = nil
|
155
|
+
|
70
156
|
begin
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
157
|
+
tester = DangoTesterClient.new # 開始
|
158
|
+
tester1 = nil
|
159
|
+
timeout(12) do
|
160
|
+
tester1 = tester.new_client("tester1", serv_info) # テスター1
|
161
|
+
|
162
|
+
10.times do |i|
|
163
|
+
sleep 1
|
164
|
+
sid = tester1.sid.deep_dup
|
165
|
+
tester1.logger.warn "count=#{i} sid=#{sid}"
|
166
|
+
break if sid
|
167
|
+
end
|
168
|
+
end
|
169
|
+
rescue TimeoutError
|
170
|
+
sid = nil
|
171
|
+
ret_kill "DangoTesterClient.TimeoutError" if $is_verbose
|
172
|
+
ensure
|
173
|
+
tester1.dango_client_close if tester1.respond_to?(:dango_client_close)
|
174
|
+
tester1 = nil
|
175
|
+
tester.gc_thread_stop
|
76
176
|
end
|
77
177
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
178
|
+
puts_verbose "sid=#{sid.inspect}"
|
179
|
+
|
180
|
+
if sid
|
181
|
+
is_alive_server = true
|
182
|
+
else
|
183
|
+
is_alive_server = false
|
82
184
|
end
|
83
185
|
|
84
|
-
|
85
|
-
# system("kill -9 #{pid}")
|
86
|
-
system("kill #{pid}")
|
186
|
+
is_alive_server
|
87
187
|
end
|
88
|
-
end
|
89
188
|
|
90
|
-
#
|
91
|
-
def
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
189
|
+
# drbからのサーバー呼び出し
|
190
|
+
def drb_call(method_name, arg = nil)
|
191
|
+
config = YAML.load(open("#{RAILS_ROOT}/config/dango/#{ENV['RAILS_ENV']}.yml", "rb"){|fh| fh.read})
|
192
|
+
|
193
|
+
raise("backdoor_run_drb_server is false.") if !config['server']['backdoor_run_drb_server']
|
194
|
+
|
195
|
+
if ENV['url']
|
196
|
+
drb_uri = ENV['url']
|
197
|
+
else
|
198
|
+
drb_uri = config['server']['backdoor_run_drb_url']
|
199
|
+
end
|
200
|
+
puts_verbose drb_uri
|
201
|
+
|
202
|
+
ret = nil
|
203
|
+
begin
|
204
|
+
timeout(3) do
|
205
|
+
drb_obj = DRbObject.new_with_uri(drb_uri)
|
206
|
+
ret = drb_obj.__send__(method_name.to_s, arg)
|
207
|
+
end
|
208
|
+
rescue Exception
|
209
|
+
raise("DRbError:#{$!.class} #{$!.message} #{$!.backtrace.pretty_inspect}")
|
210
|
+
end
|
211
|
+
ret
|
212
|
+
end
|
104
213
|
|
105
|
-
#
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
214
|
+
# 落ちた時の情報収集処理
|
215
|
+
def get_trouble_status(config, pid = nil)
|
216
|
+
# フォルダ作成
|
217
|
+
time_str = Time.now.strftime('%Y%m%d_%H%M%S')
|
218
|
+
dir_name = "log/#{time_str}_#{ENV['RAILS_ENV']}"
|
219
|
+
FileUtils.mkdir(dir_name) rescue nil
|
220
|
+
|
221
|
+
# サーバーログの保管
|
222
|
+
old_file = config['server']['log_file'].to_s
|
223
|
+
if File.file?(old_file)
|
224
|
+
new_file = "#{dir_name}/#{File.basename(old_file)}"
|
225
|
+
puts_verbose "copy #{old_file} #{new_file}"
|
226
|
+
FileUtils.copy(old_file, new_file) rescue nil
|
227
|
+
end
|
228
|
+
|
229
|
+
# 接続ログの保管
|
230
|
+
if File.file?(CheckConnectLogFile)
|
231
|
+
new_file = "#{dir_name}/#{File.basename(CheckConnectLogFile)}"
|
232
|
+
puts_verbose "copy #{CheckConnectLogFile} #{new_file}"
|
233
|
+
FileUtils.copy(CheckConnectLogFile, new_file) rescue nil
|
234
|
+
end
|
235
|
+
|
236
|
+
# スレッド情報と排他処理情報収集
|
237
|
+
begin
|
238
|
+
open("#{dir_name}/thread_status.txt", "wb") do |fh|
|
239
|
+
|
240
|
+
fh.puts "==== log"
|
241
|
+
fh.puts log
|
242
|
+
|
243
|
+
fh.puts "==== get_process_info"
|
244
|
+
fh.puts get_process_info(pid)
|
245
|
+
|
246
|
+
fh.puts "==== get_server_info"
|
247
|
+
fh.puts drb_call(:_monitor_get_server_info).pretty_inspect
|
248
|
+
|
249
|
+
fh.puts "==== thread_list"
|
250
|
+
fh.puts drb_call(:_monitor_thread_status).pretty_inspect
|
251
|
+
|
252
|
+
fh.puts "==== mutex_list"
|
253
|
+
fh.puts drb_call(:_monitor_mutex_status).pretty_inspect
|
254
|
+
|
255
|
+
fh.puts "==== get_socket_list"
|
256
|
+
fh.puts drb_call(:_monitor_get_socket_list).pretty_inspect
|
257
|
+
|
258
|
+
fh.puts "==== get_shared"
|
259
|
+
fh.puts drb_call(:_monitor_get_shared).pretty_inspect
|
260
|
+
|
261
|
+
end
|
262
|
+
rescue Exception
|
263
|
+
puts_verbose "failed get thread_status."
|
264
|
+
end
|
265
|
+
|
266
|
+
# モード変更
|
267
|
+
FileUtils.chmod_R(0777, [dir_name]) rescue nil
|
268
|
+
|
269
|
+
# ファイルの圧縮
|
270
|
+
begin
|
271
|
+
require "zip/zip"
|
272
|
+
can_zip = true
|
273
|
+
rescue LoadError
|
274
|
+
can_zip = false
|
275
|
+
end
|
276
|
+
|
277
|
+
if can_zip
|
278
|
+
outzipfile = "log/#{time_str}_#{ENV['RAILS_ENV']}.zip"
|
114
279
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
280
|
+
files = []
|
281
|
+
Find.find(dir_name) do |filename|
|
282
|
+
if FileTest::readable?(filename) and FileTest::file?(filename)
|
283
|
+
files.push(filename)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
Zip::ZipOutputStream.open(outzipfile) do |zos|
|
288
|
+
files.each do |name|
|
289
|
+
zos.put_next_entry(name)
|
290
|
+
File.open(name, "rb"){|f| zos.puts(f.read) }
|
291
|
+
end
|
120
292
|
end
|
293
|
+
|
294
|
+
FileUtils.rm_f(files) rescue nil
|
295
|
+
FileUtils.remove_entry(dir_name, true) rescue nil
|
296
|
+
|
297
|
+
FileUtils.chmod_R(0666, [outzipfile]) rescue nil
|
121
298
|
end
|
122
|
-
|
123
|
-
sid = nil
|
124
|
-
ensure
|
125
|
-
tester1.dango_client_close if tester1.respond_to?(:dango_client_close)
|
126
|
-
tester1 = nil
|
127
|
-
tester.gc_thread_stop
|
128
|
-
end
|
129
|
-
|
130
|
-
puts "sid=#{sid.inspect}" if $is_verbose
|
131
|
-
|
132
|
-
if sid
|
133
|
-
is_alive_server = true
|
134
|
-
else
|
135
|
-
is_alive_server = false
|
299
|
+
|
136
300
|
end
|
137
|
-
|
138
|
-
is_alive_server
|
139
301
|
end
|
140
302
|
|
141
303
|
|
304
|
+
################ rakeコマンドの指定 ##################
|
305
|
+
|
142
306
|
namespace :dango do
|
143
307
|
# desc "make swf"
|
144
308
|
# task :make_swf do
|
145
|
-
#
|
309
|
+
# dru.puts_noverbose "complete make_swf."
|
146
310
|
# end
|
147
311
|
|
148
312
|
desc "stop dango process"
|
149
313
|
task :stop_dango_process do
|
150
|
-
|
314
|
+
dru = DangoRakeUtil.new
|
315
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
151
316
|
|
152
|
-
pid = get_dango_pid()
|
153
|
-
stop_process(pid) if pid # pidがあればプロセス停止
|
154
|
-
|
317
|
+
pid = dru.get_dango_pid()
|
318
|
+
dru.stop_process(pid) if pid # pidがあればプロセス停止
|
319
|
+
dru.puts_noverbose "complete stop dango process."
|
155
320
|
end
|
156
321
|
|
157
322
|
desc "check dango process"
|
158
323
|
task :check_dango_process do
|
159
|
-
|
324
|
+
dru = DangoRakeUtil.new
|
325
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
326
|
+
dru.puts_noverbose "check_dango_process"
|
160
327
|
|
161
|
-
pid = get_dango_pid() # pidのチェック
|
162
|
-
is_pid_exist = check_exist_dango_process(pid) # pidのプロセスがあるかどうかのチェック
|
163
|
-
is_alive_server = check_dango_connect() if is_pid_exist # サーバーへの通信を使ったチェック
|
328
|
+
pid = dru.get_dango_pid() # pidのチェック
|
329
|
+
is_pid_exist = dru.check_exist_dango_process(pid) # pidのプロセスがあるかどうかのチェック
|
330
|
+
is_alive_server = dru.check_dango_connect() if is_pid_exist # サーバーへの通信を使ったチェック
|
164
331
|
|
165
332
|
# コンフィグから check_dango_process_cmd を取得
|
166
|
-
config = YAML.load(open("config/dango/#{ENV['RAILS_ENV']}.yml", "rb"){|fh| fh.read})
|
333
|
+
config = YAML.load(open("#{RAILS_ROOT}/config/dango/#{ENV['RAILS_ENV']}.yml", "rb"){|fh| fh.read})
|
167
334
|
check_dango_process_cmd = config['server']['check_dango_process_cmd'] || nil
|
168
335
|
|
169
336
|
# is_pid_existがないならcheck_dango_process_cmd実行
|
170
337
|
if check_dango_process_cmd && (! is_alive_server)
|
171
|
-
|
338
|
+
if pid # pidがあればプロセス停止
|
339
|
+
dru.get_trouble_status(config, pid) # 落ちた時の情報収集処理
|
340
|
+
|
341
|
+
dru.stop_process(pid)
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
# テスト接続のログがあればそれを削除する
|
346
|
+
if File.file?(DangoRakeUtil::CheckConnectLogFile)
|
347
|
+
FileUtils.rm_f([DangoRakeUtil::CheckConnectLogFile])
|
172
348
|
end
|
173
349
|
|
174
350
|
# サーバーが止まっているので起動処理をかける
|
175
351
|
if check_dango_process_cmd && ((! is_pid_exist) || (! is_alive_server))
|
176
|
-
|
352
|
+
dru.puts_verbose "check_dango_process_cmd=#{check_dango_process_cmd}"
|
353
|
+
|
354
|
+
# tmp/pidsから
|
355
|
+
config = YAML.load(open("#{RAILS_ROOT}/config/dango/#{ENV['RAILS_ENV']}.yml", "rb"){|fh| fh.read})
|
356
|
+
check_dango_process_cmd = config['server']['check_dango_process_cmd'] || nil
|
357
|
+
|
177
358
|
system(check_dango_process_cmd)
|
178
359
|
end
|
179
360
|
|
180
|
-
|
361
|
+
dru.puts_noverbose "complete check_dango_process."
|
362
|
+
end
|
363
|
+
|
364
|
+
desc "get_trouble_status"
|
365
|
+
task :get_trouble_status do
|
366
|
+
dru = DangoRakeUtil.new
|
367
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
368
|
+
dru.puts_noverbose "get_trouble_status"
|
369
|
+
|
370
|
+
config = YAML.load(open("#{RAILS_ROOT}/config/dango/#{ENV['RAILS_ENV']}.yml", "rb"){|fh| fh.read})
|
371
|
+
pid = dru.get_dango_pid() # pidのチェック
|
372
|
+
dru.get_trouble_status(config, pid) # 落ちた時の情報収集処理
|
373
|
+
dru.puts_noverbose "complete get_trouble_status."
|
181
374
|
end
|
182
375
|
|
183
376
|
namespace :monitor do
|
184
377
|
desc "get server info"
|
185
378
|
task :get_server_info do
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
379
|
+
dru = DangoRakeUtil.new
|
380
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
381
|
+
dru.puts_noverbose "get_server_info"
|
382
|
+
pp dru.drb_call(:_monitor_get_server_info)
|
383
|
+
end
|
384
|
+
|
385
|
+
desc "thread_status"
|
386
|
+
task :thread_status do
|
387
|
+
dru = DangoRakeUtil.new
|
388
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
389
|
+
dru.puts_noverbose "thread_status"
|
390
|
+
pp dru.drb_call(:_monitor_thread_status)
|
391
|
+
end
|
392
|
+
|
393
|
+
desc "mutex_status"
|
394
|
+
task :mutex_status do
|
395
|
+
dru = DangoRakeUtil.new
|
396
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
397
|
+
dru.puts_noverbose "mutex_status"
|
398
|
+
pp dru.drb_call(:_monitor_mutex_status)
|
399
|
+
end
|
400
|
+
|
401
|
+
desc "get_shared"
|
402
|
+
task :get_shared do
|
403
|
+
dru = DangoRakeUtil.new
|
404
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
405
|
+
dru.puts_noverbose "get_shared"
|
406
|
+
pp dru.drb_call(:_monitor_get_shared)
|
407
|
+
end
|
408
|
+
|
409
|
+
desc "write_shared"
|
410
|
+
task :write_shared do
|
411
|
+
dru = DangoRakeUtil.new
|
412
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
413
|
+
dru.puts_noverbose "write_shared"
|
414
|
+
key = ENV["KEY"]
|
415
|
+
value = ENV["VALUE"]
|
416
|
+
if ! key || ! value
|
417
|
+
dru.puts_noverbose "please VALUE. ex. rake dango:monitor:write_shared KEY=room VALUE=true"
|
418
|
+
exit
|
200
419
|
end
|
201
|
-
|
420
|
+
pp dru.drb_call(:_monitor_write_shared, {"key"=>key, "value"=>value})
|
421
|
+
end
|
422
|
+
|
423
|
+
desc "get_socket_list"
|
424
|
+
task :get_socket_list do
|
425
|
+
dru = DangoRakeUtil.new
|
426
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
427
|
+
dru.puts_noverbose "get_socket_list"
|
428
|
+
pp dru.drb_call(:_monitor_get_socket_list)
|
429
|
+
end
|
430
|
+
|
431
|
+
desc "get_session_list"
|
432
|
+
task :get_session_list do
|
433
|
+
dru = DangoRakeUtil.new
|
434
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
435
|
+
dru.puts_noverbose "get_session_list"
|
436
|
+
pp dru.drb_call(:_monitor_get_session_list)
|
202
437
|
end
|
203
438
|
|
204
439
|
desc "server_reload" # サーバーのリロード処理
|
205
440
|
task :server_reload do
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
begin
|
211
|
-
dm = DangoMonitorClient.new()
|
212
|
-
pp dm.server_reload()
|
213
|
-
dm.dango_client_close
|
214
|
-
puts "complete server_reload."
|
215
|
-
rescue
|
216
|
-
pp $!.class
|
217
|
-
pp $!.message
|
218
|
-
pp $!.backtrace
|
219
|
-
puts "failed server_reload."
|
220
|
-
end
|
441
|
+
dru = DangoRakeUtil.new
|
442
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
443
|
+
dru.puts_noverbose "server_reload"
|
444
|
+
pp dru.drb_call(:_monitor_server_reload)
|
221
445
|
end
|
222
446
|
|
223
447
|
desc "send_system_message" # システムメッセージ配信
|
224
448
|
task :send_system_message do
|
225
|
-
|
449
|
+
dru = DangoRakeUtil.new
|
450
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
451
|
+
dru.puts_noverbose "send_system_message"
|
226
452
|
|
227
|
-
puts "send_system_message" if $is_verbose
|
228
453
|
message_type = ENV["TYPE"]
|
229
454
|
if ! message_type
|
230
|
-
|
455
|
+
dru.puts_noverbose "please type. ex. rake dango:monitor:send_system_message TYPE=down_1min"
|
231
456
|
exit
|
232
457
|
end
|
233
458
|
|
234
|
-
require "yaml"
|
235
|
-
require 'dango/monitor/dango_monitor_client.rb'
|
236
|
-
|
237
459
|
system_message = YAML.load(open("config/dango/system_message.yml", "rb"){|fh| fh.read})
|
238
460
|
message = system_message[message_type]
|
239
461
|
|
240
|
-
|
241
|
-
|
242
|
-
pp dm.send_system_message(message)
|
243
|
-
dm.dango_client_close
|
244
|
-
puts "complete send_system_message."
|
245
|
-
rescue
|
246
|
-
pp $!.class
|
247
|
-
pp $!.message
|
248
|
-
pp $!.backtrace
|
249
|
-
puts "failed send_system_message."
|
250
|
-
end
|
462
|
+
dru.drb_call(:_monitor_send_system_message, {"message" => message})
|
463
|
+
dru.puts_noverbose "complete send_system_message."
|
251
464
|
end
|
252
465
|
|
253
466
|
end
|