dango 0.0.21 → 0.0.22

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 CHANGED
@@ -7,6 +7,7 @@ lib/dango/server_framework.rb
7
7
  lib/dango/mutex_socket_list.rb
8
8
  lib/dango/socket_list.rb
9
9
  lib/dango/monitor/dango_monitor_client.rb
10
+ lib/dango/monitor/server_monitor_action.rb
10
11
  lib/dango/script/dango_server.rb
11
12
  lib/dango/shared/memory_store.rb
12
13
  lib/dango/tasks/dango_rake.rb
@@ -31,7 +31,7 @@ class DangoClientFramework
31
31
  # メイン処理
32
32
  def initialize(env, config = nil)
33
33
  if !config
34
- config = YAML.load(open("dango/config/#{env}.yml", "rb"){|fh| fh.read})
34
+ config = YAML.load(open("#{RAILS_ROOT}/dango/config/#{env}.yml", "rb"){|fh| fh.read})
35
35
  end
36
36
 
37
37
  @config = config
@@ -54,6 +54,7 @@ class DangoFrameworkTimeoutError < DangoFrameworkError; end
54
54
  class DangoFrameworkConnectionError < DangoFrameworkError; end
55
55
  class DangoFrameworkReadNoDataError < DangoFrameworkError; end
56
56
  class DangoFrameworkFlashPolicyError < DangoFrameworkError; end
57
+ class DangoFrameworkMonitorSecurityError < DangoFrameworkError; end
57
58
 
58
59
  # エラー出力用モジュール
59
60
  module ErrorMessage
@@ -119,9 +120,9 @@ module DangoFrameworkModule
119
120
  Dir.mkdir(log_dir) if !File.exist?(log_dir)
120
121
  @cs_logger = Logger.new(@log_file)
121
122
  @cs_logger.level = @log_level
122
- # @cs_logger.datetime_format = "%Y-%m-%dT%H:%M:%S"
123
- @cs_logger.datetime_format = "aaaaa"
124
- @cs_logger.progname = "#{Thread.current.object_id}"
123
+ @cs_logger.datetime_format = "%Y-%m-%dT%H:%M:%S"
124
+ # @cs_logger.datetime_format = "aaaaa"
125
+ @cs_logger.progname = "toid=#{Thread.current.object_id}"
125
126
  end
126
127
  end
127
128
  @cs_logger
@@ -137,16 +138,16 @@ module DangoFrameworkModule
137
138
  # size_str = sock.readpartial(CommMaxDigit + 1)
138
139
  # size_str = sock.sysread(CommMaxDigit + 1)
139
140
  size_str = sock.recv(CommMaxDigit + 1)
140
- rescue EOFError, Errno::ECONNRESET
141
+ rescue EOFError, Errno::ECONNRESET, Errno::ETIMEDOUT
141
142
  # EOFErrorはその接続終了時の切断と思われるのでDangoFrameworkConnectionErrorにしない
142
143
  #raise(DangoFrameworkError, "failed to read sock for EOF reached.\n#{error_message($!, 'u')}")
143
- raise(DangoFrameworkError, "failed to read sock for EOF reached (and so on). #{$!.class} sid=#{Thread.current.object_id}")
144
+ raise(DangoFrameworkError, "failed to read sock for EOF reached (and so on). #{$!.class} toid=#{Thread.current.object_id}")
144
145
  rescue
145
- raise(DangoFrameworkConnectionError, "failed to read sock. sid=#{Thread.current.object_id}\n#{error_message($!, 'u')}")
146
+ raise(DangoFrameworkConnectionError, "failed to read sock. toid=#{Thread.current.object_id}\n#{error_message($!, 'u')}")
146
147
  end
147
148
 
148
149
  if size_str == ""
149
- raise(DangoFrameworkReadNoDataError, "sid=#{Thread.current.object_id}:size_str=#{size_str.inspect}")
150
+ raise(DangoFrameworkReadNoDataError, "toid=#{Thread.current.object_id}:size_str=#{size_str.inspect}")
150
151
  end
151
152
 
152
153
  ## Flash のpolicyファイルだった場合(特殊)
