dango 0.0.13 → 0.0.15
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/Manifest.txt +2 -0
- data/lib/dango/client_framework.rb +15 -12
- data/lib/dango/framework_base.rb +4 -2
- data/lib/dango/monitor/dango_monitor_client.rb +15 -1
- data/lib/dango/mutex_socket_list.rb +35 -0
- data/lib/dango/server_framework.rb +80 -129
- data/lib/dango/socket_list.rb +44 -0
- data/lib/dango/tasks/dango_rake.rb +27 -0
- data/lib/dango/tester/dango_tester_client.rb +56 -25
- data/lib/dango/version.rb +1 -1
- metadata +4 -2
data/Manifest.txt
CHANGED
@@ -3,6 +3,8 @@ README.txt
|
|
3
3
|
lib/dango/client_framework.rb
|
4
4
|
lib/dango/framework_base.rb
|
5
5
|
lib/dango/server_framework.rb
|
6
|
+
lib/dango/mutex_socket_list.rb
|
7
|
+
lib/dango/socket_list.rb
|
6
8
|
lib/dango/monitor/dango_monitor_client.rb
|
7
9
|
lib/dango/script/dango_server.rb
|
8
10
|
lib/dango/shared/memory_store.rb
|
@@ -98,41 +98,40 @@ class DangoClientFramework
|
|
98
98
|
loop do
|
99
99
|
begin
|
100
100
|
if @sock
|
101
|
-
cs_logger.debug "#{@sid}
|
101
|
+
cs_logger.debug "start receive_data #{@sid}"
|
102
102
|
ret_obj = nil
|
103
103
|
begin
|
104
104
|
ret_obj = cs_receive_data(@sock) # データ受信処理
|
105
105
|
rescue DangoFrameworkConnectionError
|
106
|
-
cs_logger.debug "#{@sid}
|
106
|
+
cs_logger.debug "sock error #{@sid}:#{error_message($!, 'u')}"
|
107
107
|
throw(:session_closed)
|
108
108
|
rescue DangoFrameworkError
|
109
|
-
cs_logger.debug "#{@sid}
|
109
|
+
cs_logger.debug "sock error #{@sid}:#{error_message($!, 'u')}"
|
110
110
|
throw(:session_closed)
|
111
111
|
end
|
112
|
-
cs_logger.debug "
|
112
|
+
cs_logger.debug "finished cs_receive_data:#{ret_obj.inspect} #{@sid}"
|
113
113
|
|
114
114
|
if !(ret_obj && ret_obj["notice"])
|
115
|
-
cs_logger.info "
|
115
|
+
cs_logger.info "no notice:#{ret_obj["notice"].inspect} #{@sid}"
|
116
116
|
end
|
117
117
|
|
118
118
|
# メソッド呼び出し
|
119
|
-
cs_logger.info "
|
119
|
+
cs_logger.info "calling method=#{ret_obj["notice"].inspect} #{@sid}"
|
120
120
|
begin
|
121
121
|
__send__("cs_receive_#{ret_obj["notice"]}", ret_obj)
|
122
122
|
rescue
|
123
|
-
cs_logger.error "error in cs_receive_#{ret_obj["notice"]}\n#{error_message($!, 'u')}"
|
123
|
+
cs_logger.error "error in cs_receive_#{ret_obj["notice"]} #{@sid}\n#{error_message($!, 'u')}"
|
124
124
|
ensure
|
125
125
|
# データの受信の送信返し
|
126
126
|
response_notice_name = "_response"
|
127
127
|
send_obj = {"_id" => ret_obj["_id"]}
|
128
128
|
cs_client_send_data(response_notice_name, send_obj)
|
129
|
-
cs_logger.debug "
|
129
|
+
cs_logger.debug "response_notice_name=#{response_notice_name.inspect} #{@sid}"
|
130
130
|
end
|
131
|
-
cs_logger.debug "
|
132
|
-
|
131
|
+
cs_logger.debug "called method=#{ret_obj["notice"].inspect} #{@sid}"
|
133
132
|
|
134
133
|
else
|
135
|
-
sleep 0.
|
134
|
+
sleep 0.01
|
136
135
|
end
|
137
136
|
|
138
137
|
rescue Exception
|
@@ -150,6 +149,10 @@ class DangoClientFramework
|
|
150
149
|
@sid = rec_obj["_sid"]
|
151
150
|
end
|
152
151
|
|
152
|
+
# システムからのメッセージ通知なら
|
153
|
+
def cs_receive__notice_system_message(rec_obj)
|
154
|
+
end
|
155
|
+
|
153
156
|
# ユーザーが終了させたい時に呼び出すメソッド(セッションを切る)
|
154
157
|
def cs_client_close
|
155
158
|
client_quit() # クライアントの終了処理
|
@@ -188,7 +191,7 @@ class DangoClientFramework
|
|
188
191
|
|
189
192
|
# クライアントからサーバーへのデータ送信
|
190
193
|
def cs_client_send_data(action_name, send_obj)
|
191
|
-
cs_logger.debug "cs_client_send_data(#{action_name.inspect}, #{send_obj['_id']}) #{Time.
|
194
|
+
cs_logger.debug "cs_client_send_data(#{action_name.inspect}, #{send_obj['_id']}) #{Time.now_to_s}"
|
192
195
|
send_obj_dup = send_obj.dup
|
193
196
|
send_obj_dup["action"] = action_name.to_s
|
194
197
|
cs_send_data(@sock, send_obj_dup)
|
data/lib/dango/framework_base.rb
CHANGED
@@ -59,7 +59,21 @@ class DangoMonitorClient < DangoClientFramework
|
|
59
59
|
raise("monitor_server_reload Timeout error")
|
60
60
|
end
|
61
61
|
raise("code is not 0 (faild). :code=#{ret_obj['code']}") if ret_obj['code'] != 0
|
62
|
-
|
62
|
+
true
|
63
|
+
end
|
64
|
+
|
65
|
+
# システムメッセージの送信
|
66
|
+
def send_system_message(message = "")
|
67
|
+
cs_logger.debug "DangoMonitorClient:send_system_message"
|
68
|
+
begin
|
69
|
+
ret_obj = cs_client_send_receive_data('monitor_send_system_message', {:message=>message})
|
70
|
+
rescue DangoFrameworkConnectionError
|
71
|
+
raise("monitor_send_system_message Connection error")
|
72
|
+
rescue DangoFrameworkTimeoutError
|
73
|
+
raise("monitor_send_system_message Timeout error")
|
74
|
+
end
|
75
|
+
raise("code is not 0 (faild). :code=#{ret_obj['code']}") if ret_obj['code'] != 0
|
76
|
+
true
|
63
77
|
end
|
64
78
|
end
|
65
79
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!ruby -Ku
|
2
|
+
|
3
|
+
# ソケット毎用のmutex
|
4
|
+
class MutexSocketList
|
5
|
+
def initialize()
|
6
|
+
@msl_hash = Hash.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def keys()
|
10
|
+
@msl_hash.keys
|
11
|
+
end
|
12
|
+
|
13
|
+
def delete(key)
|
14
|
+
@msl_hash.delete(key)
|
15
|
+
end
|
16
|
+
|
17
|
+
def add(key)
|
18
|
+
@msl_hash[key] = Mutex.new
|
19
|
+
end
|
20
|
+
|
21
|
+
# def [](key)
|
22
|
+
# raise("not exist key(#{key})") if ! @msl_hash.has_key?(key)
|
23
|
+
# add(key) if @msl_hash.has_key?(key)
|
24
|
+
# @msl_hash[key]
|
25
|
+
# end
|
26
|
+
|
27
|
+
def synchronize(key)
|
28
|
+
raise("not exist key(#{key})") if ! @msl_hash.has_key?(key)
|
29
|
+
ret = nil
|
30
|
+
@msl_hash[key].synchronize do
|
31
|
+
ret = yield
|
32
|
+
end
|
33
|
+
ret
|
34
|
+
end
|
35
|
+
end
|
@@ -9,6 +9,8 @@ require 'ipaddr'
|
|
9
9
|
require 'digest/md5'
|
10
10
|
|
11
11
|
require "dango/framework_base"
|
12
|
+
require "dango/socket_list"
|
13
|
+
require "dango/mutex_socket_list"
|
12
14
|
|
13
15
|
# フレームワーククラス
|
14
16
|
class DangoServerFramework
|
@@ -54,7 +56,7 @@ class DangoServerFramework
|
|
54
56
|
|
55
57
|
loop do # 待ちで無限ループに入る
|
56
58
|
sleep 3
|
57
|
-
# p( Time.
|
59
|
+
# p( Time.now_to_s + ":#{@server_reload.inspect}")
|
58
60
|
check_reload_class()
|
59
61
|
end
|
60
62
|
end
|
@@ -71,14 +73,17 @@ class DangoServerFramework
|
|
71
73
|
set_server_variables() # 各種サーバー仕様の変数設定
|
72
74
|
|
73
75
|
cs_logger.debug("===== server initialize =====") # loggerの準備
|
76
|
+
cs_logger.debug("Process.pid=#{Process.pid}")
|
74
77
|
cs_logger.debug("port=#{@connection_server_port}")
|
75
78
|
cs_logger.debug("host=#{@connection_server_host}")
|
76
79
|
cs_logger.debug("max_connections=#{@connection_server_max_connections}")
|
77
80
|
|
81
|
+
open("tmp/pids/dango.pid", "wb"){|fh| fh.write Process.pid.to_s }
|
82
|
+
|
78
83
|
shared_init() # 共有メモリを初期化
|
79
84
|
notice_shared_init() # 通知共有メモリを初期化
|
80
85
|
socket_list_init() # ソケット一覧を初期化
|
81
|
-
mutex_socket_list_init(
|
86
|
+
mutex_socket_list_init() # ソケット毎用のmutexを初期化
|
82
87
|
@mutex_proc_thread = Mutex.new # スレッドが同時起動しないようにするためのMutex
|
83
88
|
cs_server_init() # 初期設定読み込み
|
84
89
|
|
@@ -175,20 +180,21 @@ class DangoServerFramework
|
|
175
180
|
cs_logger.debug "#{sock} is accepted. key=#{Thread.current.object_id}"
|
176
181
|
|
177
182
|
begin
|
178
|
-
session[:session_id] = Thread.current.object_id
|
179
|
-
session_id = session[:session_id]
|
180
|
-
socket_list.add(session_id, sock)
|
181
|
-
mutex_socket_list.add(session_id)
|
182
|
-
|
183
183
|
sock.binmode
|
184
184
|
sock.sync = true
|
185
185
|
|
186
|
+
session[:sid] = Thread.current.object_id
|
187
|
+
sid = session[:sid]
|
188
|
+
socket_list.add(sid, sock)
|
189
|
+
mutex_socket_list.add(sid)
|
190
|
+
|
186
191
|
cs_connect() # 接続時メソッド呼び出し
|
187
192
|
|
188
193
|
# 接続直後のsid通知
|
189
194
|
# Thread.start do
|
190
|
-
send_obj = {"_sid"=>
|
191
|
-
cs_server_send_data(
|
195
|
+
send_obj = {"_sid"=>sid}
|
196
|
+
cs_server_send_data(sid, "_notice_sid", send_obj)
|
197
|
+
cs_logger.debug "_notice_sid #{sid} #{Time.now_to_s}"
|
192
198
|
# end
|
193
199
|
|
194
200
|
# メインループ入り
|
@@ -225,24 +231,28 @@ class DangoServerFramework
|
|
225
231
|
@mutex_proc_thread.synchronize do
|
226
232
|
|
227
233
|
if action_name == '_response' # 送信パケットの返事なら
|
228
|
-
# cs_logger.debug "action_name=#{action_name} #{Time.
|
234
|
+
# cs_logger.debug "action_name=#{action_name} #{Time.now_to_s}"
|
229
235
|
action_name_is_response(ret_obj)
|
230
236
|
|
231
237
|
elsif action_name == 'monitor_all_info' # メンテナンスアクション名なら
|
232
238
|
cs_check_monitor_error(sock, "return_monitor_all_info")
|
233
|
-
cs_server_monitor_all_info()
|
239
|
+
cs_server_monitor_all_info(ret_obj)
|
234
240
|
|
235
241
|
elsif action_name == 'monitor_server_reload' # メンテナンスアクション名なら
|
236
242
|
cs_check_monitor_error(sock, "return_monitor_server_reload")
|
237
|
-
cs_server_monitor_server_reload()
|
243
|
+
cs_server_monitor_server_reload(ret_obj)
|
244
|
+
|
245
|
+
elsif action_name == 'monitor_send_system_message' # メンテナンスアクション名なら
|
246
|
+
cs_check_monitor_error(sock, "return_monitor_send_system_message")
|
247
|
+
cs_server_monitor_send_system_message(ret_obj)
|
238
248
|
|
239
249
|
else # メンテナンスコマンド以外のユーザーアクション名なら
|
240
|
-
cs_logger.debug "action_name=#{action_name} #{Time.
|
250
|
+
cs_logger.debug "action_name=#{action_name} #{sid} #{Time.now_to_s}"
|
241
251
|
begin
|
242
252
|
__send__("cs_receive_#{action_name}", ret_obj)
|
243
253
|
rescue NoMethodError
|
244
254
|
@recv_fail_count += 1 if @recv_fail_count # 受信失敗回数カウント
|
245
|
-
cs_logger.error "not find action #{action_name}:#{error_message($!, 'u')}"
|
255
|
+
cs_logger.error "not find action #{action_name}:#{sid}:#{error_message($!, 'u')}"
|
246
256
|
end
|
247
257
|
end
|
248
258
|
|
@@ -251,17 +261,17 @@ class DangoServerFramework
|
|
251
261
|
end
|
252
262
|
|
253
263
|
rescue DangoFrameworkReadNoDataError
|
254
|
-
cs_logger.debug "read no data. maybe client closed. #{Thread.current.object_id} #{Time.
|
264
|
+
cs_logger.debug "read no data. maybe client closed. #{Thread.current.object_id} #{Time.now_to_s}"
|
255
265
|
|
256
266
|
rescue DangoFrameworkConnectionError
|
257
267
|
@recv_fail_count += 1 if @recv_fail_count # 受信失敗回数カウント
|
258
|
-
cs_logger.debug "connection error. #{Thread.current.object_id} #{Time.
|
268
|
+
cs_logger.debug "connection error. #{Thread.current.object_id} #{Time.now_to_s}\n#{error_message($!, 'u')}"
|
259
269
|
|
260
270
|
rescue DangoFrameworkError
|
261
|
-
cs_logger.debug "DangoFrameworkError. #{Thread.current.object_id} #{Time.
|
271
|
+
cs_logger.debug "DangoFrameworkError. #{Thread.current.object_id} #{Time.now_to_s}\n#{error_message($!, 'u')}"
|
262
272
|
|
263
273
|
rescue Exception
|
264
|
-
cs_logger.error "Exception #{Thread.current.object_id} #{Time.
|
274
|
+
cs_logger.error "Exception #{Thread.current.object_id} #{Time.now_to_s} #{error_message($!, 'u')}"
|
265
275
|
|
266
276
|
ensure
|
267
277
|
cs_logger.debug "#{sock.inspect} #{Thread.current.object_id} is gone"
|
@@ -337,12 +347,9 @@ class DangoServerFramework
|
|
337
347
|
def shared_init
|
338
348
|
@shared = select_shared_database_manager()
|
339
349
|
end
|
340
|
-
|
341
|
-
@shared
|
342
|
-
end
|
350
|
+
attr_accessor(:shared)
|
343
351
|
|
344
352
|
# 通知共有メモリ
|
345
|
-
|
346
353
|
def notice_shared_init
|
347
354
|
# @notice_shared = NoticeShared.new(self)
|
348
355
|
@notice_shared = select_shared_database_manager()
|
@@ -364,24 +371,24 @@ class DangoServerFramework
|
|
364
371
|
end
|
365
372
|
end
|
366
373
|
|
367
|
-
def add_connectable(key,
|
374
|
+
def add_connectable(key, sid) # 接続許可にする
|
368
375
|
if !self[:notice_list].has_key?(key) # キーがなければ
|
369
376
|
raise(DangoFrameworkError, "notice_list not has key. key=#{key.inspect}")
|
370
377
|
end
|
371
378
|
|
372
379
|
self.transaction(:notice_list) do |notice_list|
|
373
|
-
notice_list[key] <<
|
380
|
+
notice_list[key] << sid
|
374
381
|
notice_list
|
375
382
|
end
|
376
383
|
end
|
377
384
|
|
378
|
-
def remove_connectable(key,
|
385
|
+
def remove_connectable(key, sid) # 接続を不許可にする
|
379
386
|
if !self[:notice_list].has_key?(key) # キーがなければ
|
380
387
|
raise(DangoFrameworkError, "notice_list not has key. key=#{key.inspect}")
|
381
388
|
end
|
382
389
|
|
383
390
|
self.transaction(:notice_list) do |notice_list|
|
384
|
-
notice_list[key].delete(
|
391
|
+
notice_list[key].delete(sid)
|
385
392
|
notice_list
|
386
393
|
end
|
387
394
|
end
|
@@ -403,8 +410,8 @@ class DangoServerFramework
|
|
403
410
|
|
404
411
|
@parent.cs_logger.debug "self.get_connectables(key):#{self.get_connectables(key).inspect}"
|
405
412
|
|
406
|
-
self.get_connectables(key).each do |
|
407
|
-
@parent.cs_server_send_data(
|
413
|
+
self.get_connectables(key).each do |sid|
|
414
|
+
@parent.cs_server_send_data(sid, "notice_shared_#{key}".to_sym, value)
|
408
415
|
end
|
409
416
|
end
|
410
417
|
|
@@ -425,10 +432,7 @@ class DangoServerFramework
|
|
425
432
|
end
|
426
433
|
end
|
427
434
|
end
|
428
|
-
|
429
|
-
def notice_shared
|
430
|
-
@notice_shared
|
431
|
-
end
|
435
|
+
attr_accessor(:notice_shared)
|
432
436
|
|
433
437
|
# セッション
|
434
438
|
class Session < Hash
|
@@ -439,87 +443,16 @@ class DangoServerFramework
|
|
439
443
|
end
|
440
444
|
|
441
445
|
# ソケットとIDの対応
|
442
|
-
class SocketList
|
443
|
-
def initialize
|
444
|
-
@sl_hash = Hash.new
|
445
|
-
@sl_mutex = Mutex.new
|
446
|
-
end
|
447
|
-
def keys()
|
448
|
-
@sl_mutex.synchronize do
|
449
|
-
@sl_hash.keys
|
450
|
-
end
|
451
|
-
end
|
452
|
-
def delete(key)
|
453
|
-
@sl_mutex.synchronize do
|
454
|
-
@sl_hash.delete(key)
|
455
|
-
end
|
456
|
-
end
|
457
|
-
def add(key, sock)
|
458
|
-
@sl_mutex.synchronize do
|
459
|
-
raise("already exist key(#{key})") if @sl_hash.has_key?(key)
|
460
|
-
raise("sock(#{sock.ins}) is not Socket") if sock.kind_of?(Socket)
|
461
|
-
@sl_hash[key] = sock
|
462
|
-
end
|
463
|
-
end
|
464
|
-
def [](key)
|
465
|
-
@sl_mutex.synchronize do
|
466
|
-
raise("not exist key(#{key})") if ! @sl_hash.has_key?(key)
|
467
|
-
@sl_hash[key]
|
468
|
-
end
|
469
|
-
end
|
470
|
-
def []=(key, sock)
|
471
|
-
@sl_mutex.synchronize do
|
472
|
-
raise("not exist key(#{key})") if ! @sl_hash.has_key?(key)
|
473
|
-
raise("sock(#{sock.class}) is not Socket") if sock.kind_of?(Socket)
|
474
|
-
@sl_hash[key] = sock
|
475
|
-
end
|
476
|
-
end
|
477
|
-
end
|
478
446
|
def socket_list_init
|
479
447
|
@socket_list = SocketList.new
|
480
448
|
end
|
481
|
-
|
482
|
-
@socket_list
|
483
|
-
end
|
449
|
+
attr_accessor(:socket_list)
|
484
450
|
|
485
451
|
# ソケット毎用のmutex
|
486
|
-
|
487
|
-
|
488
|
-
@cs_logger = cs_logger
|
489
|
-
@msl_hash = Hash.new
|
490
|
-
end
|
491
|
-
def keys()
|
492
|
-
@msl_hash.keys
|
493
|
-
end
|
494
|
-
def delete(key)
|
495
|
-
@msl_hash.delete(key)
|
496
|
-
end
|
497
|
-
def add(key)
|
498
|
-
@msl_hash[key] = Mutex.new
|
499
|
-
end
|
500
|
-
# def [](key)
|
501
|
-
# raise("not exist key(#{key})") if ! @msl_hash.has_key?(key)
|
502
|
-
## add(key) if @msl_hash.has_key?(key)
|
503
|
-
# @msl_hash[key]
|
504
|
-
# end
|
505
|
-
def synchronize(key)
|
506
|
-
raise("not exist key(#{key})") if ! @msl_hash.has_key?(key)
|
507
|
-
# @cs_logger.debug("mutex_socket_list starting synchronize. key=#{key}")
|
508
|
-
ret = nil
|
509
|
-
@msl_hash[key].synchronize do
|
510
|
-
# @cs_logger.debug("mutex_socket_list started synchronize. key=#{key}")
|
511
|
-
ret = yield
|
512
|
-
# @cs_logger.debug("mutex_socket_list finished synchronize. key=#{key}")
|
513
|
-
end
|
514
|
-
ret
|
515
|
-
end
|
516
|
-
end
|
517
|
-
def mutex_socket_list_init(cs_logger)
|
518
|
-
@mutex_sock_list = MutexSocketList.new(cs_logger) # ソケット毎用のmutex
|
519
|
-
end
|
520
|
-
def mutex_socket_list
|
521
|
-
@mutex_sock_list
|
452
|
+
def mutex_socket_list_init()
|
453
|
+
@mutex_socket_list = MutexSocketList.new() # ソケット毎用のmutex
|
522
454
|
end
|
455
|
+
attr_accessor(:mutex_socket_list)
|
523
456
|
|
524
457
|
# 接続時に呼び出されるメソッド
|
525
458
|
def cs_connect; end
|
@@ -545,22 +478,23 @@ class DangoServerFramework
|
|
545
478
|
end
|
546
479
|
|
547
480
|
# サーバーからクライアントへのデータ送信
|
548
|
-
def cs_server_send_data(
|
549
|
-
|
481
|
+
def cs_server_send_data(sid, notice_name, send_obj, options = {})
|
482
|
+
cs_logger.debug "cs_server_send_data(#{sid.inspect}, #{notice_name.inspect}) #{Time.now_to_s}"
|
483
|
+
# cs_logger.debug "cs_server_send_data(#{sid.inspect}, #{notice_name.inspect}, #{send_obj.inspect}, #{options.inspect})"
|
550
484
|
|
551
485
|
raise(DangoFrameworkError, "send_obj is not Hash.") if ! send_obj.is_a?(Hash)
|
552
486
|
|
553
487
|
timeout = options[:timeout] || SendReceiveTimeoutDefaultSec
|
554
488
|
dtype = options[:type] || 0
|
555
489
|
|
556
|
-
sock = socket_list[
|
557
|
-
raise(DangoFrameworkError, "not found
|
558
|
-
raise(DangoFrameworkConnectionError, "socket closed. s_id=#{
|
490
|
+
sock = socket_list[sid]
|
491
|
+
raise(DangoFrameworkError, "not found sid=#{sid}") if !sock
|
492
|
+
raise(DangoFrameworkConnectionError, "socket closed. s_id=#{sid}") if sock.closed?
|
559
493
|
|
560
494
|
# cs_logger.debug "cs_server_send_data:sending data notice_name=#{notice_name.inspect}"
|
561
495
|
send_obj_dup = send_obj.deep_dup
|
562
496
|
send_obj_dup["notice"] = notice_name.to_s
|
563
|
-
send_obj_dup["_id"] = Digest::MD5.hexdigest(
|
497
|
+
send_obj_dup["_id"] = Digest::MD5.hexdigest(sid.to_s + Time.now.to_i.to_s)
|
564
498
|
|
565
499
|
# データ送信時にクライアントからのレスポンスを確認する(Flashのバグらしきもの対策)
|
566
500
|
# if notice_name.to_s =~ /^return_/
|
@@ -573,22 +507,23 @@ class DangoServerFramework
|
|
573
507
|
else
|
574
508
|
Thread.start do
|
575
509
|
begin
|
576
|
-
mutex_socket_list.synchronize(
|
510
|
+
mutex_socket_list.synchronize(sid) do
|
511
|
+
cs_logger.warn "mutex_socket_list:synchronize:#{notice_name} #{sid} #{Time.now_to_s}"
|
577
512
|
have_came_response = nil
|
578
513
|
|
579
514
|
receive_thread = Thread.start do
|
580
515
|
begin
|
581
516
|
cs_send_data(sock, send_obj_dup, :type=>dtype) # データ送信
|
582
|
-
|
517
|
+
cs_logger.debug "cs_server_send_data:sent:notice_name=#{notice_name.inspect} #{sid} #{Time.now_to_s}"
|
583
518
|
rescue DangoFrameworkError
|
584
|
-
cs_logger.debug "cs_server_send_data:DangoFrameworkError:notice_name=#{notice_name.inspect}
|
519
|
+
cs_logger.debug "ERROR:cs_server_send_data:DangoFrameworkError:notice_name=#{notice_name.inspect} #{sid} #{Time.now_to_s}"
|
585
520
|
end
|
586
521
|
end
|
587
522
|
|
588
523
|
# データ送信スレッドの終了待ち
|
589
524
|
if !receive_thread.join(SendTimeoutSec)
|
590
525
|
# タイムアウトの場合は
|
591
|
-
cs_logger.warn "cs_server_send_data:send timeout:#{notice_name}"
|
526
|
+
cs_logger.warn "cs_server_send_data:send timeout:#{notice_name} #{sid} #{Time.now_to_s}"
|
592
527
|
else
|
593
528
|
end_reserved_time = Time.now + timeout
|
594
529
|
|
@@ -603,7 +538,7 @@ class DangoServerFramework
|
|
603
538
|
@mutex_send_response.synchronize do
|
604
539
|
if @arr_send_response.delete(send_obj_dup["_id"])
|
605
540
|
have_came_response = true
|
606
|
-
# cs_logger.debug "response check ok:#{notice_name} #{
|
541
|
+
# cs_logger.debug "response check ok:#{notice_name} #{sid} #{Time.now_to_s}"
|
607
542
|
throw(:send_timeout)
|
608
543
|
end
|
609
544
|
end
|
@@ -613,7 +548,7 @@ class DangoServerFramework
|
|
613
548
|
end # catch 終わり
|
614
549
|
|
615
550
|
if !have_came_response # 戻ってきたデータがあるかどうかチェック
|
616
|
-
cs_logger.warn "!!! received data is none
|
551
|
+
cs_logger.warn "!!! received data is none:#{notice_name} #{sid} #{Time.now_to_s}"
|
617
552
|
end
|
618
553
|
end
|
619
554
|
end
|
@@ -643,13 +578,13 @@ class DangoServerFramework
|
|
643
578
|
|
644
579
|
if !match
|
645
580
|
send_obj = {'code'=>1, 'message'=>"error your ip address"}
|
646
|
-
cs_server_send_data(session[:
|
581
|
+
cs_server_send_data(session[:sid], return_command, send_obj, :type=>2)
|
647
582
|
raise(DangoFrameworkError)
|
648
583
|
end
|
649
584
|
end
|
650
585
|
|
651
586
|
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
652
|
-
def cs_server_monitor_all_info()
|
587
|
+
def cs_server_monitor_all_info(ret_obj)
|
653
588
|
all_info = {
|
654
589
|
'shareds' => shared.to_hash,
|
655
590
|
'socket_list' => socket_list.keys,
|
@@ -665,16 +600,31 @@ class DangoServerFramework
|
|
665
600
|
}
|
666
601
|
|
667
602
|
send_obj = {'code'=>0, 'all_info'=>all_info}
|
668
|
-
cs_server_send_data(session[:
|
603
|
+
cs_server_send_data(session[:sid], 'return_monitor_all_info', send_obj, :type=>2)
|
669
604
|
end
|
670
605
|
|
671
|
-
#
|
672
|
-
def cs_server_monitor_server_reload()
|
606
|
+
# メンテナンスコマンド:サーバーデータ再読み込み
|
607
|
+
def cs_server_monitor_server_reload(ret_obj)
|
673
608
|
cs_logger.debug "cs_server_monitor_server_reload"
|
674
609
|
@server_reload = true
|
675
610
|
cs_logger.debug "@server_reload=#{@server_reload.inspect}"
|
676
611
|
send_obj = {'code'=>0, 'message'=>'success'}
|
677
|
-
cs_server_send_data(session[:
|
612
|
+
cs_server_send_data(session[:sid], 'return_monitor_server_reload', send_obj, :type=>2)
|
613
|
+
end
|
614
|
+
|
615
|
+
# メンテナンスコマンド:接続者全員へメッセージ送信
|
616
|
+
def cs_server_monitor_send_system_message(ret_obj)
|
617
|
+
cs_logger.debug "cs_server_monitor_send_system_message:#{ret_obj.inspect}"
|
618
|
+
|
619
|
+
# 全員へ_notice_system_messageを通知
|
620
|
+
socket_list.keys.each do |sid|
|
621
|
+
next if session[:sid] == sid
|
622
|
+
send_obj = { "message" => ret_obj["message"] }
|
623
|
+
cs_server_send_data(sid, '_notice_system_message', send_obj)
|
624
|
+
end
|
625
|
+
|
626
|
+
send_obj = {'code'=>0, }
|
627
|
+
cs_server_send_data(session[:sid], 'return_monitor_send_system_message', send_obj, :type=>2)
|
678
628
|
end
|
679
629
|
|
680
630
|
# 必要に応じて追加するメソッド
|
@@ -687,7 +637,8 @@ class DangoServerFramework
|
|
687
637
|
end
|
688
638
|
end
|
689
639
|
|
690
|
-
|
640
|
+
# 共有メモリ変更通知のメソッド
|
641
|
+
def method_action_notice_shared(key, name, *args)
|
691
642
|
cs_logger.debug "method_name:#{name}"
|
692
643
|
send_obj = args[0]
|
693
644
|
notice_shared.notice_change(key.to_sym, send_obj)
|
@@ -700,8 +651,8 @@ class DangoServerFramework
|
|
700
651
|
options = options.deep_dup
|
701
652
|
options[:rate] ||= 10
|
702
653
|
|
703
|
-
|
704
|
-
cs_logger.debug "flameloop_thread
|
654
|
+
wait_sec = 1.0 / options[:rate]
|
655
|
+
cs_logger.debug "flameloop_thread wait_sec:#{wait_sec.inspect}"
|
705
656
|
|
706
657
|
Thread.new do
|
707
658
|
loop do
|
@@ -712,7 +663,7 @@ class DangoServerFramework
|
|
712
663
|
cs_logger.debug "flameloop_thread error:#{error_message($!, 'u')}"
|
713
664
|
end
|
714
665
|
end
|
715
|
-
sleep
|
666
|
+
sleep wait_sec
|
716
667
|
end
|
717
668
|
end
|
718
669
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!ruby -Ku
|
2
|
+
|
3
|
+
# ソケットとIDの対応
|
4
|
+
class SocketList
|
5
|
+
def initialize
|
6
|
+
@sl_hash = Hash.new
|
7
|
+
@sl_mutex = Mutex.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def keys()
|
11
|
+
@sl_mutex.synchronize do
|
12
|
+
@sl_hash.keys
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def delete(key)
|
17
|
+
@sl_mutex.synchronize do
|
18
|
+
@sl_hash.delete(key)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def add(key, sock)
|
23
|
+
@sl_mutex.synchronize do
|
24
|
+
raise("already exist key(#{key})") if @sl_hash.has_key?(key)
|
25
|
+
raise("sock(#{sock.ins}) is not Socket") if sock.kind_of?(Socket)
|
26
|
+
@sl_hash[key] = sock
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def [](key)
|
31
|
+
@sl_mutex.synchronize do
|
32
|
+
raise("not exist key(#{key})") if ! @sl_hash.has_key?(key)
|
33
|
+
@sl_hash[key]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def []=(key, sock)
|
38
|
+
@sl_mutex.synchronize do
|
39
|
+
raise("not exist key(#{key})") if ! @sl_hash.has_key?(key)
|
40
|
+
raise("sock(#{sock.class}) is not Socket") if sock.kind_of?(Socket)
|
41
|
+
@sl_hash[key] = sock
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -32,6 +32,33 @@ namespace :dango do
|
|
32
32
|
puts "complete server_reload."
|
33
33
|
end
|
34
34
|
|
35
|
+
desc "send_system_message" # システムメッセージ配信
|
36
|
+
task :send_system_message do
|
37
|
+
puts "send_system_message"
|
38
|
+
message_type = ENV["TYPE"]
|
39
|
+
if ! message_type
|
40
|
+
puts "please type. ex. rake dango:monitor:send_system_message TYPE=down_1min"
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
|
44
|
+
require "yaml"
|
45
|
+
require 'dango/monitor/dango_monitor_client.rb'
|
46
|
+
|
47
|
+
system_message = YAML.load(open("dango/config/system_message.yml", "rb"){|fh| fh.read})
|
48
|
+
message = system_message[message_type]
|
49
|
+
|
50
|
+
begin
|
51
|
+
dm = DangoMonitorClient.new()
|
52
|
+
p dm.send_system_message(message)
|
53
|
+
dm.cs_client_close
|
54
|
+
rescue
|
55
|
+
p $!.class
|
56
|
+
p $!.message
|
57
|
+
p $!.backtrace
|
58
|
+
end
|
59
|
+
puts "complete server_reload."
|
60
|
+
end
|
61
|
+
|
35
62
|
end
|
36
63
|
|
37
64
|
end
|
@@ -43,8 +43,9 @@ end
|
|
43
43
|
|
44
44
|
# テスト接続用のクラス
|
45
45
|
class TestClient < DangoClientFramework
|
46
|
-
SendReceiveSleepIntervalSec = 0.001
|
47
|
-
|
46
|
+
SendReceiveSleepIntervalSec = 0.001 # データ送信後の順の際のタイムアウトチェック間隔秒
|
47
|
+
ReceiveWaitTimeoutSec = 10 # データ受信確認の待ち秒数
|
48
|
+
ReceiveTrapTimeoutSec = 0 # データ受信確認のトラップの秒数
|
48
49
|
|
49
50
|
def initialize(env, config, c_name)
|
50
51
|
@config = config
|
@@ -55,6 +56,8 @@ class TestClient < DangoClientFramework
|
|
55
56
|
@receive_mutex = Mutex.new # 送受信用の排他処理
|
56
57
|
@receive_arr = []
|
57
58
|
|
59
|
+
@receive_methods = []
|
60
|
+
|
58
61
|
send_receive_shared_init()
|
59
62
|
end
|
60
63
|
|
@@ -79,34 +82,50 @@ class TestClient < DangoClientFramework
|
|
79
82
|
|
80
83
|
# テストサーバー
|
81
84
|
def send(name, send_obj = {})
|
82
|
-
cs_logger.debug("tester.send:send_obj=#{send_obj.inspect} #{Time.
|
85
|
+
cs_logger.debug("tester.send:send_obj=#{send_obj.inspect} #{Time.now_to_s}")
|
83
86
|
cs_client_send_data(name, send_obj)
|
84
87
|
end
|
85
88
|
|
86
89
|
# trap_receive_data
|
87
90
|
def trap_receive_data(receive_name, options = {})
|
88
|
-
cs_logger.debug "trap_receive_data:#{receive_name}:#{Time.
|
89
|
-
timeout = options[:timeout] ||
|
91
|
+
cs_logger.debug "trap_receive_data:#{receive_name}:#{Time.now_to_s}"
|
92
|
+
timeout = options[:timeout] || ReceiveTrapTimeoutSec
|
93
|
+
trap_proc = options[:proc] || nil
|
94
|
+
raise(ArgumentError, ":proc is not Proc class.") if trap_proc && ! trap_proc.is_a?(Proc)
|
95
|
+
|
96
|
+
cs_logger.debug "trap_receive_data:trap_proc:#{trap_proc.inspect}"
|
90
97
|
|
91
98
|
Thread.start do
|
92
99
|
send_receive_shared[receive_name] = nil
|
93
|
-
|
100
|
+
if timeout == 0
|
101
|
+
end_reserved_time = Time.at(0) # 0ならepochを入れる
|
102
|
+
else
|
103
|
+
end_reserved_time = Time.now + timeout # 0以上ならタイムアウト時間決定
|
104
|
+
end
|
94
105
|
|
95
|
-
#
|
106
|
+
# 戻ってきたデータのチェックメソッド
|
96
107
|
receive_name_sym = (receive_name.class == Symbol) ? (":"+receive_name.to_s) : ('"'+receive_name+'"')
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
108
|
+
|
109
|
+
if ! @receive_methods.include?(receive_name_sym)
|
110
|
+
instance_method_name = "cs_receive_#{receive_name}"
|
111
|
+
expr = <<-EOF
|
112
|
+
def self.#{instance_method_name}(ret_obj)
|
113
|
+
cs_logger.debug "ret_obj:" + ret_obj.inspect
|
114
|
+
send_receive_shared[#{receive_name_sym}] = ret_obj
|
115
|
+
end
|
116
|
+
EOF
|
117
|
+
instance_eval expr
|
118
|
+
@receive_methods.push(receive_name_sym)
|
119
|
+
end
|
105
120
|
|
106
121
|
# タイムアウトチェック
|
107
|
-
|
108
|
-
|
109
|
-
|
122
|
+
cs_logger.debug "trap_receive_data:666:#{end_reserved_time}"
|
123
|
+
loop do
|
124
|
+
# (timeout.to_f / SendReceiveSleepIntervalSec).to_i.times do
|
125
|
+
# if end_reserved_time < Time.now
|
126
|
+
|
127
|
+
if end_reserved_time != Time.at(0) && end_reserved_time < Time.now
|
128
|
+
raise(DangoFrameworkTimeoutError, "timeout:client_name=#{@client_name}:receive_name=#{receive_name} #{Time.now_to_s}")
|
110
129
|
end
|
111
130
|
|
112
131
|
# 戻ってきたデータがあれば
|
@@ -118,21 +137,33 @@ class TestClient < DangoClientFramework
|
|
118
137
|
sleep SendReceiveSleepIntervalSec # スリープ
|
119
138
|
end
|
120
139
|
|
121
|
-
|
140
|
+
cs_logger.debug "trap_receive_data:555"
|
141
|
+
# 戻ってきたデータがあるかどうかチェック
|
142
|
+
if !send_receive_shared[receive_name]
|
122
143
|
raise(DangoFrameworkError, "received data is none. sid=#{sid} receive_name=#{receive_name}")
|
123
144
|
end
|
124
145
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
146
|
+
# :procが設定されている場合は、それを呼び出す
|
147
|
+
cs_logger.debug "trap_receive_data:222:#{receive_name}:#{trap_proc.inspect}"
|
148
|
+
if trap_proc
|
149
|
+
cs_logger.debug "trap_receive_data:333:#{receive_name}"
|
150
|
+
cs_logger.debug "trap_receive_data:trap_proc is true:#{trap_proc.inspect}"
|
151
|
+
trap_proc.call(send_receive_shared[receive_name])
|
152
|
+
|
153
|
+
# :procが設定されていなければ、wait用に@receive_arrに入れておく
|
154
|
+
else
|
155
|
+
cs_logger.debug "trap_receive_data:444"
|
156
|
+
@receive_mutex.synchronize do
|
157
|
+
cs_logger.debug "receive_name:#{receive_name}:#{send_receive_shared[receive_name].inspect}"
|
158
|
+
@receive_arr.push([receive_name, send_receive_shared[receive_name]])
|
159
|
+
end
|
129
160
|
end
|
130
161
|
end
|
131
162
|
end
|
132
163
|
|
133
164
|
# wait_receive_data
|
134
165
|
def wait_receive_data(receive_name, options = {})
|
135
|
-
timeout = options[:timeout] ||
|
166
|
+
timeout = options[:timeout] || ReceiveWaitTimeoutSec
|
136
167
|
|
137
168
|
# データ受信待ち
|
138
169
|
receive_data = nil
|
@@ -147,7 +178,7 @@ class TestClient < DangoClientFramework
|
|
147
178
|
|
148
179
|
# タイムアウトなら
|
149
180
|
if receive_data == nil
|
150
|
-
raise(DangoFrameworkTimeoutError, "timeout:client_name=#{@client_name}:receive_name=#{receive_name}")
|
181
|
+
raise(DangoFrameworkTimeoutError, "timeout:client_name=#{@client_name}:receive_name=#{receive_name} #{Time.now_to_s}")
|
151
182
|
end
|
152
183
|
|
153
184
|
# 結果を削除しておく
|
data/lib/dango/version.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: dango
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-10-
|
6
|
+
version: 0.0.15
|
7
|
+
date: 2007-10-18 00:00:00 +09:00
|
8
8
|
summary: Ruby - Flash conneciton network flamework
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -34,6 +34,8 @@ files:
|
|
34
34
|
- lib/dango/client_framework.rb
|
35
35
|
- lib/dango/framework_base.rb
|
36
36
|
- lib/dango/server_framework.rb
|
37
|
+
- lib/dango/mutex_socket_list.rb
|
38
|
+
- lib/dango/socket_list.rb
|
37
39
|
- lib/dango/monitor/dango_monitor_client.rb
|
38
40
|
- lib/dango/script/dango_server.rb
|
39
41
|
- lib/dango/shared/memory_store.rb
|