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