@@ -162,7 +163,7 @@ module DangoFrameworkModule
162
163
 
163
164
  ## データが小さすぎる場合
164
165
  if size == nil || size == 0
165
- raise(DangoFrameworkConnectionError, "sid=#{Thread.current.object_id}:size=#{size}:size_str=#{size_str.inspect}")
166
+ raise(DangoFrameworkConnectionError, "toid=#{Thread.current.object_id}:size=#{size}:size_str=#{size_str.inspect}")
166
167
  end
167
168
 
168
169
  ## データが大きすぎる場合
@@ -209,7 +210,7 @@ module DangoFrameworkModule
209
210
  data = Marshal.load(ret_data)
210
211
  end
211
212
  rescue
212
- raise(DangoFrameworkConnectionError, "data parse error.\nret_data=#{ret_data}")
213
+ raise(DangoFrameworkConnectionError, "data parse error.#{$!.class}\nret_data=#{ret_data}")
213
214
  end
214
215
  end
215
216
 
@@ -17,8 +17,9 @@ class DangoMonitorClient < DangoClientFramework
17
17
  ConnTimeout = 6
18
18
 
19
19
  def initialize()
20
- env = ENV['RAILS_ENV'] || 'development'
21
- super(env)
20
+ @env = ENV['RAILS_ENV'] || 'development'
21
+ config = YAML.load(open("#{RAILS_ROOT}/dango/config/#{@env}.yml", "rb"){|fh| fh.read})
22
+ super(@env, config)
22
23
  end
23
24
 
24
25
  public
@@ -26,7 +27,7 @@ class DangoMonitorClient < DangoClientFramework
26
27
  # 起動処理
27
28
  def cs_client_init
28
29
  # ログ出力情報
29
- @connection_client_log_file = "log/dango_monitor_#{ENV['RAILS_ENV']}.log"
30
+ @connection_client_log_file = "#{RAILS_ROOT}/log/dango_monitor_#{@env}.log"
30
31
  @connection_client_log_level = Logger::DEBUG
31
32
  end
32
33
 
@@ -36,9 +37,9 @@ class DangoMonitorClient < DangoClientFramework
36
37
 
37
38
  # サーバーの全情報取得
38
39
  def get_all_info
39
- cs_logger.debug "DangoMonitorClient:get_all_info"
40
+ cs_logger.debug "DangoMonitorClient:get_all_info:#{ENV['RAILS_ROOT']}"
40
41
  begin
41
- ret_obj = cs_client_send_receive_data('monitor_all_info', {})
42
+ ret_obj = cs_client_send_receive_data('_monitor_all_info', {})
42
43
  rescue DangoFrameworkConnectionError
43
44
  raise("monitor_all_info Connection error")
44
45
  rescue DangoFrameworkTimeoutError
@@ -52,7 +53,7 @@ class DangoMonitorClient < DangoClientFramework
52
53
  def server_reload
53
54
  cs_logger.debug "DangoMonitorClient:server_reload"
54
55
  begin
55
- ret_obj = cs_client_send_receive_data('monitor_server_reload', {})
56
+ ret_obj = cs_client_send_receive_data('_monitor_server_reload', {})
56
57
  rescue DangoFrameworkConnectionError
57
58
  raise("monitor_server_reload Connection error")
58
59
  rescue DangoFrameworkTimeoutError
@@ -66,7 +67,7 @@ class DangoMonitorClient < DangoClientFramework
66
67
  def send_system_message(message = "")
67
68
  cs_logger.debug "DangoMonitorClient:send_system_message"
68
69
  begin
69
- ret_obj = cs_client_send_receive_data('monitor_send_system_message', {:message=>message})
70
+ ret_obj = cs_client_send_receive_data('_monitor_send_system_message', {:message=>message})
70
71
  rescue DangoFrameworkConnectionError
71
72
  raise("monitor_send_system_message Connection error")
72
73
  rescue DangoFrameworkTimeoutError
