dango 0.0.30 → 0.0.31

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 = 2.0 # データ送受信時のデフォルトタイムアウト秒数
27
- SendTimeoutSec = 10.0 # データ送受信時の送信のタイムアウト秒数
28
- HeartBeatIntervalSec = 60.0 # S=>Cのheart beatの送信間隔秒数
29
- HeartBeatResponseWaitSec = 20.0 # S=>Cのheart beatの返信待ち秒数
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
- # logger.warn "action_name_is_response:#{ret_obj['_id']} #{session[:sid]} #{Time.now_to_s}"
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
- Thread.start do
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
- # sock = socket_list[sid]
584
+ sock = socket_list[sid]
557
585
  # logger.debug "heart_beat_thread_start:sid=#{sid} #{sock} #{sock.closed?}"
558
- # dango_send_data(sock, {})
559
- # logger.debug "heart_beat_thread_start:sid=#{sid}"
560
- send_notice(sid, "_heart_beat", {}, {:timeout=>@heart_beat_response_wait_sec})
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
- # GCスレッドの開始
572
- def gc_thread_start
573
- Thread.start do
574
- loop do
575
- begin
576
- sleep @gc_interval_sec
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
- if Time.now > end_reserved_time
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
- sleep @send_receive_sleep_interval_sec # スリープ
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
@@ -2,7 +2,7 @@ module Dango #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 30
5
+ TINY = 31
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.30
7
- date: 2007-11-09 00:00:00 +09:00
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