dango 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/dango/client_framework.rb +5 -3
- data/lib/dango/dango_logger.rb +1 -0
- data/lib/dango/dango_mutex.rb +2 -2
- data/lib/dango/default_dango_receive.rb +0 -113
- data/lib/dango/framework_base.rb +4 -2
- data/lib/dango/monitor/server_monitor_module.rb +17 -23
- data/lib/dango/server_framework.rb +177 -74
- data/lib/dango/shared/memory_store.rb +8 -8
- data/lib/dango/socket_list.rb +4 -4
- data/lib/dango/tasks/dango_rake.rb +105 -40
- data/lib/dango/tester/dango_tester_client.rb +1 -7
- data/lib/dango/version.rb +4 -2
- metadata +2 -3
- data/lib/dango/monitor/server_monitor_action.rb +0 -148
@@ -50,8 +50,10 @@ class DangoClientFramework
|
|
50
50
|
|
51
51
|
@connection_encode_type = EncodeTypeMarshal
|
52
52
|
|
53
|
-
@recv_count = 0
|
54
|
-
@send_count = 0
|
53
|
+
@recv_count = 0 # 受信回数
|
54
|
+
@send_count = 0 # 送信回数
|
55
|
+
@recv_byte = 0 # 受信バイト数
|
56
|
+
@send_byte = 0 # 送信バイト数
|
55
57
|
|
56
58
|
Signal.trap('INT') do # SIGINT を捕捉する。
|
57
59
|
puts "shutdown"
|
@@ -146,7 +148,7 @@ class DangoClientFramework
|
|
146
148
|
|
147
149
|
# メソッド呼び出し
|
148
150
|
notice_name = ret_obj["_notice_name"]
|
149
|
-
logger.info "calling method
|
151
|
+
logger.info "calling method notice_name=dango_receive_#{notice_name.inspect} #{@sid} "
|
150
152
|
begin
|
151
153
|
__send__("dango_receive_#{notice_name}", ret_obj)
|
152
154
|
rescue
|
data/lib/dango/dango_logger.rb
CHANGED
@@ -63,6 +63,7 @@ class DangoLogger
|
|
63
63
|
@dango_logger.add(data[:sev], data[:msg], data[:prg])
|
64
64
|
rescue Exception
|
65
65
|
puts "dango_logger:#{error_message($!, 'u')}"
|
66
|
+
open("dango_logger.log", "ab"){|fh| fh.puts "#{Time.now_to_s}:#{error_message($!, 'u')}"}
|
66
67
|
exit! # ログのトラブルが出た場合は強制終了
|
67
68
|
end
|
68
69
|
end
|
data/lib/dango/dango_mutex.rb
CHANGED
@@ -44,7 +44,7 @@ class DangoMutex < Mutex
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
error_msg += "DangoFrameworkMutexTimeoutException" +
|
47
|
+
error_msg += "DangoFrameworkMutexTimeoutException " +
|
48
48
|
"self=#{self.mutex_name}(#{lock_name})\n" +
|
49
49
|
"locked_mutex=#{locked_msg}\n" +
|
50
50
|
"#{$!.message}\n" +
|
@@ -53,7 +53,7 @@ class DangoMutex < Mutex
|
|
53
53
|
raise(DangoFrameworkMutexTimeoutException, error_msg)
|
54
54
|
|
55
55
|
rescue Exception
|
56
|
-
puts "#{$!.class} #{$!.message}\n#{$!.backtrace.pretty_inspect}"
|
56
|
+
# puts "#{$!.class} #{$!.message}\n#{$!.backtrace.pretty_inspect}"
|
57
57
|
|
58
58
|
raise
|
59
59
|
end
|
@@ -23,118 +23,5 @@ module DefaultDangoReceive
|
|
23
23
|
end
|
24
24
|
|
25
25
|
|
26
|
-
|
27
|
-
################## メンテナンスアクション系 ##################
|
28
|
-
|
29
|
-
public
|
30
|
-
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
31
|
-
def dango_receive__monitor_get_server_info(ret_obj)
|
32
|
-
logger.debug "dango_receive__monitor_get_server_info:#{ret_obj.inspect}"
|
33
|
-
dango_check_monitor_error()
|
34
|
-
|
35
|
-
get_server_info = {
|
36
|
-
'server_start_time' => start_time.strftime("%Y-%m-%d %H:%M:%S"),
|
37
|
-
'up_time' => Time.now - start_time,
|
38
|
-
|
39
|
-
'recv_count' => recv_count, # 受信回数
|
40
|
-
'send_count' => send_count, # 送信回数
|
41
|
-
'recv_fail_count' => recv_fail_count, # 受信失敗回数
|
42
|
-
'send_fail_count' => send_fail_count, # 送信失敗回数
|
43
|
-
|
44
|
-
'log_level' => log_level_str,
|
45
|
-
'log_file' => log_file,
|
46
|
-
'log_max_size' => log_max_size,
|
47
|
-
'log_shift_age' => log_shift_age,
|
48
|
-
}
|
49
|
-
|
50
|
-
send_obj = {'code'=>0, 'get_server_info'=>get_server_info}
|
51
|
-
send_notice('return__monitor_get_server_info', session[:sid], send_obj, :type=>2)
|
52
|
-
end
|
53
|
-
|
54
|
-
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
55
|
-
def dango_receive__monitor_get_shared(ret_obj)
|
56
|
-
logger.debug "dango_receive__monitor_get_shared:#{ret_obj.inspect}"
|
57
|
-
dango_check_monitor_error()
|
58
|
-
|
59
|
-
send_obj = {'code'=>0, 'get_shared'=>shared.to_hash}
|
60
|
-
send_notice('return__monitor_get_shared', session[:sid], send_obj, :type=>2)
|
61
|
-
end
|
62
|
-
|
63
|
-
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
64
|
-
def dango_receive__monitor_get_session_list(ret_obj)
|
65
|
-
logger.debug "dango_receive__monitor_get_session_list:#{ret_obj.inspect}"
|
66
|
-
dango_check_monitor_error()
|
67
|
-
|
68
|
-
send_obj = {'code'=>0, 'get_session_list'=>session_list}
|
69
|
-
send_notice('return__monitor_get_session_list', session[:sid], send_obj, :type=>2)
|
70
|
-
end
|
71
|
-
|
72
|
-
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
73
|
-
def dango_receive__monitor_get_socket_list(ret_obj)
|
74
|
-
logger.debug "dango_receive__monitor_get_socket_list:#{ret_obj.inspect}"
|
75
|
-
dango_check_monitor_error()
|
76
|
-
|
77
|
-
send_obj = {'code'=>0, 'get_socket_list'=>socket_list.keys}
|
78
|
-
send_notice('return__monitor_get_socket_list', session[:sid], send_obj, :type=>2)
|
79
|
-
end
|
80
|
-
|
81
|
-
# メンテナンスコマンド:サーバーデータ再読み込み
|
82
|
-
def dango_receive__monitor_server_reload(ret_obj)
|
83
|
-
logger.debug "dango_receive__monitor_server_reload"
|
84
|
-
dango_check_monitor_error()
|
85
|
-
|
86
|
-
@server_reload = true
|
87
|
-
logger.debug "@server_reload=#{@server_reload.inspect}"
|
88
|
-
send_obj = {'code'=>0, 'message'=>'success'}
|
89
|
-
send_notice('return__monitor_server_reload', session[:sid], send_obj, :type=>2)
|
90
|
-
end
|
91
|
-
|
92
|
-
# メンテナンスコマンド:接続者全員へメッセージ送信
|
93
|
-
def dango_receive__monitor_send_system_message(ret_obj)
|
94
|
-
logger.debug "dango_receive__monitor_send_system_message:#{ret_obj.inspect}"
|
95
|
-
dango_check_monitor_error()
|
96
|
-
|
97
|
-
# 全員へ_notice_system_messageを通知
|
98
|
-
socket_list.keys.each do |sid|
|
99
|
-
next if session[:sid] == sid
|
100
|
-
send_obj = { "message" => ret_obj["message"] }
|
101
|
-
send_notice('_notice_system_message', sid, send_obj)
|
102
|
-
end
|
103
|
-
|
104
|
-
send_obj = {'code'=>0, }
|
105
|
-
send_notice('return__monitor_send_system_message', session[:sid], send_obj, :type=>2)
|
106
|
-
end
|
107
|
-
|
108
|
-
private
|
109
|
-
# メンテナンスコマンド:エラーの場合
|
110
|
-
def dango_check_monitor_error()
|
111
|
-
action_name = session[:_action_name]
|
112
|
-
peerhost = session[:peer_host]
|
113
|
-
peeraddr = session[:peer_ip_address]
|
114
|
-
|
115
|
-
logger.debug "dango_check_monitor_error:peerhost=#{peerhost.inspect} peeraddr=#{peeraddr.inspect} @backdoor_host=#{@backdoor_host.inspect}"
|
116
|
-
|
117
|
-
match = false
|
118
|
-
if peerhost == backdoor_host # ホスト名で書いてある時の一致確認
|
119
|
-
match = true
|
120
|
-
else
|
121
|
-
begin # IPアドレスの一致確認
|
122
|
-
# match = true if IPAddr.new(@backdoor_host).include?(peeraddr)
|
123
|
-
if IPAddr.new(@backdoor_host).include?(IPAddr.new(peeraddr))
|
124
|
-
match = true
|
125
|
-
end
|
126
|
-
rescue
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
if !match
|
131
|
-
notice_name = "return_" + action_name
|
132
|
-
send_obj = {'code'=>1, 'message'=>"error your ip address"}
|
133
|
-
send_notice(notice_name, session[:sid], send_obj, :type=>2)
|
134
|
-
raise(DangoFrameworkMonitorSecurityError)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
|
139
26
|
end
|
140
27
|
|
data/lib/dango/framework_base.rb
CHANGED
@@ -165,7 +165,7 @@ module DangoFrameworkModule
|
|
165
165
|
|
166
166
|
DefaultEncodeType = EncodeTypeJSON # デフォルトのエンコードのタイプ
|
167
167
|
|
168
|
-
ReadTimeoutSec =
|
168
|
+
ReadTimeoutSec = 4.0 # データ受信のタイムアウト秒数
|
169
169
|
|
170
170
|
|
171
171
|
# デバッグ出力用のメソッド
|
@@ -188,7 +188,7 @@ module DangoFrameworkModule
|
|
188
188
|
size_str = sock.recv(CommMaxDigit + 1)
|
189
189
|
logger.debug "dango_receive_data:read header:sock=#{sock}"
|
190
190
|
|
191
|
-
rescue EOFError, IOError, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::ECONNABORTED
|
191
|
+
rescue EOFError, IOError, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::ECONNABORTED, Errno::ENOTCONN
|
192
192
|
# 接続終了時の切断と思われるものはDangoFrameworkConnectionExceptionにしない
|
193
193
|
raise(DangoFrameworkDisconnectException, "failed to read sock for EOF reached (and so on). " +
|
194
194
|
"sock=#{sock.inspect} #{$!.class} toid=#{Thread.current.object_id}")
|
@@ -249,6 +249,7 @@ module DangoFrameworkModule
|
|
249
249
|
recv_data = receive_decrypt(recv_data_orig[0..-2])
|
250
250
|
|
251
251
|
@recv_count += 1 if @recv_count # 受信回数カウント
|
252
|
+
@recv_byte += recv_data_orig.size if @recv_byte # 受信バイト数追加
|
252
253
|
|
253
254
|
begin
|
254
255
|
if recv_data == "" || recv_data == "{}" # データが空ならparseしない
|
@@ -311,6 +312,7 @@ module DangoFrameworkModule
|
|
311
312
|
end
|
312
313
|
|
313
314
|
@send_count += 1 if @send_count # 受信回数カウント
|
315
|
+
@send_byte += send_buf.size if @send_byte # 受信バイト数追加
|
314
316
|
|
315
317
|
sock
|
316
318
|
end
|
@@ -11,13 +11,18 @@ module ServerMonitorModule
|
|
11
11
|
logger.debug "_monitor_get_server_info"
|
12
12
|
|
13
13
|
get_server_info = {
|
14
|
-
'server_start_time' => start_time.strftime("%Y-%m-%d %H:%M:%S"),
|
15
|
-
'
|
14
|
+
'server_start_time' => @start_time.strftime("%Y-%m-%d %H:%M:%S"),
|
15
|
+
'server_up_time' => Time.now - @start_time,
|
16
|
+
'server_version' => "#{Dango::VERSION::STRING} p#{Dango::VERSION::PATCH}(r#{RAILS_GEM_VERSION})",
|
16
17
|
|
17
|
-
'recv_count'
|
18
|
-
'send_count'
|
19
|
-
'recv_fail_count'
|
20
|
-
'send_fail_count'
|
18
|
+
'recv_count' => @recv_count, # 受信回数
|
19
|
+
'send_count' => @send_count, # 送信回数
|
20
|
+
'recv_fail_count' => @recv_fail_count, # 受信失敗回数
|
21
|
+
'send_fail_count' => @send_fail_count, # 送信失敗回数
|
22
|
+
'recv_byte' => @recv_byte, # 受信バイト数
|
23
|
+
'send_byte' => @send_byte, # 送信バイト数
|
24
|
+
|
25
|
+
'mutex_fail_count' => @mutex_fail_count, # 送信失敗回数
|
21
26
|
|
22
27
|
# 'log_level' => log_level_str,
|
23
28
|
# 'log_file' => log_file,
|
@@ -76,23 +81,6 @@ module ServerMonitorModule
|
|
76
81
|
})
|
77
82
|
end
|
78
83
|
|
79
|
-
# mutex_list = [
|
80
|
-
# [:mutex_send_response, @mutex_send_response],
|
81
|
-
# [:mutex_send_notice , @mutex_send_notice],
|
82
|
-
# [:mutex_proc_thread , @mutex_proc_thread],
|
83
|
-
# [:mutex_send_response, @mutex_send_response],
|
84
|
-
# ]
|
85
|
-
# @mutex_sock.each do |key, value|
|
86
|
-
# mutex_list.push(["mutex_sock #{key}", value])
|
87
|
-
# end
|
88
|
-
#
|
89
|
-
# mutex_list.each do |name, mutex|
|
90
|
-
# ret.push({
|
91
|
-
# :name => name.to_s,
|
92
|
-
# :is_lock => mutex.locked?,
|
93
|
-
# })
|
94
|
-
# end
|
95
|
-
|
96
84
|
ret
|
97
85
|
end
|
98
86
|
|
@@ -127,5 +115,11 @@ module ServerMonitorModule
|
|
127
115
|
ret
|
128
116
|
end
|
129
117
|
|
118
|
+
# drbから呼ばれるメンテナンス:action_statの取得
|
119
|
+
def _monitor_get_action_stat(ret_obj)
|
120
|
+
logger.debug "_monitor_get_action_stat:#{ret_obj.inspect}"
|
121
|
+
@action_stat
|
122
|
+
end
|
123
|
+
|
130
124
|
end
|
131
125
|
|
@@ -10,7 +10,6 @@ require "dango/framework_base"
|
|
10
10
|
require "dango/socket_list"
|
11
11
|
require "dango/version"
|
12
12
|
require "dango/session_manager"
|
13
|
-
#require "dango/monitor/server_monitor_action"
|
14
13
|
require "dango/monitor/server_monitor_module"
|
15
14
|
require "dango/default_dango_receive"
|
16
15
|
|
@@ -144,15 +143,20 @@ class DangoServerFramework
|
|
144
143
|
|
145
144
|
require 'resolv-replace' if @safe_resolver # 名前解決時のロックがかかってしまう件を解決できるはず
|
146
145
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
146
|
+
if @no_start_log
|
147
|
+
logger.debug("===== no_start_log=#{@no_start_log.inspect} =====")
|
148
|
+
else
|
149
|
+
logger.warn("===== server initialize =====") # loggerの準備
|
150
|
+
logger.warn("network_port=#{@network_port}")
|
151
|
+
logger.warn("network_host=#{@network_host}")
|
152
|
+
logger.warn("server_host=#{@server_host}")
|
153
|
+
logger.warn("max_connections=#{@server_max_connections}")
|
154
|
+
logger.warn("RAILS_ENV=#{RAILS_ENV}")
|
155
|
+
logger.warn("Process.pid=#{Process.pid}")
|
156
|
+
logger.warn("Dango Version=#{Dango::VERSION::STRING} p#{Dango::VERSION::PATCH}")
|
157
|
+
logger.warn("Rails Version=#{RAILS_GEM_VERSION}")
|
158
|
+
# logger.debug("$LOADED_FEATURES=#{$LOADED_FEATURES.pretty_inspect}")
|
159
|
+
end
|
156
160
|
|
157
161
|
shared_init() # 共有メモリを初期化
|
158
162
|
socket_list_init() # ソケット一覧を初期化
|
@@ -177,8 +181,17 @@ class DangoServerFramework
|
|
177
181
|
require "drb/acl"
|
178
182
|
# uri = "druby://#{@network_host}:#{@backdoor_run_drb_port}"
|
179
183
|
uri = @backdoor_run_drb_url
|
180
|
-
|
181
|
-
|
184
|
+
|
185
|
+
allow_list = @backdoor_run_drb_allow_list.split(/\s+/)
|
186
|
+
|
187
|
+
acl_list = ["deny", "all"]
|
188
|
+
allow_list.each do |allow_host|
|
189
|
+
acl_list.push("allow")
|
190
|
+
acl_list.push(allow_host)
|
191
|
+
end
|
192
|
+
logger.info "drb acl_list=#{acl_list.inspect}"
|
193
|
+
|
194
|
+
acl = ACL.new(acl_list, ACL::DENY_ALLOW)
|
182
195
|
@drb = DRb.start_service(uri, self, acl)
|
183
196
|
# @drb = DRb.start_service(uri, self)
|
184
197
|
DRb.thread[:_name] = "thread_drb_main"
|
@@ -387,19 +400,43 @@ class DangoServerFramework
|
|
387
400
|
end
|
388
401
|
session[:_return] = return_data
|
389
402
|
|
403
|
+
# アクションの統計情報情報の作成
|
404
|
+
if ! @action_stat.has_key?(action_name)
|
405
|
+
@action_stat[action_name] = {:total_sec => 0, :exec_count => 0, :fail_count => 0, }
|
406
|
+
end
|
407
|
+
|
408
|
+
# アクションの実行
|
390
409
|
logger.debug "mpth:1:receive_action:session=#{sid} #{count}"
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
410
|
+
begin
|
411
|
+
@mutex_proc_thread.timeout_sync(3, "receive_action_#{action_name}") do
|
412
|
+
logger.debug "mpth:2:receive_action:#{sid}:#{action_name}:"
|
413
|
+
begin
|
414
|
+
before_time = Time.now
|
415
|
+
__send__("dango_receive_#{action_name}", ret_obj)
|
416
|
+
send_sec = Time.now - before_time
|
417
|
+
@action_stat[action_name][:total_sec] = send_sec
|
418
|
+
@action_stat[action_name][:exec_count] += 1
|
419
|
+
|
420
|
+
rescue NoMethodError
|
421
|
+
@recv_fail_count += 1 if @recv_fail_count # 受信失敗回数カウント
|
422
|
+
@action_stat[action_name][:fail_count] += 1
|
423
|
+
logger.error "not find action #{action_name}:#{sid}:#{error_message($!, 'u')}"
|
424
|
+
rescue DangoFrameworkTimeoutException
|
425
|
+
@action_stat[action_name][:fail_count] += 1
|
426
|
+
logger.error "action is timeout:#{action_name}:#{sid}:#{error_message($!, 'u')}"
|
427
|
+
end
|
428
|
+
|
429
|
+
end # @mutex_proc_thread
|
430
|
+
rescue DangoFrameworkMutexTimeoutException
|
431
|
+
@mutex_fail_count += 1
|
432
|
+
@action_stat[action_name][:fail_count] += 1
|
433
|
+
logger.warn "receive_action DangoFrameworkMutexTimeoutException. #{sid} \n#{error_message($!, 'u')}"
|
434
|
+
raise(DangoFrameworkDisconnectException)
|
435
|
+
rescue Exception
|
436
|
+
logger.error "receive_action Exception #{sid} #{error_message($!, 'u')}"
|
437
|
+
@action_stat[action_name][:fail_count] += 1
|
438
|
+
raise(DangoFrameworkDisconnectException)
|
439
|
+
end
|
403
440
|
|
404
441
|
# 不要になったセッション内のデータを削除(sidは再利用されるので消さない)
|
405
442
|
session.delete(:_action_name)
|
@@ -408,17 +445,26 @@ class DangoServerFramework
|
|
408
445
|
|
409
446
|
if ! session[:connected] # まだdango_connectを呼び出していないなら
|
410
447
|
logger.debug "mpth:1:dango_connect"
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
448
|
+
begin
|
449
|
+
@mutex_proc_thread.timeout_sync(3, :dango_connect) do
|
450
|
+
logger.debug "mpth:2:dango_connect"
|
451
|
+
# 接続直後のsid通知
|
452
|
+
send_obj = {"_sid"=>sid}
|
453
|
+
send_notice("_notice_sid", sid, send_obj)
|
454
|
+
logger.debug "_notice_sid #{sid} "
|
455
|
+
|
456
|
+
dango_connect() # 接続時メソッド呼び出し
|
457
|
+
session[:connected] = true
|
458
|
+
|
459
|
+
end # mutex_proc_thread
|
460
|
+
rescue DangoFrameworkMutexTimeoutException
|
461
|
+
@mutex_fail_count += 1
|
462
|
+
logger.warn "receive_action DangoFrameworkMutexTimeoutException. #{sid} \n#{error_message($!, 'u')}"
|
463
|
+
raise(DangoFrameworkDisconnectException)
|
464
|
+
rescue Exception
|
465
|
+
logger.error "receive_action Exception #{sid} #{error_message($!, 'u')}"
|
466
|
+
raise(DangoFrameworkDisconnectException)
|
467
|
+
end
|
422
468
|
end
|
423
469
|
end
|
424
470
|
|
@@ -446,7 +492,11 @@ class DangoServerFramework
|
|
446
492
|
rescue DangoFrameworkDisconnectException
|
447
493
|
logger.debug "DangoFrameworkDisconnectException. #{sid} \n#{error_message($!, 'u')}"
|
448
494
|
|
495
|
+
rescue EOFError, IOError, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::ECONNABORTED, Errno::ENOTCONN
|
496
|
+
logger.debug "#{$!.class}. #{sid} maybe dissconnect exception \n#{error_message($!, 'u')}"
|
497
|
+
|
449
498
|
rescue DangoFrameworkMutexTimeoutException
|
499
|
+
@mutex_fail_count += 1
|
450
500
|
logger.warn "DangoFrameworkMutexTimeoutException. #{sid} \n#{error_message($!, 'u')}"
|
451
501
|
|
452
502
|
rescue DangoFrameworkException
|
@@ -455,32 +505,47 @@ class DangoServerFramework
|
|
455
505
|
rescue Exception
|
456
506
|
logger.error "Exception #{sid} #{error_message($!, 'u')}"
|
457
507
|
|
458
|
-
|
459
|
-
|
460
|
-
|
508
|
+
end
|
509
|
+
|
510
|
+
# 接続切断の処理
|
511
|
+
begin
|
461
512
|
if !is_flash_policy_file # Flash Policy Fileなら切断処理不要
|
462
513
|
logger.info "#{sock.object_id} #{sid} is closing"
|
463
514
|
if session[:connected] # dango_connect()が実行済みなら
|
464
515
|
begin
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
516
|
+
5.times do |i| # リトライ用のループ
|
517
|
+
begin
|
518
|
+
need_retry = false
|
519
|
+
logger.debug "mpth:1:dango_close"
|
520
|
+
@mutex_proc_thread.timeout_sync(3, :dango_close) do
|
521
|
+
logger.debug "mpth:2:dango_close"
|
522
|
+
dango_close() # 接続解除時に呼び出されるメソッド
|
523
|
+
|
524
|
+
# ハートビートのごみを削除
|
525
|
+
shared.transaction(:_heart_beat_time_hash) do |hbt_hash|
|
526
|
+
hbt_hash.delete(sid)
|
527
|
+
shared.commit(hbt_hash)
|
528
|
+
end
|
529
|
+
|
530
|
+
end # mutex_proc_thread
|
531
|
+
logger.debug "dango_close end"
|
532
|
+
|
533
|
+
rescue DangoFrameworkMutexTimeoutException
|
534
|
+
need_retry = true
|
535
|
+
@mutex_fail_count += 1
|
536
|
+
logger.warn "dango_close DangoFrameworkMutexTimeoutException " +
|
537
|
+
"#{sock.object_id} #{sid} \n#{error_message($!, 'u')}"
|
474
538
|
end
|
475
539
|
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
540
|
+
if need_retry # リトライが必要と判断されれば
|
541
|
+
logger.warn "dango_close failed. need retry #{i}"
|
542
|
+
sleep(rand(5) + 5)
|
543
|
+
else # リトライ不要で落とすなら
|
544
|
+
break
|
545
|
+
end
|
546
|
+
end # times
|
482
547
|
rescue Exception
|
483
|
-
logger.error "#{sock.object_id} #{sid} ERROR\n#{error_message($!, 'u')}"
|
548
|
+
logger.error "dango_close #{sock.object_id} #{sid} ERROR\n#{error_message($!, 'u')}"
|
484
549
|
end
|
485
550
|
end
|
486
551
|
end
|
@@ -492,6 +557,7 @@ class DangoServerFramework
|
|
492
557
|
rescue IOError
|
493
558
|
logger.info "IOError #{sock.object_id} #{sid}"
|
494
559
|
rescue DangoFrameworkMutexTimeoutException
|
560
|
+
@mutex_fail_count += 1
|
495
561
|
logger.warn "DangoFrameworkMutexTimeoutException #{sock.object_id} #{sid}\n" +
|
496
562
|
"#{error_message($!, 'u')}"
|
497
563
|
rescue Exception
|
@@ -508,15 +574,17 @@ class DangoServerFramework
|
|
508
574
|
sock = nil # ソケット削除
|
509
575
|
end
|
510
576
|
rescue DangoFrameworkMutexTimeoutException
|
577
|
+
@mutex_fail_count += 1
|
511
578
|
logger.warn "DangoFrameworkMutexTimeoutException #{sock.object_id} #{sid}\n" +
|
512
579
|
"#{error_message($!, 'u')}"
|
513
|
-
rescue Exception
|
514
|
-
logger.error "#{sock.object_id} #{sid} Exception\n#{error_message($!, 'u')}"
|
515
580
|
end
|
516
581
|
|
517
582
|
@mutex_sock.delete(sock_object_id) # ソケット排他処理から削除
|
518
583
|
|
519
584
|
@session_manager.close_session(sid) # sessionの終了処理
|
585
|
+
|
586
|
+
rescue Exception
|
587
|
+
logger.error "close process failed:#{sock.object_id} #{sid} Exception\n#{error_message($!, 'u')}"
|
520
588
|
end
|
521
589
|
|
522
590
|
end
|
@@ -583,15 +651,17 @@ EOF
|
|
583
651
|
@policy_file_allow_port = @config['server']['policy_file_allow_port']
|
584
652
|
@policy_file_allow_port = [@network_port] if !@policy_file_allow_port
|
585
653
|
|
586
|
-
@safe_resolver
|
654
|
+
@safe_resolver = @config['server']['safe_resolver'] || false # require 'resolv-replace'するかどうか
|
587
655
|
|
588
|
-
@statistics_process_memory
|
656
|
+
@statistics_process_memory = @config['server']['statistics_process_memory'] || false # プロセスのメモリ使用量統計取る
|
589
657
|
|
590
|
-
@backdoor_run_drb_server
|
591
|
-
@backdoor_run_drb_url
|
592
|
-
@
|
658
|
+
@backdoor_run_drb_server = @config['server']['backdoor_run_drb_server'] || false # drbサーバーを起動するか
|
659
|
+
@backdoor_run_drb_url = @config['server']['backdoor_run_drb_url'] || 12345 # drbサーバーのポート番号
|
660
|
+
@backdoor_run_drb_allow_list = @config['server']['backdoor_run_drb_allow_list'] || '127.0.0.1 localhost' # アクセス可能ホスト名
|
593
661
|
|
594
|
-
@loop_setting
|
662
|
+
@loop_setting = @config['server']['loop_setting'] # メインループ用の定義
|
663
|
+
|
664
|
+
@no_start_log = @config['server']['no_start_log'] # メインループ用の定義
|
595
665
|
|
596
666
|
# ログレベルの設定
|
597
667
|
log_level_hash = {
|
@@ -619,10 +689,17 @@ EOF
|
|
619
689
|
@send_count = 0 # 送信回数
|
620
690
|
@recv_fail_count = 0 # 受信失敗回数
|
621
691
|
@send_fail_count = 0 # 送信失敗回数
|
692
|
+
@recv_byte = 0 # 受信バイト数
|
693
|
+
@send_byte = 0 # 送信バイト数
|
694
|
+
|
695
|
+
@mutex_fail_count = 0 # 排他処理の失敗回数
|
696
|
+
|
697
|
+
@action_stat = {} # アクションの統計用
|
622
698
|
end
|
623
699
|
|
624
|
-
attr_reader(:start_time, :recv_count, :send_count, :recv_fail_count, :send_fail_count)
|
625
|
-
attr_reader(:
|
700
|
+
# attr_reader(:start_time, :recv_count, :send_count, :recv_fail_count, :send_fail_count)
|
701
|
+
# attr_reader(:recv_byte, :send_byte, :mutex_fail_count, :action_stat)
|
702
|
+
# attr_reader(:log_level_str, :log_file, :log_max_size, :log_shift_age)
|
626
703
|
|
627
704
|
def dango_server_init # 初期設定
|
628
705
|
end
|
@@ -693,20 +770,23 @@ EOF
|
|
693
770
|
begin
|
694
771
|
sleep @gc_interval_sec
|
695
772
|
|
696
|
-
logger.debug "mpth:1:GC start mutex start"
|
697
|
-
@mutex_proc_thread.timeout_sync(
|
698
|
-
logger.debug "mpth:2:GC start #{Time.now_to_s}"
|
773
|
+
# logger.debug "mpth:1:GC start mutex start"
|
774
|
+
# @mutex_proc_thread.timeout_sync(3, :gc) do
|
775
|
+
# logger.debug "mpth:2:GC start #{Time.now_to_s}"
|
776
|
+
|
777
|
+
logger.debug "GC start mutex start"
|
699
778
|
gc_start_time = Time.now
|
700
779
|
GC.enable
|
701
780
|
GC.start
|
702
781
|
GC.disable
|
703
782
|
logger.debug "GC end #{Time.now - gc_start_time}sec "
|
704
|
-
end
|
783
|
+
# end
|
705
784
|
logger.debug "GC start mutex end"
|
706
785
|
|
707
786
|
output_memory_statistics() if @statistics_process_memory # メモリ使用量統計
|
708
787
|
|
709
788
|
rescue DangoFrameworkMutexTimeoutException
|
789
|
+
@mutex_fail_count += 1
|
710
790
|
logger.warn "DangoFrameworkMutexTimeoutException gc_thread_start" +
|
711
791
|
"#{error_message($!, 'u')}"
|
712
792
|
rescue Exception
|
@@ -752,9 +832,18 @@ EOF
|
|
752
832
|
|
753
833
|
next if @gserver.stopped? # gserverが起動していればスキップ
|
754
834
|
|
755
|
-
logger.debug "mpth:1:heart_beat_thread_start "
|
756
|
-
@mutex_proc_thread.timeout_sync(
|
757
|
-
logger.debug "mpth:2:heart_beat_thread_start "
|
835
|
+
# logger.debug "mpth:1:heart_beat_thread_start "
|
836
|
+
# @mutex_proc_thread.timeout_sync(3, :heart_beat_thread) do
|
837
|
+
# logger.debug "mpth:2:heart_beat_thread_start "
|
838
|
+
|
839
|
+
# 古いハートビート情報は先に削除しておく
|
840
|
+
shared.transaction(:_heart_beat_time_hash) do |hbt_hash|
|
841
|
+
hbt_hash.keys.each do |sid|
|
842
|
+
hbt_hash.delete(sid) if hbt_hash[sid] < Time.now - @heart_beat_receive_wait_sec * 30
|
843
|
+
end
|
844
|
+
shared.commit(hbt_hash)
|
845
|
+
end
|
846
|
+
|
758
847
|
# クライアントから来るハートビートのチェック
|
759
848
|
heart_beat_time_hash = shared[:_heart_beat_time_hash]
|
760
849
|
|
@@ -796,10 +885,11 @@ EOF
|
|
796
885
|
end
|
797
886
|
end # socket_list
|
798
887
|
|
799
|
-
end # @mutex_proc_thread
|
888
|
+
# end # @mutex_proc_thread
|
800
889
|
logger.debug "heart_beat_thread_start end"
|
801
890
|
|
802
891
|
rescue DangoFrameworkMutexTimeoutException
|
892
|
+
@mutex_fail_count += 1
|
803
893
|
logger.warn "DangoFrameworkMutexTimeoutException heart_beat_thread_start" +
|
804
894
|
"#{error_message($!, 'u')}"
|
805
895
|
rescue Exception
|
@@ -848,6 +938,7 @@ EOF
|
|
848
938
|
@queue_send_notice.push([sid, send_obj_dup, encode_type].deep_dup)
|
849
939
|
end
|
850
940
|
rescue DangoFrameworkMutexTimeoutException
|
941
|
+
@mutex_fail_count += 1
|
851
942
|
logger.warn "mutex_send_notice #{error_message($!, 'u')}"
|
852
943
|
rescue Exception
|
853
944
|
logger.error "mutex_send_notice #{error_message($!, 'u')}"
|
@@ -915,6 +1006,7 @@ EOF
|
|
915
1006
|
logger.info "thread_send_notice_queue:failed send. sid=#{sid} " +
|
916
1007
|
"sock=#{sock.object_id} #{$!.class}"
|
917
1008
|
rescue DangoFrameworkMutexTimeoutException
|
1009
|
+
@mutex_fail_count += 1
|
918
1010
|
logger.warn "thread_send_notice_queue:failed send. sid=#{sid} " +
|
919
1011
|
"sock=#{sock.object_id} #{$!.class}"
|
920
1012
|
rescue Exception
|
@@ -931,6 +1023,7 @@ EOF
|
|
931
1023
|
sleep @send_receive_sleep_interval_sec # スリープ
|
932
1024
|
|
933
1025
|
rescue DangoFrameworkMutexTimeoutException
|
1026
|
+
@mutex_fail_count += 1
|
934
1027
|
logger.warn "ERROR:thread_send_notice_queue:DangoFrameworkMutexTimeoutException" +
|
935
1028
|
"#{error_message($!, 'u')}"
|
936
1029
|
rescue Exception
|
@@ -958,7 +1051,7 @@ EOF
|
|
958
1051
|
end
|
959
1052
|
|
960
1053
|
# メインループ用の定義をするためのメソッド
|
961
|
-
def set_loop_setting(options={})
|
1054
|
+
def set_loop_setting(options = {})
|
962
1055
|
options = options.deep_dup
|
963
1056
|
|
964
1057
|
shared[:_is_server_sleep] = nil # メンテナンス停止用
|
@@ -974,29 +1067,39 @@ EOF
|
|
974
1067
|
logger.debug "set_loop_setting start"
|
975
1068
|
count = 0
|
976
1069
|
|
1070
|
+
last_mutex_fail_count = @mutex_fail_count.deep_dup # 前回のmutex_fail_countを記録する
|
1071
|
+
|
977
1072
|
loop do
|
978
1073
|
begin
|
979
1074
|
before_time = Time.now
|
980
1075
|
|
981
1076
|
logger.debug "mpth:1:sls start"
|
982
|
-
@mutex_proc_thread.timeout_sync(
|
1077
|
+
@mutex_proc_thread.timeout_sync(3, "set_loop_setting_send_#{method_name}") do
|
983
1078
|
__send__(method_name)
|
984
1079
|
end # mutex_proc_thread
|
985
1080
|
logger.debug "mpth:2:sls end"
|
986
1081
|
# if count % 1000 == 0
|
987
1082
|
|
988
1083
|
real_wait_sec = wait_sec - (Time.now - before_time)
|
1084
|
+
logger.debug "set_loop_setting:compute time=#{real_wait_sec - wait_sec}" if real_wait_sec < 0
|
989
1085
|
sleep real_wait_sec if real_wait_sec > 0
|
990
1086
|
|
991
1087
|
count += 1
|
992
1088
|
count = 0 if count >= 10000000
|
993
1089
|
|
1090
|
+
# mutex_fail_countが増えたらサーバーが重くなりすぎていると判断してちょっと待つ
|
1091
|
+
if @mutex_fail_count > last_mutex_fail_count
|
1092
|
+
sleep 1
|
1093
|
+
last_mutex_fail_count = @mutex_fail_count.deep_dup
|
1094
|
+
end
|
1095
|
+
|
994
1096
|
# メンテナンス機能
|
995
1097
|
if shared[:_is_server_sleep]
|
996
1098
|
logger.info "set_loop_setting SLEEP !!!"
|
997
1099
|
sleep 10000
|
998
1100
|
end
|
999
1101
|
rescue DangoFrameworkMutexTimeoutException
|
1102
|
+
@mutex_fail_count += 1
|
1000
1103
|
logger.warn "set_loop_setting error:#{error_message($!, 'u')}"
|
1001
1104
|
rescue Exception
|
1002
1105
|
logger.error "set_loop_setting error:#{error_message($!, 'u')}"
|
@@ -42,8 +42,8 @@ module DangoFrameworkModule
|
|
42
42
|
raise(DangoFrameworkException, "Shared key is not exist.")
|
43
43
|
end
|
44
44
|
|
45
|
-
# @mutex[key].timeout_sync(
|
46
|
-
@mutex.timeout_sync(
|
45
|
+
# @mutex[key].timeout_sync(2, "transaction_old #{key}") do
|
46
|
+
@mutex.timeout_sync(2, "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].timeout_sync(
|
70
|
-
# @mutex.timeout_sync(
|
69
|
+
@mutex[key].timeout_sync(2, "transaction #{key}") do
|
70
|
+
# @mutex.timeout_sync(2, "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].timeout_sync(
|
152
|
-
# @mutex.timeout_sync(
|
151
|
+
@mutex[key].timeout_sync(2, "[] #{key}") do
|
152
|
+
# @mutex.timeout_sync(2, "[]") do
|
153
153
|
@data[key].deep_dup
|
154
154
|
end
|
155
155
|
end
|
@@ -169,8 +169,8 @@ module DangoFrameworkModule
|
|
169
169
|
end
|
170
170
|
|
171
171
|
# ロックしてデータを入れる
|
172
|
-
@mutex[key].timeout_sync(
|
173
|
-
# @mutex.timeout_sync(
|
172
|
+
@mutex[key].timeout_sync(2, "[]= #{key}") do
|
173
|
+
# @mutex.timeout_sync(2, "[]=") do
|
174
174
|
@data[key] = value.deep_dup
|
175
175
|
end
|
176
176
|
|
data/lib/dango/socket_list.rb
CHANGED
@@ -8,19 +8,19 @@ class SocketList
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def all_sid()
|
11
|
-
@sl_mutex.timeout_sync(
|
11
|
+
@sl_mutex.timeout_sync(2, :all_sid) do
|
12
12
|
@sl_hash.keys
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def delete(sid)
|
17
|
-
@sl_mutex.timeout_sync(
|
17
|
+
@sl_mutex.timeout_sync(2, :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.timeout_sync(
|
23
|
+
@sl_mutex.timeout_sync(2, :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.timeout_sync(
|
31
|
+
@sl_mutex.timeout_sync(2, "[]") 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]
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# 環境変数設定
|
2
2
|
ENV['RAILS_ENV'] = ENV['RAILS_ENV'] || 'development'
|
3
3
|
|
4
|
+
$KCODE = "u"
|
5
|
+
|
4
6
|
require "pp"
|
5
7
|
require "timeout"
|
6
8
|
require "yaml"
|
@@ -153,29 +155,35 @@ class DangoRakeUtil
|
|
153
155
|
|
154
156
|
sid = nil
|
155
157
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
158
|
+
tester = DangoTesterClient.new # 開始
|
159
|
+
3.times do |i| # 3回接続確認する
|
160
|
+
begin
|
161
|
+
tester1 = nil
|
162
|
+
timeout(6) do
|
163
|
+
tester1 = tester.new_client("tester1", serv_info) # テスター1
|
164
|
+
|
165
|
+
5.times do |j|
|
166
|
+
sleep 1
|
167
|
+
sid = tester1.sid.deep_dup
|
168
|
+
tester1.logger.warn "count=#{j} sid=#{sid}"
|
169
|
+
puts_verbose "count=#{j} sid=#{sid}"
|
170
|
+
break if sid
|
171
|
+
end
|
172
|
+
tester1.dango_client_close if tester1.respond_to?(:dango_client_close)
|
167
173
|
end
|
174
|
+
rescue TimeoutError
|
175
|
+
sid = nil
|
176
|
+
puts_verbose "DangoTesterClient.TimeoutError"
|
168
177
|
end
|
169
|
-
|
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)
|
178
|
+
|
174
179
|
tester1 = nil
|
175
|
-
|
180
|
+
|
181
|
+
break if sid # 接続に成功していたらスキップ
|
182
|
+
|
183
|
+
puts_verbose "test connect failed #{i}"
|
176
184
|
end
|
177
185
|
|
178
|
-
|
186
|
+
tester.gc_thread_stop
|
179
187
|
|
180
188
|
if sid
|
181
189
|
is_alive_server = true
|
@@ -325,40 +333,89 @@ namespace :dango do
|
|
325
333
|
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
326
334
|
dru.puts_noverbose "check_dango_process"
|
327
335
|
|
336
|
+
# サーバーを再起動するかどうかの判定
|
328
337
|
pid = dru.get_dango_pid() # pidのチェック
|
329
338
|
is_pid_exist = dru.check_exist_dango_process(pid) # pidのプロセスがあるかどうかのチェック
|
330
339
|
is_alive_server = dru.check_dango_connect() if is_pid_exist # サーバーへの通信を使ったチェック
|
331
340
|
|
332
|
-
|
333
|
-
config = YAML.load(open("#{RAILS_ROOT}/config/dango/#{ENV['RAILS_ENV']}.yml", "rb"){|fh| fh.read})
|
334
|
-
check_dango_process_cmd = config['server']['check_dango_process_cmd'] || nil
|
341
|
+
sleep 1
|
335
342
|
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
343
|
+
if is_alive_server
|
344
|
+
# サーバーが生きている場合
|
345
|
+
dru.puts_noverbose "server is alive. is_alive_server=#{is_alive_server.inspect}"
|
346
|
+
|
347
|
+
# コンフィグから check_dango_process_cmd を取得
|
348
|
+
config = YAML.load(open("#{RAILS_ROOT}/config/dango/#{ENV['RAILS_ENV']}.yml", "rb"){|fh| fh.read})
|
349
|
+
begin
|
350
|
+
check_dango_process_cmd = config['server']['check_dango_process']['long_alive_restart_cmd'] || nil
|
351
|
+
long_alive_minutes = config['server']['check_dango_process']['long_alive_minutes'] || 7 * 24 * 60
|
352
|
+
rescue
|
353
|
+
check_dango_process_cmd = nil
|
354
|
+
long_alive_minutes = 7 * 24 * 60
|
355
|
+
end
|
356
|
+
|
357
|
+
# サーバーの起動時間をチェック
|
358
|
+
server_info = dru.drb_call(:_monitor_get_server_info)
|
359
|
+
socket_list = dru.drb_call(:_monitor_get_socket_list)
|
360
|
+
|
361
|
+
dru.puts_noverbose "server_up_time=#{server_info['server_up_time'].inspect} " +
|
362
|
+
"socket_list.size=#{socket_list.size}"
|
363
|
+
|
364
|
+
# サーバーが長く起動していて、接続者がいないのなら
|
365
|
+
if check_dango_process_cmd &&
|
366
|
+
server_info['server_up_time'].to_i > long_alive_minutes * 60 &&
|
367
|
+
socket_list.size == 0
|
368
|
+
|
369
|
+
dru.puts_noverbose "long alive restart."
|
340
370
|
|
341
|
-
|
371
|
+
# プロセス停止
|
372
|
+
dru.stop_process(pid)
|
373
|
+
|
374
|
+
# サーバーが止まっているので起動処理をかける
|
375
|
+
dru.puts_verbose "check_dango_process_cmd=#{check_dango_process_cmd}"
|
376
|
+
system(check_dango_process_cmd)
|
377
|
+
end
|
378
|
+
|
379
|
+
# テスト接続のログがあればそれを削除する
|
380
|
+
if File.file?(DangoRakeUtil::CheckConnectLogFile)
|
381
|
+
FileUtils.rm_f([DangoRakeUtil::CheckConnectLogFile])
|
342
382
|
end
|
343
|
-
end
|
344
|
-
|
345
|
-
# テスト接続のログがあればそれを削除する
|
346
|
-
if File.file?(DangoRakeUtil::CheckConnectLogFile)
|
347
|
-
FileUtils.rm_f([DangoRakeUtil::CheckConnectLogFile])
|
348
|
-
end
|
349
|
-
|
350
|
-
# サーバーが止まっているので起動処理をかける
|
351
|
-
if check_dango_process_cmd && ((! is_pid_exist) || (! is_alive_server))
|
352
|
-
dru.puts_verbose "check_dango_process_cmd=#{check_dango_process_cmd}"
|
353
383
|
|
354
|
-
|
384
|
+
else
|
385
|
+
# サーバーが死んでいた場合
|
386
|
+
dru.puts_noverbose "server is dead. is_alive_server=#{is_alive_server.inspect}"
|
387
|
+
|
388
|
+
# コンフィグから check_dango_process_cmd を取得
|
355
389
|
config = YAML.load(open("#{RAILS_ROOT}/config/dango/#{ENV['RAILS_ENV']}.yml", "rb"){|fh| fh.read})
|
356
|
-
|
390
|
+
begin
|
391
|
+
check_dango_process_cmd = config['server']['check_dango_process']['normal_restart_cmd'] || nil
|
392
|
+
rescue
|
393
|
+
check_dango_process_cmd = nil
|
394
|
+
end
|
357
395
|
|
358
|
-
|
396
|
+
# is_pid_existがないなら情報収集してから、サーバーを再起動する
|
397
|
+
if check_dango_process_cmd
|
398
|
+
if pid # pidがあれば
|
399
|
+
# 落ちた時の情報収集処理
|
400
|
+
dru.get_trouble_status(config, pid)
|
401
|
+
|
402
|
+
# プロセス停止
|
403
|
+
dru.stop_process(pid)
|
404
|
+
end
|
405
|
+
|
406
|
+
# サーバーが止まっているので起動処理をかける
|
407
|
+
dru.puts_verbose "check_dango_process_cmd=#{check_dango_process_cmd}"
|
408
|
+
system(check_dango_process_cmd)
|
409
|
+
end
|
410
|
+
|
411
|
+
# テスト接続のログがあればそれを削除する
|
412
|
+
if File.file?(DangoRakeUtil::CheckConnectLogFile)
|
413
|
+
FileUtils.rm_f([DangoRakeUtil::CheckConnectLogFile])
|
414
|
+
end
|
415
|
+
|
416
|
+
dru.puts_noverbose "complete check_dango_process."
|
359
417
|
end
|
360
418
|
|
361
|
-
dru.puts_noverbose "complete check_dango_process."
|
362
419
|
end
|
363
420
|
|
364
421
|
desc "get_trouble_status"
|
@@ -436,6 +493,14 @@ namespace :dango do
|
|
436
493
|
pp dru.drb_call(:_monitor_get_session_list)
|
437
494
|
end
|
438
495
|
|
496
|
+
desc "get_action_stat"
|
497
|
+
task :get_action_stat do
|
498
|
+
dru = DangoRakeUtil.new
|
499
|
+
dru.check_verbose_mode() # verboseモードのフラグを立てる処理
|
500
|
+
dru.puts_noverbose "get_action_stat"
|
501
|
+
pp dru.drb_call(:_monitor_get_action_stat)
|
502
|
+
end
|
503
|
+
|
439
504
|
desc "server_reload" # サーバーのリロード処理
|
440
505
|
task :server_reload do
|
441
506
|
dru = DangoRakeUtil.new
|
@@ -212,7 +212,6 @@ class TestClient < DangoClientFramework
|
|
212
212
|
logger.debug "ret_obj:#{name}:" + ret_obj.inspect + " " + Time.now_to_s
|
213
213
|
send_receive_shared.transaction(:receive_cache) do |receive_cache|
|
214
214
|
receive_cache.push([name, ret_obj, Time.now])
|
215
|
-
receive_cache
|
216
215
|
send_receive_shared.commit(receive_cache)
|
217
216
|
end
|
218
217
|
|
@@ -264,18 +263,14 @@ class TestClient < DangoClientFramework
|
|
264
263
|
# 結果を削除しておく
|
265
264
|
send_receive_shared.transaction(:receive_cache) do |receive_cache|
|
266
265
|
receive_cache.delete_at(receive_idx)
|
267
|
-
receive_cache
|
268
266
|
send_receive_shared.commit(receive_cache)
|
269
267
|
end
|
270
268
|
|
271
269
|
# 古いreceive_cacheを削除しておく
|
272
270
|
send_receive_shared.transaction(:receive_cache) do |receive_cache|
|
273
271
|
receive_cache = receive_cache.select do |one_receive_cache|
|
274
|
-
# true
|
275
272
|
one_receive_cache[2] > Time.now - @receive_cache_auto_delete_sec
|
276
273
|
end
|
277
|
-
|
278
|
-
receive_cache
|
279
274
|
send_receive_shared.commit(receive_cache)
|
280
275
|
end
|
281
276
|
|
@@ -284,14 +279,13 @@ class TestClient < DangoClientFramework
|
|
284
279
|
|
285
280
|
# clear_receive notice_nameを省略するとchacheにあるものすべて削除
|
286
281
|
def clear_receive(notice_name = nil, options = {})
|
287
|
-
logger.debug "
|
282
|
+
logger.debug "clear_receive:#{notice_name}:"
|
288
283
|
|
289
284
|
# 結果を削除しておく
|
290
285
|
send_receive_shared.transaction(:receive_cache) do |receive_cache|
|
291
286
|
receive_cache.delete_if do |one_rec_data|
|
292
287
|
true if (! notice_name) || (notice_name && one_rec_data[0] == notice_name)
|
293
288
|
end
|
294
|
-
receive_cache
|
295
289
|
send_receive_shared.commit(receive_cache)
|
296
290
|
end
|
297
291
|
end
|
data/lib/dango/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dango
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keisuke Minami
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-12-01 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -66,7 +66,6 @@ files:
|
|
66
66
|
- lib/dango/default_dango_receive.rb
|
67
67
|
- lib/dango/controller_plugin/dango_controller_plugin.rb
|
68
68
|
- lib/dango/monitor/dango_monitor_client.rb
|
69
|
-
- lib/dango/monitor/server_monitor_action.rb
|
70
69
|
- lib/dango/monitor/server_monitor_module.rb
|
71
70
|
- lib/dango/script/dango_server.rb
|
72
71
|
- lib/dango/shared/memory_store.rb
|
@@ -1,148 +0,0 @@
|
|
1
|
-
#!ruby -Ku
|
2
|
-
|
3
|
-
=begin
|
4
|
-
= Dangoサーバーのメンテナンス用サーバー側機能
|
5
|
-
=end
|
6
|
-
|
7
|
-
require 'ipaddr'
|
8
|
-
|
9
|
-
# メインクラス
|
10
|
-
class ServerMonitorAction
|
11
|
-
def initialize(parent, config, peerhost, peeraddr, ret_obj)
|
12
|
-
@parent = parent
|
13
|
-
@config = config
|
14
|
-
|
15
|
-
@logger = @parent.logger
|
16
|
-
@shared = @parent.shared
|
17
|
-
@session = @parent.session
|
18
|
-
@socket_list = @parent.socket_list
|
19
|
-
@session_list = @parent.session_list
|
20
|
-
|
21
|
-
# アクション名
|
22
|
-
action_name = ret_obj["action"].to_s
|
23
|
-
|
24
|
-
dango_check_monitor_error(peerhost, peeraddr, action_name)
|
25
|
-
|
26
|
-
if action_name == '_monitor_all_info' # メンテナンスアクション名なら
|
27
|
-
dango_server_monitor_all_info(ret_obj)
|
28
|
-
|
29
|
-
elsif action_name == '_monitor_get_server_info' # メンテナンスアクション名なら
|
30
|
-
dango_server_monitor_get_server_info(ret_obj)
|
31
|
-
|
32
|
-
elsif action_name == '_monitor_get_shared' # メンテナンスアクション名なら
|
33
|
-
dango_server_monitor_get_shared(ret_obj)
|
34
|
-
|
35
|
-
elsif action_name == '_monitor_get_session_list' # メンテナンスアクション名なら
|
36
|
-
dango_server_monitor_get_session_list(ret_obj)
|
37
|
-
|
38
|
-
elsif action_name == '_monitor_get_socket_list' # メンテナンスアクション名なら
|
39
|
-
dango_server_monitor_get_socket_list(ret_obj)
|
40
|
-
|
41
|
-
elsif action_name == '_monitor_send_system_message' # メンテナンスアクション名なら
|
42
|
-
dango_server_monitor_send_system_message(ret_obj)
|
43
|
-
|
44
|
-
else
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
attr_reader(:logger, :shared, :session, :socket_list, :session_list)
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
# メンテナンスコマンド:エラーの場合
|
53
|
-
def dango_check_monitor_error(peerhost, peeraddr, action_name)
|
54
|
-
backdoor_host = @backdoor_host
|
55
|
-
logger.debug "dango_check_monitor_error:peerhost=#{peerhost.inspect} peeraddr=#{peeraddr.inspect} backdoor_host=#{backdoor_host.inspect}"
|
56
|
-
|
57
|
-
match = false
|
58
|
-
if peerhost == backdoor_host # ホスト名で書いてある時の一致確認
|
59
|
-
match = true
|
60
|
-
else
|
61
|
-
begin # IPアドレスの一致確認
|
62
|
-
# match = true if IPAddr.new(backdoor_host).include?(peeraddr)
|
63
|
-
if IPAddr.new(backdoor_host).include?(IPAddr.new(peeraddr))
|
64
|
-
match = true
|
65
|
-
end
|
66
|
-
rescue
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
if !match
|
71
|
-
notice_name = "return_" + action_name
|
72
|
-
send_obj = {'code'=>1, 'message'=>"error your ip address"}
|
73
|
-
@parent.send_notice(notice_name, session[:sid], send_obj, :type=>2)
|
74
|
-
raise(DangoFrameworkMonitorSecurityError)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
79
|
-
def dango_server_monitor_get_server_info(ret_obj)
|
80
|
-
logger.debug "dango_server_monitor_get_server_info:#{ret_obj.inspect}"
|
81
|
-
get_server_info = {
|
82
|
-
'server_start_time' => @parent.start_time.strftime("%Y-%m-%d %H:%M:%S"),
|
83
|
-
'up_time' => Time.now - @parent.start_time,
|
84
|
-
|
85
|
-
'recv_count' => @parent.recv_count, # 受信回数
|
86
|
-
'send_count' => @parent.send_count, # 送信回数
|
87
|
-
'recv_fail_count' => @parent.recv_fail_count, # 受信失敗回数
|
88
|
-
'send_fail_count' => @parent.send_fail_count, # 送信失敗回数
|
89
|
-
|
90
|
-
'log_level' => @parent.log_level_str,
|
91
|
-
'log_file' => @parent.log_file,
|
92
|
-
'log_max_size' => @parent.log_max_size,
|
93
|
-
'log_shift_age' => @parent.log_shift_age,
|
94
|
-
}
|
95
|
-
|
96
|
-
send_obj = {'code'=>0, 'get_server_info'=>get_server_info}
|
97
|
-
@parent.send_notice('return__monitor_get_server_info', session[:sid], send_obj, :type=>2)
|
98
|
-
end
|
99
|
-
|
100
|
-
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
101
|
-
def dango_server_monitor_get_shared(ret_obj)
|
102
|
-
logger.debug "dango_server_monitor_get_shared:#{ret_obj.inspect}"
|
103
|
-
send_obj = {'code'=>0, 'get_shared'=>shared.to_hash}
|
104
|
-
@parent.send_notice('return__monitor_get_shared', session[:sid], send_obj, :type=>2)
|
105
|
-
end
|
106
|
-
|
107
|
-
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
108
|
-
def dango_server_monitor_get_session_list(ret_obj)
|
109
|
-
logger.debug "dango_server_monitor_get_session_list:#{ret_obj.inspect}"
|
110
|
-
send_obj = {'code'=>0, 'get_session_list'=>session_list}
|
111
|
-
@parent.send_notice('return__monitor_get_session_list', session[:sid], send_obj, :type=>2)
|
112
|
-
end
|
113
|
-
|
114
|
-
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
115
|
-
def dango_server_monitor_get_socket_list(ret_obj)
|
116
|
-
logger.debug "dango_server_monitor_get_socket_list:#{ret_obj.inspect}"
|
117
|
-
send_obj = {'code'=>0, 'get_socket_list'=>socket_list.keys}
|
118
|
-
@parent.send_notice('return__monitor_get_socket_list', session[:sid], send_obj, :type=>2)
|
119
|
-
end
|
120
|
-
|
121
|
-
# メンテナンスコマンド:サーバーデータ再読み込み
|
122
|
-
def dango_server_monitor_server_reload(ret_obj)
|
123
|
-
logger.debug "dango_server_monitor_server_reload"
|
124
|
-
@server_reload = true
|
125
|
-
logger.debug "@server_reload=#{@server_reload.inspect}"
|
126
|
-
send_obj = {'code'=>0, 'message'=>'success'}
|
127
|
-
@parent.send_notice('return__monitor_server_reload', session[:sid], send_obj, :type=>2)
|
128
|
-
end
|
129
|
-
|
130
|
-
# メンテナンスコマンド:接続者全員へメッセージ送信
|
131
|
-
def dango_server_monitor_send_system_message(ret_obj)
|
132
|
-
logger.debug "dango_server_monitor_send_system_message:#{ret_obj.inspect}"
|
133
|
-
|
134
|
-
# 全員へ_notice_system_messageを通知
|
135
|
-
socket_list.keys.each do |sid|
|
136
|
-
next if session[:sid] == sid
|
137
|
-
send_obj = { "message" => ret_obj["message"] }
|
138
|
-
@parent.send_notice('_notice_system_message', sid, send_obj)
|
139
|
-
end
|
140
|
-
|
141
|
-
send_obj = {'code'=>0, }
|
142
|
-
@parent.send_notice('return__monitor_send_system_message', session[:sid], send_obj, :type=>2)
|
143
|
-
end
|
144
|
-
|
145
|
-
end
|
146
|
-
|
147
|
-
|
148
|
-
|