@@ -0,0 +1,119 @@
1
+ #!ruby -Ku
2
+
3
+ =begin
4
+ = Dangoサーバーのメンテナンス用サーバー側機能
5
+ =end
6
+
7
+ require 'ipaddr'
8
+
9
+ # メインクラス
10
+ class ServerMonitorAction
11
+ def initialize(parent, config, sock, ret_obj)
12
+ @parent = parent
13
+ @config = config
14
+
15
+ @cs_logger = @parent.cs_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
+ cs_check_monitor_error(sock, action_name)
25
+
26
+ if action_name == '_monitor_all_info' # メンテナンスアクション名なら
27
+ cs_server_monitor_all_info(ret_obj)
28
+
29
+ elsif action_name == '_monitor_server_reload' # メンテナンスアクション名なら
30
+ cs_server_monitor_server_reload(ret_obj)
31
+
32
+ elsif action_name == '_monitor_send_system_message' # メンテナンスアクション名なら
33
+ cs_server_monitor_send_system_message(ret_obj)
34
+
35
+ else
36
+ end
37
+ end
38
+
39
+ attr_reader(:cs_logger, :shared, :session, :socket_list, :session_list)
40
+
41
+ private
42
+
43
+ # メンテナンスコマンド:エラーの場合
44
+ def cs_check_monitor_error(sock, action_name)
45
+ peerhost, peeraddr = sock.peeraddr[2, 2]
46
+ backdoor_host = @config['server']['backdoor_host']
47
+ cs_logger.debug "cs_check_monitor_error:peerhost=#{peerhost.inspect} peeraddr=#{peeraddr.inspect} backdoor_host=#{backdoor_host.inspect}"
48
+
49
+ match = false
50
+ if peerhost == backdoor_host # ホスト名で書いてある時の一致確認
51
+ match = true
52
+ else
53
+ begin # IPアドレスの一致確認
54
+ # match = true if IPAddr.new(backdoor_host).include?(peeraddr)
55
+ if IPAddr.new(backdoor_host).include?(IPAddr.new(peeraddr))
56
+ match = true
57
+ end
58
+ rescue
59
+ end
60
+ end
61
+
62
+ if !match
63
+ notice_name = "return_" + action_name
64
+ send_obj = {'code'=>1, 'message'=>"error your ip address"}
65
+ @parent.cs_server_send_data(session[:sid], notice_name, send_obj, :type=>2)
66
+ raise(DangoFrameworkMonitorSecurityError)
67
+ end
68
+ end
69
+
70
+ # メンテナンスコマンド:サーバーからクライアントへのデータ送信
71
+ def cs_server_monitor_all_info(ret_obj)
72
+ cs_logger.debug "cs_server_monitor_all_info:#{ret_obj.inspect}"
73
+ all_info = {
74
+ 'shareds' => shared.to_hash,
75
+ 'socket_list' => socket_list.keys,
76
+ 'session_list' => session_list,
77
+
78
+ 'server_start_time' => @parent.start_time.strftime("%Y-%m-%d %H:%M:%S"),
79
+ 'up_time' => Time.now - @parent.start_time,
80
+
81
+ 'recv_count' => @parent.recv_count, # 受信回数
82
+ 'send_count' => @parent.send_count, # 送信回数
83
+ 'recv_fail_count' => @parent.recv_fail_count, # 受信失敗回数
84
+ 'send_fail_count' => @parent.send_fail_count, # 送信失敗回数
85
+ # 'dummy' => "dummy "*1000, # ダミー情報
86
+ }
87
+
88
+ send_obj = {'code'=>0, 'all_info'=>all_info}
89
+ @parent.cs_server_send_data(session[:sid], 'return__monitor_all_info', send_obj, :type=>2)
90
+ end
91
+
92
+ # メンテナンスコマンド:サーバーデータ再読み込み
93
+ def cs_server_monitor_server_reload(ret_obj)
94
+ cs_logger.debug "cs_server_monitor_server_reload"
95
+ @server_reload = true
96
+ cs_logger.debug "@server_reload=#{@server_reload.inspect}"
97
+ send_obj = {'code'=>0, 'message'=>'success'}
98
+ @parent.cs_server_send_data(session[:sid], 'return__monitor_server_reload', send_obj, :type=>2)
99
+ end
100
+
101
+ # メンテナンスコマンド:接続者全員へメッセージ送信
102
+ def cs_server_monitor_send_system_message(ret_obj)
103
+ cs_logger.debug "cs_server_monitor_send_system_message:#{ret_obj.inspect}"
104
+
105
+ # 全員へ_notice_system_messageを通知
106
+ socket_list.keys.each do |sid|
107
+ next if session[:sid] == sid
108
+ send_obj = { "message" => ret_obj["message"] }
109
+ @parent.cs_server_send_data(sid, '_notice_system_message', send_obj)
110
+ end
111
+
112
+ send_obj = {'code'=>0, }
113
+ @parent.cs_server_send_data(session[:sid], 'return__monitor_send_system_message', send_obj, :type=>2)
114
+ end
115
+
116
+ end
117
+
118
+
119
+
@@ -5,18 +5,18 @@
5
5
  =end
