dango 0.0.30 → 0.0.31
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/dango/client_framework.rb +25 -1
- data/lib/dango/server_framework.rb +65 -40
- data/lib/dango/version.rb +1 -1
- metadata +2 -2
@@ -80,9 +80,12 @@ class DangoClientFramework
|
|
80
80
|
|
81
81
|
@sock.binmode
|
82
82
|
@sock.sync = true
|
83
|
-
@tmutex = Mutex.new # sockの排他処理用
|
84
83
|
logger.debug("addr:#{@sock.addr.inspect}")
|
85
84
|
|
85
|
+
@tmutex = Mutex.new # sockの排他処理用
|
86
|
+
|
87
|
+
dango_heart_beat_thread_init() # ハートビート送信スレッドの起動
|
88
|
+
|
86
89
|
@sid = nil # 接続して決まるsidを保持
|
87
90
|
|
88
91
|
# データ受信用のスレッドの開始
|
@@ -143,6 +146,27 @@ class DangoClientFramework
|
|
143
146
|
end
|
144
147
|
private :thread_main
|
145
148
|
|
149
|
+
# ハートビート送信スレッドの起動
|
150
|
+
def dango_heart_beat_thread_init
|
151
|
+
th = Thread.start do
|
152
|
+
loop do
|
153
|
+
begin
|
154
|
+
sleep 10
|
155
|
+
|
156
|
+
if @sock && ! @sock.closed?
|
157
|
+
logger.debug "dango_heart_beat_thread_init:send heart beat #{Time.now_to_s}"
|
158
|
+
|
159
|
+
send_action("_notice_heart_beat", {})
|
160
|
+
end
|
161
|
+
|
162
|
+
rescue
|
163
|
+
logger.error "Exception dango_heart_beat_thread_init #{Time.now_to_s} #{error_message($!, 'u')}"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
th.priority = 1
|
168
|
+
end
|
169
|
+
|
146
170
|
# 接続直後のsid通知なら
|
147
171
|
def dango_receive__notice_sid(rec_obj)
|
148
172
|
@sid = rec_obj["_sid"]
|
@@ -23,10 +23,11 @@ class DangoServerFramework
|
|
23
23
|
|
24
24
|
# ここから先は普通は変更しなくていいだろうというもの
|
25
25
|
SendReceiveSleepIntervalSec = 0.2 # データ送信時のタイムアウトチェック間隔秒
|
26
|
-
SendReceiveTimeoutDefaultSec =
|
27
|
-
SendTimeoutSec =
|
28
|
-
HeartBeatIntervalSec =
|
29
|
-
HeartBeatResponseWaitSec =
|
26
|
+
SendReceiveTimeoutDefaultSec = 5.0 # データ送受信時のデフォルトタイムアウト秒数
|
27
|
+
SendTimeoutSec = 4.0 # データ送受信時の送信のタイムアウト秒数
|
28
|
+
HeartBeatIntervalSec = 10.0 # S=>Cのheart beatの送信間隔秒数
|
29
|
+
HeartBeatResponseWaitSec = 10.0 # S=>Cのheart beatの返信待ち秒数
|
30
|
+
HeartBeatReceiveWaitSec = 20.0 # C=>Sのheart beatの受信待ち秒数
|
30
31
|
GCIntervalSec = 5.0 # GCの発生タイミング
|
31
32
|
|
32
33
|
|
@@ -267,7 +268,7 @@ class DangoServerFramework
|
|
267
268
|
@mutex_proc_thread.synchronize do
|
268
269
|
|
269
270
|
if action_name == '_response' # 送信パケットの返事なら
|
270
|
-
# logger.debug "action_name=#{action_name} #{Time.now_to_s}"
|
271
|
+
# logger.debug "action_name=#{action_name} #{ret_obj['_id']} #{Time.now_to_s}"
|
271
272
|
action_name_is_response(ret_obj)
|
272
273
|
|
273
274
|
elsif action_name[0, 9] == '_monitor_' # メンテナンスアクション名なら
|
@@ -334,7 +335,7 @@ class DangoServerFramework
|
|
334
335
|
|
335
336
|
# action_nameが送信パケットの返事なら
|
336
337
|
def action_name_is_response(ret_obj)
|
337
|
-
|
338
|
+
logger.debug "action_name_is_response: #{ret_obj['_id']} #{session[:sid]} #{Time.now_to_s}"
|
338
339
|
@mutex_send_response.synchronize do
|
339
340
|
@arr_send_response.push({:_id => ret_obj["_id"], :time => Time.now})
|
340
341
|
end
|
@@ -357,6 +358,7 @@ class DangoServerFramework
|
|
357
358
|
@send_timeout_sec = @config['server']['send_timeout_sec'] || SendTimeoutSec
|
358
359
|
@herat_beat_interval_sec = @config['server']['heart_beat_interval_sec'] || HeartBeatIntervalSec
|
359
360
|
@heart_beat_response_wait_sec = @config['server']['heart_beat_response_wait_sec'] || HeartBeatResponseWaitSec
|
361
|
+
@heart_beat_receive_wait_sec = @config['server']['heart_beat_receive_wait_sec'] || HeartBeatReceiveWaitSec
|
360
362
|
@gc_interval_sec = @config['server']['gc_interval_sec'] || GCIntervalSec
|
361
363
|
|
362
364
|
|
@@ -541,9 +543,32 @@ class DangoServerFramework
|
|
541
543
|
dango_server_receive_decrypt(str)
|
542
544
|
end
|
543
545
|
|
546
|
+
# GCスレッドの開始
|
547
|
+
def gc_thread_start
|
548
|
+
th = Thread.start do
|
549
|
+
loop do
|
550
|
+
begin
|
551
|
+
sleep @gc_interval_sec
|
552
|
+
|
553
|
+
gc_start_time = Time.now
|
554
|
+
GC.enable
|
555
|
+
GC.start
|
556
|
+
GC.disable
|
557
|
+
logger.debug "GC #{Time.now - gc_start_time}sec #{Time.now_to_s}"
|
558
|
+
|
559
|
+
rescue
|
560
|
+
logger.error "Exception gc_thread_start #{Time.now_to_s} #{error_message($!, 'u')}"
|
561
|
+
end
|
562
|
+
end
|
563
|
+
end
|
564
|
+
th.priority = -1
|
565
|
+
end
|
566
|
+
|
544
567
|
# ハートビートスレッドの開始
|
545
568
|
def heart_beat_thread_start
|
546
|
-
|
569
|
+
shared[:heart_beat_time_hash] = {}
|
570
|
+
|
571
|
+
th = Thread.start do
|
547
572
|
loop do
|
548
573
|
begin
|
549
574
|
sleep @herat_beat_interval_sec
|
@@ -551,13 +576,20 @@ class DangoServerFramework
|
|
551
576
|
if ! @gserver.stopped? # gserverが起動していれば
|
552
577
|
logger.debug "heart_beat_thread_start #{Time.now_to_s}"
|
553
578
|
|
579
|
+
# クライアントから来るハートビートのチェック
|
580
|
+
heart_beat_time_hash = shared[:heart_beat_time_hash]
|
581
|
+
|
554
582
|
# 全員へheart_beatパケットを送信
|
555
583
|
socket_list.keys.each do |sid|
|
556
|
-
|
584
|
+
sock = socket_list[sid]
|
557
585
|
# logger.debug "heart_beat_thread_start:sid=#{sid} #{sock} #{sock.closed?}"
|
558
|
-
#
|
559
|
-
|
560
|
-
|
586
|
+
# send_notice(sid, "_heart_beat", {}, {:timeout=>@heart_beat_response_wait_sec})
|
587
|
+
|
588
|
+
# クライアントから来たハートビートの時間チェック
|
589
|
+
if heart_beat_time_hash[sid] && heart_beat_time_hash[sid] < Time.now - @heart_beat_receive_wait_sec
|
590
|
+
logger.debug "heart_beat_thread_start:heart beat old #{heart_beat_time_hash[sid]} #{sock} #{sock.closed?}"
|
591
|
+
sock.close if !sock.closed?
|
592
|
+
end
|
561
593
|
end
|
562
594
|
end
|
563
595
|
|
@@ -566,25 +598,16 @@ class DangoServerFramework
|
|
566
598
|
end
|
567
599
|
end
|
568
600
|
end
|
601
|
+
th.priority = 1
|
569
602
|
end
|
570
603
|
|
571
|
-
#
|
572
|
-
def
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
gc_start_time = Time.now
|
579
|
-
GC.enable
|
580
|
-
GC.start
|
581
|
-
GC.disable
|
582
|
-
logger.debug "GC #{Time.now - gc_start_time}sec #{Time.now_to_s}"
|
583
|
-
|
584
|
-
rescue
|
585
|
-
logger.error "Exception gc_thread_start #{Time.now_to_s} #{error_message($!, 'u')}"
|
586
|
-
end
|
587
|
-
end
|
604
|
+
# クライアントから来たheart_beatなら
|
605
|
+
def dango_receive__notice_heart_beat(ret_obj)
|
606
|
+
logger.debug "dango_receive__notice_heart_beat:#{session[:sid]} #{Time.now_to_s}"
|
607
|
+
|
608
|
+
shared.transaction(:heart_beat_time_hash) do |heart_beat_time_hash|
|
609
|
+
heart_beat_time_hash[session[:sid]] = Time.now
|
610
|
+
heart_beat_time_hash
|
588
611
|
end
|
589
612
|
end
|
590
613
|
|
@@ -600,7 +623,7 @@ class DangoServerFramework
|
|
600
623
|
|
601
624
|
sock = socket_list[sid]
|
602
625
|
if !sock || sock.closed? # sockがないという事はすでに切断済み
|
603
|
-
logger.info "send_notice:already closed socket. sid=#{sid.inspect} sock=#{sock.inspect} #{Time.now_to_s}"
|
626
|
+
logger.info "send_notice:already closed socket. sid=#{sid.inspect} sock=#{sock.inspect} #{sock ? sock.closed? : nil} #{Time.now_to_s}"
|
604
627
|
return(self)
|
605
628
|
end
|
606
629
|
|
@@ -652,15 +675,7 @@ class DangoServerFramework
|
|
652
675
|
# タイムアウトチェック
|
653
676
|
catch(:send_timeout) do
|
654
677
|
(timeout.to_f / @send_receive_sleep_interval_sec).to_i.times do
|
655
|
-
|
656
|
-
logger.debug "send_notice:receive timeout:#{notice_name}"
|
657
|
-
|
658
|
-
if notice_name.to_s == "_heart_beat" # heart beatだったらsockを止める
|
659
|
-
logger.info "!!!! send_notice:heart_beat timeout"
|
660
|
-
sock.close if !sock.closed?
|
661
|
-
end
|
662
|
-
break
|
663
|
-
end
|
678
|
+
sleep @send_receive_sleep_interval_sec # スリープ
|
664
679
|
|
665
680
|
@mutex_send_response.synchronize do # データ送信の返信が来たかどうかの確認
|
666
681
|
find_res = @arr_send_response.find{|r| r[:_id] == send_obj_dup["_id"]}
|
@@ -674,7 +689,16 @@ class DangoServerFramework
|
|
674
689
|
end
|
675
690
|
end
|
676
691
|
|
677
|
-
|
692
|
+
if Time.now > end_reserved_time
|
693
|
+
logger.debug "send_notice:receive timeout:#{notice_name} #{sid} #{Time.now_to_s} #{end_reserved_time}"
|
694
|
+
|
695
|
+
if notice_name.to_s == "_heart_beat" # heart beatだったらsockを止める
|
696
|
+
logger.info "!!!! send_notice:heart_beat timeout"
|
697
|
+
sock.close if !sock.closed?
|
698
|
+
end
|
699
|
+
break
|
700
|
+
end
|
701
|
+
|
678
702
|
end # タイムアウト処理終わり
|
679
703
|
end # catch 終わり
|
680
704
|
|
@@ -721,7 +745,7 @@ class DangoServerFramework
|
|
721
745
|
wait_sec = 1.0 / options[:rate]
|
722
746
|
logger.debug "flameloop_thread wait_sec:#{wait_sec.inspect}"
|
723
747
|
|
724
|
-
Thread.new do
|
748
|
+
th = Thread.new do
|
725
749
|
loop do
|
726
750
|
@mutex_proc_thread.synchronize do
|
727
751
|
begin
|
@@ -733,6 +757,7 @@ class DangoServerFramework
|
|
733
757
|
sleep wait_sec
|
734
758
|
end
|
735
759
|
end
|
760
|
+
th.priority = 1
|
736
761
|
|
737
762
|
end
|
738
763
|
|
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-11-
|
6
|
+
version: 0.0.31
|
7
|
+
date: 2007-11-10 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
|