dango 0.0.30 → 0.0.31

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.
@@ -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