6
6
 
7
7
  require 'gserver'
8
- require 'ipaddr'
9
8
  require 'digest/md5'
10
9
 
11
10
  require "dango/framework_base"
12
11
  require "dango/socket_list"
13
12
  require "dango/mutex_socket_list"
13
+ require "dango/monitor/server_monitor_action"
14
14
 
15
15
  # フレームワーククラス
16
16
  class DangoServerFramework
17
17
  include DangoFrameworkModule
18
18
 
19
- SendReceiveSleepIntervalSec = 0.1 # データ送信後の順の際のタイムアウトチェック間隔秒
19
+ SendReceiveSleepIntervalSec = 0.2 # データ送信後の順の際のタイムアウトチェック間隔秒
20
20
  SendReceiveTimeoutDefaultSec = 2.0 # データ送受信時のデフォルトタイムアウト秒数
21
21
  SendTimeoutSec = 10.0 # データ送受信時の送信のタイムアウト秒数
22
22
  HeratBeatIntervalSec = 60.0 # S=>Cのハートビートの送信タイミング
@@ -82,6 +82,7 @@ class DangoServerFramework
82
82
 
83
83
  open("tmp/pids/dango.pid", "wb"){|fh| fh.write Process.pid.to_s }
84
84
 
85
+ session_init() # セッション情報の初期化
85
86
  shared_init() # 共有メモリを初期化
86
87
  notice_shared_init() # 通知共有メモリを初期化
87
88
  socket_list_init() # ソケット一覧を初期化
@@ -180,14 +181,15 @@ class DangoServerFramework
180
181
  # gserverのserveメソッド:スレッド開始処理
181
182
  def thread_main(sock)
182
183
  cs_logger.debug "thread_main:start"
183
- cs_logger.debug "#{sock} is accepted. key=#{Thread.current.object_id}"
184
+ cs_logger.debug "#{sock} is accepted. thread.current=#{Thread.current.object_id} sock_id=#{sock.object_id}"
184
185
 
185
186
  begin
186
187
  sock.binmode
187
188
  sock.sync = true
188
189
 
189
- session[:sid] = Thread.current.object_id
190
- sid = session[:sid]
190
+ sid = Thread.current.object_id.deep_dup
191
+ # sid = sock.object_id
192
+ session[:sid] = sid
191
193
  socket_list.add(sid, sock)
192
194
  mutex_socket_list.add(sid)
193
195
 
@@ -245,17 +247,8 @@ class DangoServerFramework
245
247
  # cs_logger.debug "action_name=#{action_name} #{Time.now_to_s}"
246
248
  action_name_is_response(ret_obj)
247
249
 
248
- elsif action_name == 'monitor_all_info' # メンテナンスアクション名なら
249
- cs_check_monitor_error(sock, "return_monitor_all_info")
250
- cs_server_monitor_all_info(ret_obj)
251
-
252
- elsif action_name == 'monitor_server_reload' # メンテナンスアクション名なら
253
- cs_check_monitor_error(sock, "return_monitor_server_reload")
254
- cs_server_monitor_server_reload(ret_obj)
255
-
256
- elsif action_name == 'monitor_send_system_message' # メンテナンスアクション名なら
257
- cs_check_monitor_error(sock, "return_monitor_send_system_message")
258
- cs_server_monitor_send_system_message(ret_obj)
250
+ elsif action_name[0, 9] == '_monitor_' # メンテナンスアクション名なら
251
+ ServerMonitorAction.new(self, @config, sock, ret_obj)
259
252
 
260
253
  else # メンテナンスコマンド以外のユーザーアクション名なら
261
254
  cs_logger.debug "action_name=#{action_name} #{sid} #{Time.now_to_s}"
@@ -273,23 +266,26 @@ class DangoServerFramework
273
266
  end # loop
274
267
 
275
268
  rescue DangoFrameworkFlashPolicyError
276
- cs_logger.debug "Flash policy file send. #{Thread.current.object_id} #{Time.now_to_s}"
269
+ cs_logger.debug "Flash policy file send. #{sid} #{Time.now_to_s}"
270
+
271
+ rescue DangoFrameworkMonitorSecurityError
272
+ cs_logger.debug "Monitor Security Error #{sid} #{Time.now_to_s}"
277
273
 
278
274
  rescue DangoFrameworkReadNoDataError
279
- cs_logger.debug "read no data. maybe client closed. #{Thread.current.object_id} #{Time.now_to_s}"
275
+ cs_logger.debug "read no data. maybe client closed. #{sid} #{Time.now_to_s}"
280
276
 
281
277
  rescue DangoFrameworkConnectionError
282
278
  @recv_fail_count += 1 if @recv_fail_count # 受信失敗回数カウント
283
- cs_logger.debug "connection error. #{Thread.current.object_id} #{Time.now_to_s}\n#{error_message($!, 'u')}"
279
+ cs_logger.debug "connection error. #{sid} #{Time.now_to_s}\n#{error_message($!, 'u')}"
284
280
 
285
281
  rescue DangoFrameworkError
286
- cs_logger.debug "DangoFrameworkError. #{Thread.current.object_id} #{Time.now_to_s}\n#{error_message($!, 'u')}"
282
+ cs_logger.debug "DangoFrameworkError. #{sid} #{Time.now_to_s}\n#{error_message($!, 'u')}"
287
283
 
288
284
  rescue Exception
289
- cs_logger.error "Exception #{Thread.current.object_id} #{Time.now_to_s} #{error_message($!, 'u')}"
285
+ cs_logger.error "Exception #{sid} #{Time.now_to_s} #{error_message($!, 'u')}"
290
286
 
291
287
  ensure
292
- cs_logger.debug "#{sock.inspect} #{Thread.current.object_id} is gone"
288
+ cs_logger.debug "#{sock.inspect} sock_id=#{sock.object_id} #{sid} is gone"
293
289
 
294
290
  @mutex_proc_thread.synchronize do
295
291
  begin
@@ -297,13 +293,19 @@ class DangoServerFramework
297
293
  rescue
298
294
  cs_logger.error "#{error_message($!, 'u')}"
299
295
  ensure
300
- socket_list.delete(Thread.current.object_id) # ソケットリストから削除
301
- sock.close # ソケットを閉じる
296
+ socket_list.delete(sid) # ソケットリストから削除
297
+ begin
298
+ sock.close if !sock.closed? # ソケットを閉じる
299
+ rescue IOError
300
+ cs_logger.debug "IOError #{sock} #{sid}"
301
+ end
302
302
 
303
- cs_logger.debug "#{sock.inspect} #{Thread.current.object_id} is gone 2"
303
+ cs_logger.debug "#{sock.inspect} sock_id=#{sock.object_id} #{sid} is gone 2"
304
304
  end
305
+
305
306
  end
306
307
 
308
+ session_del()
307
309
  end
308
310
  end
309
311
 
@@ -347,6 +349,8 @@ class DangoServerFramework
347
349
  @send_fail_count = 0 # 送信失敗回数
348
350
  end
349
351
 
352
+ attr_reader(:start_time, :recv_count, :send_count, :recv_fail_count, :send_fail_count)
353
+
350
354
  def cs_server_init # 初期設定
351
355
  end
352
356
 
@@ -451,12 +455,24 @@ class DangoServerFramework
451
455
  attr_accessor(:notice_shared)
452
456
 
453
457
  # セッション
454
- class Session < Hash
458
+ def session_init # セッション情報の初期化
459
+ @session_list = {}
455
460
  end
456
461
  def session
457
- Thread.current[:session] = Session.new if !Thread.current[:session]
462
+ if !Thread.current[:session]
463
+ Thread.current[:session] = {}
464
+ @session_list[Thread.current.object_id] = Thread.current[:session]
465
+ end
458
466
  Thread.current[:session]
467
+ # sid = Thread.current.object_id
468
+ # @session[sid] = Session.new if !@session[sid]
469
+ # @session[sid]
459
470
  end
471
+ def session_del # セッション情報の初期化
472
+ @session_list.delete(Thread.current.object_id)
473
+ end
474
+
475
+ attr_reader(:session_list)
460
476
 
461
477
  # ソケットとIDの対応
462
478
  def socket_list_init
@@ -512,7 +528,7 @@ class DangoServerFramework
512
528
  end
513
529
 
514
530
  rescue
515
- cs_logger.error "Exception #{Thread.current.object_id} #{Time.now_to_s} #{error_message($!, 'u')}"
531
+ cs_logger.error "Exception heart_beat_thread_start #{Time.now_to_s} #{error_message($!, 'u')}"
516
532
  end
517
533
  end
518
534
  end
@@ -612,71 +628,6 @@ class DangoServerFramework
612
628
  self
613
629
  end
614
630
 
615
- # メンテナンスコマンド:エラーの場合
616
- def cs_check_monitor_error(sock, return_command)
617
- peerhost, peeraddr = sock.peeraddr[2, 2]
618
- backdoor_host = @config['server']['backdoor_host']
619
- match = false
620
- if peerhost == backdoor_host # ホスト名で書いてある時の一致確認
621
- match = true
622
- else
623
- begin # IPアドレスの一致確認
624
- match = true if IPAddr.new(peeraddr) == IPAddr.new(backdoor_host)
625
- rescue
626
- end
627
- end
628
-
629
- if !match
630
- send_obj = {'code'=>1, 'message'=>"error your ip address"}
631
- cs_server_send_data(session[:sid], return_command, send_obj, :type=>2)
632
- raise(DangoFrameworkError)
633
- end
634
- end
635
-
636
- # メンテナンスコマンド:サーバーからクライアントへのデータ送信
637
- def cs_server_monitor_all_info(ret_obj)
638
- all_info = {
639
- 'shareds' => shared.to_hash,
640
- 'socket_list' => socket_list.keys,
641
-
642
- 'server_start_time' => @start_time.strftime("%Y-%m-%d %H:%M:%S"),
643
- 'up_time' => Time.now - @start_time,
644
-
645
- 'recv_count' => @recv_count, # 受信回数
646
- 'send_count' => @send_count, # 送信回数
647
- 'recv_fail_count' => @recv_fail_count, # 受信失敗回数
648
- 'send_fail_count' => @send_fail_count, # 送信失敗回数
649
- # 'dummy' => "dummy "*1000, # ダミー情報
650
- }
651
-
652
- send_obj = {'code'=>0, 'all_info'=>all_info}
653
- cs_server_send_data(session[:sid], 'return_monitor_all_info', send_obj, :type=>2)
654
- end
655
-
656
- # メンテナンスコマンド:サーバーデータ再読み込み
657
- def cs_server_monitor_server_reload(ret_obj)
658
- cs_logger.debug "cs_server_monitor_server_reload"
659
- @server_reload = true
660
- cs_logger.debug "@server_reload=#{@server_reload.inspect}"
661
- send_obj = {'code'=>0, 'message'=>'success'}
662
- cs_server_send_data(session[:sid], 'return_monitor_server_reload', send_obj, :type=>2)
663
- end
664
-
665
- # メンテナンスコマンド:接続者全員へメッセージ送信
666
- def cs_server_monitor_send_system_message(ret_obj)
667
- cs_logger.debug "cs_server_monitor_send_system_message:#{ret_obj.inspect}"
668
-
669
- # 全員へ_notice_system_messageを通知
670
- socket_list.keys.each do |sid|
671
- next if session[:sid] == sid
672
- send_obj = { "message" => ret_obj["message"] }
673
- cs_server_send_data(sid, '_notice_system_message', send_obj)
674
- end
675
-
676
- send_obj = {'code'=>0, }
677
- cs_server_send_data(session[:sid], 'return_monitor_send_system_message', send_obj, :type=>2)
678
- end
679
-
680
631
  # 必要に応じて追加するメソッド
681
632
  def method_missing(name, *args)
682
633
  if name.to_s =~ /^cs_receive_action_notice_shared_(.+)/ # 共有メモリ変更通知なら
@@ -21,23 +21,23 @@ class SocketList
21
21
 
22
22
  def add(key, sock)
23
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)
24
+ raise("already exist key(#{key.inspect})") if @sl_hash.has_key?(key)
25
+ raise("sock(#{sock.inspect}) is not Socket") if sock.kind_of?(Socket)
26
26
  @sl_hash[key] = sock
27
27
  end
28
28
  end
29
29
 
30
30
  def [](key)
31
31
  @sl_mutex.synchronize do
32
- raise("not exist key(#{key})") if ! @sl_hash.has_key?(key)
32
+ raise("not exist key(#{key.inspect})") if ! @sl_hash.has_key?(key)
33
33
  @sl_hash[key]
34
34
  end
35
35
  end
36
36
 
37
37
  def []=(key, sock)
38
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)
39
+ raise("not exist key(#{key.inspect})") if ! @sl_hash.has_key?(key)
40
+ raise("sock(#{sock.inspect}) is not Socket") if sock.kind_of?(Socket)
41
41
  @sl_hash[key] = sock
42
42
  end
43
43
  end
@@ -9,6 +9,9 @@ require 'thread'
9
9
 
10
10
  # テスタークラス
11
11
  class DangoTesterClient
12
+ ConnectionRetryTimes = 10 # 接続リトライ回数
13
+ ConnectionRetryIntervalSec = 3 # 接続リトライ時の間隔病数
14
+
12
15
  # テスターのイニシャライズ
13
16
  def initialize
14
17
  @client_conns = {}
@@ -26,7 +29,19 @@ class DangoTesterClient
26
29
  env = "development"
27
30
 
28
31
  # 接続
29
- client_conn = TestClient.new(env, config, c_name)
32
+ client_conn = nil
33
+ ConnectionRetryTimes.times do |i|
34
+ begin
35
+ client_conn = TestClient.new(env, config, c_name)
36
+ break
37
+ rescue
38
+ client_conn = nil
39
+ raise("connection error for retry times over.") if i == ConnectionRetryTimes - 1
40
+ puts "connection failed. sleep #{ConnectionRetryIntervalSec}"
41
+ sleep ConnectionRetryIntervalSec
42
+ end
43
+ end
44
+ raise("connection error.") if ! client_conn
30
45
 
31
46
  # client_nameメソッド作成とclient_nameを定義
32
47
  client_conn.client_name = c_name
data/lib/dango/version.rb CHANGED
@@ -2,7 +2,7 @@ module Dango #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 21
5
+ TINY = 22
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
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.21
7
- date: 2007-10-26 00:00:00 +09:00
6
+ version: 0.0.22
7
+ date: 2007-10-29 00:00:00 +09:00
8
8
  summary: Realtime communications network framework for Ruby and Flash on Rails.
9
9
  require_paths:
10
10
  - lib
@@ -38,6 +38,7 @@ files:
38
38
  - lib/dango/mutex_socket_list.rb
39
39
  - lib/dango/socket_list.rb
40
40
  - lib/dango/monitor/dango_monitor_client.rb
41
+ - lib/dango/monitor/server_monitor_action.rb
41
42
  - lib/dango/script/dango_server.rb
42
43
  - lib/dango/shared/memory_store.rb
43
44
  - lib/dango/tasks/dango_rake.rb