dango 0.5.1 → 0.5.2

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.
@@ -193,7 +193,8 @@ class GServer
193
193
  raise "running" if !stopped?
194
194
  @shutdown = false
195
195
  @maxConnections = maxConnections if maxConnections > 0
196
- @@servicesMutex.synchronize {
196
+ # @@servicesMutex.synchronize {
197
+ @@servicesMutex.timeout_sync(10, :tcp_server_start) {
197
198
  if GServer.in_service?(@port,@host)
198
199
  raise "Port already in use: #{host}:#{@port}!"
199
200
  end
@@ -21,6 +21,8 @@ class DangoMutex < Mutex
21
21
  def timeout_sync(sec = 10, lock_name = "")
22
22
  ret = nil
23
23
  begin
24
+ before_time = Time.now
25
+
24
26
  timeout(sec, DangoFrameworkMutexTimeoutException) do
25
27
  self.synchronize do
26
28
  @lock_name = lock_name
@@ -47,6 +49,7 @@ class DangoMutex < Mutex
47
49
  error_msg += "DangoFrameworkMutexTimeoutException " +
48
50
  "self=#{self.mutex_name}(#{lock_name})\n" +
49
51
  "locked_mutex=#{locked_msg}\n" +
52
+ "before_time=#{before_time.to_ss}\n" +
50
53
  "#{$!.message}\n" +
51
54
  "#{$!.backtrace.pretty_inspect}"
52
55
 
@@ -17,8 +17,13 @@ module ErrorMessage
17
17
  end
18
18
 
19
19
  str = "class=#{exception_class.class}\n" +
20
- "message=#{exception_class.message}\n" +
21
- "backtrace=#{exception_class.backtrace.pretty_inspect}"
20
+ "message=#{exception_class.message}\n"
21
+ begin
22
+ str += "backtrace=#{exception_class.backtrace.pretty_inspect}"
23
+ rescue Exception
24
+ str += "backtrace=#{exception_class.backtrace.inspect}"
25
+ end
26
+
22
27
  if code.to_s.downcase == "u" || code.to_s.downcase == "utf8"
23
28
  str = str.toutf8
24
29
  elsif code.to_s.downcase == "s" || code.to_s.downcase == "sjis"
@@ -15,14 +15,14 @@ module ServerMonitorModule
15
15
  'server_up_time' => Time.now - @start_time,
16
16
  'server_version' => "#{Dango::VERSION::STRING} p#{Dango::VERSION::PATCH}(r#{RAILS_GEM_VERSION})",
17
17
 
18
- 'recv_count' => @recv_count, # 受信回数
19
- 'send_count' => @send_count, # 送信回数
20
- 'recv_fail_count' => @recv_fail_count, # 受信失敗回数
21
- 'send_fail_count' => @send_fail_count, # 送信失敗回数
22
- 'recv_byte' => @recv_byte, # 受信バイト数
23
- 'send_byte' => @send_byte, # 送信バイト数
18
+ 'recv_count' => @recv_count.to_i, # 受信回数
19
+ 'send_count' => @send_count.to_i, # 送信回数
20
+ 'recv_fail_count' => @recv_fail_count.to_i, # 受信失敗回数
21
+ 'send_fail_count' => @send_fail_count.to_i, # 送信失敗回数
22
+ 'recv_byte' => @recv_byte.to_i, # 受信バイト数
23
+ 'send_byte' => @send_byte.to_i, # 送信バイト数
24
24
 
25
- 'mutex_fail_count' => @mutex_fail_count, # 送信失敗回数
25
+ 'mutex_fail_count' => @mutex_fail_count.to_i, # 送信失敗回数
26
26
 
27
27
  # 'log_level' => log_level_str,
28
28
  # 'log_file' => log_file,
@@ -96,14 +96,22 @@ class DangoServerFramework
96
96
 
97
97
  # SIGINT の捕捉
98
98
  Signal.trap(:INT) do
99
- logger.warn "SIGINT\n#{caller(0).pretty_inspect}"
99
+ begin
100
+ logger.warn "SIGINT\n#{caller(0).pretty_inspect}"
101
+ rescue Exception
102
+ logger.warn "SIGINT\n#{caller(0).inspect}"
103
+ end
100
104
  stop_gserver() # gserverの停止
101
105
  exit_process() # プロセス終了処理
102
106
  end
103
107
 
104
108
  # 終了処理を登録しておく(これが無いとWindowsではエラーが出てもプロセスが落ちないことがある)
105
109
  at_exit do
106
- logger.info "at_exit ERROR\n#{caller(0).pretty_inspect}"
110
+ begin
111
+ logger.info "at_exit ERROR\n#{caller(0).pretty_inspect}"
112
+ rescue Exception
113
+ logger.info "at_exit ERROR\n#{caller(0).inspect}"
114
+ end
107
115
  stop_gserver() # gserverの停止
108
116
  exit_process() # プロセス終了処理
109
117
  end
@@ -428,9 +436,11 @@ class DangoServerFramework
428
436
 
429
437
  end # @mutex_proc_thread
430
438
  rescue DangoFrameworkMutexTimeoutException
431
- @mutex_fail_count += 1
439
+ @mutex_fail_count += 1 if @mutex_fail_count
432
440
  @action_stat[action_name][:fail_count] += 1
433
441
  logger.warn "receive_action DangoFrameworkMutexTimeoutException. #{sid} \n#{error_message($!, 'u')}"
442
+ sleep 1
443
+ logger.warn "receive_action DangoFrameworkMutexTimeoutException. #{sid} end sleep"
434
444
  raise(DangoFrameworkDisconnectException)
435
445
  rescue Exception
436
446
  logger.error "receive_action Exception #{sid} #{error_message($!, 'u')}"
@@ -458,11 +468,13 @@ class DangoServerFramework
458
468
 
459
469
  end # mutex_proc_thread
460
470
  rescue DangoFrameworkMutexTimeoutException
461
- @mutex_fail_count += 1
462
- logger.warn "receive_action DangoFrameworkMutexTimeoutException. #{sid} \n#{error_message($!, 'u')}"
471
+ @mutex_fail_count += 1 if @mutex_fail_count
472
+ logger.warn "dango_connect DangoFrameworkMutexTimeoutException. #{sid} \n#{error_message($!, 'u')}"
473
+ sleep 1
474
+ logger.warn "dango_connect DangoFrameworkMutexTimeoutException. #{sid} end sleep"
463
475
  raise(DangoFrameworkDisconnectException)
464
476
  rescue Exception
465
- logger.error "receive_action Exception #{sid} #{error_message($!, 'u')}"
477
+ logger.error "dango_connect Exception #{sid} #{error_message($!, 'u')}"
466
478
  raise(DangoFrameworkDisconnectException)
467
479
  end
468
480
  end
@@ -496,8 +508,10 @@ class DangoServerFramework
496
508
  logger.debug "#{$!.class}. #{sid} maybe dissconnect exception \n#{error_message($!, 'u')}"
497
509
 
498
510
  rescue DangoFrameworkMutexTimeoutException
499
- @mutex_fail_count += 1
511
+ @mutex_fail_count += 1 if @mutex_fail_count
500
512
  logger.warn "DangoFrameworkMutexTimeoutException. #{sid} \n#{error_message($!, 'u')}"
513
+ sleep 1
514
+ logger.warn "DangoFrameworkMutexTimeoutException. #{sid} end sleep"
501
515
 
502
516
  rescue DangoFrameworkException
503
517
  logger.debug "DangoFrameworkException. #{sid} \n#{error_message($!, 'u')}"
@@ -532,9 +546,9 @@ class DangoServerFramework
532
546
 
533
547
  rescue DangoFrameworkMutexTimeoutException
534
548
  need_retry = true
535
- @mutex_fail_count += 1
536
- logger.warn "dango_close DangoFrameworkMutexTimeoutException " +
537
- "#{sock.object_id} #{sid} \n#{error_message($!, 'u')}"
549
+ @mutex_fail_count += 1 if @mutex_fail_count
550
+ logger.warn "dango_close DangoFrameworkMutexTimeoutException1#{sid} \n " +
551
+ "#{error_message($!, 'u')}"
538
552
  end
539
553
 
540
554
  if need_retry # リトライが必要と判断されれば
@@ -544,8 +558,17 @@ class DangoServerFramework
544
558
  break
545
559
  end
546
560
  end # times
561
+
547
562
  rescue Exception
548
- logger.error "dango_close #{sock.object_id} #{sid} ERROR\n#{error_message($!, 'u')}"
563
+ if $!.class == DangoFrameworkMutexTimeoutException
564
+ @mutex_fail_count += 1 if @mutex_fail_count
565
+ logger.warn "dango_close DangoFrameworkMutexTimeoutException2 #{sid} \n" +
566
+ "#{error_message($!, 'u')}"
567
+ sleep 1
568
+ logger.warn "dango_close DangoFrameworkMutexTimeoutException. #{sid} end sleep"
569
+ else
570
+ logger.error "dango_close #{sock.object_id} #{sid} ERROR\n#{error_message($!, 'u')}"
571
+ end
549
572
  end
550
573
  end
551
574
  end
@@ -557,11 +580,13 @@ class DangoServerFramework
557
580
  rescue IOError
558
581
  logger.info "IOError #{sock.object_id} #{sid}"
559
582
  rescue DangoFrameworkMutexTimeoutException
560
- @mutex_fail_count += 1
561
- logger.warn "DangoFrameworkMutexTimeoutException #{sock.object_id} #{sid}\n" +
583
+ @mutex_fail_count += 1 if @mutex_fail_count
584
+ logger.warn "sock.close DangoFrameworkMutexTimeoutException #{sid} #{sock.object_id}\n" +
562
585
  "#{error_message($!, 'u')}"
586
+ sleep 1
587
+ logger.warn "sock.close DangoFrameworkMutexTimeoutException. #{sid} end sleep"
563
588
  rescue Exception
564
- logger.error "#{sock.object_id} #{sid} Exception\n#{error_message($!, 'u')}"
589
+ logger.error "sock.close Exception #{sid} #{sock.object_id}\n#{error_message($!, 'u')}"
565
590
  end
566
591
 
567
592
  logger.info "#{sock.object_id} #{sid} is closed"
@@ -574,9 +599,11 @@ class DangoServerFramework
574
599
  sock = nil # ソケット削除
575
600
  end
576
601
  rescue DangoFrameworkMutexTimeoutException
577
- @mutex_fail_count += 1
578
- logger.warn "DangoFrameworkMutexTimeoutException #{sock.object_id} #{sid}\n" +
602
+ @mutex_fail_count += 1 if @mutex_fail_count
603
+ logger.warn "sock = nil DangoFrameworkMutexTimeoutException #{sid} #{sock.object_id}\n" +
579
604
  "#{error_message($!, 'u')}"
605
+ sleep 1
606
+ logger.warn "sock = nil DangoFrameworkMutexTimeoutException. #{sid} end sleep"
580
607
  end
581
608
 
582
609
  @mutex_sock.delete(sock_object_id) # ソケット排他処理から削除
@@ -584,7 +611,8 @@ class DangoServerFramework
584
611
  @session_manager.close_session(sid) # sessionの終了処理
585
612
 
586
613
  rescue Exception
587
- logger.error "close process failed:#{sock.object_id} #{sid} Exception\n#{error_message($!, 'u')}"
614
+ logger.error "close process failed:Exception #{sid} #{sock.object_id} \n" +
615
+ "#{error_message($!, 'u')}"
588
616
  end
589
617
 
590
618
  end
@@ -786,7 +814,7 @@ EOF
786
814
  output_memory_statistics() if @statistics_process_memory # メモリ使用量統計
787
815
 
788
816
  rescue DangoFrameworkMutexTimeoutException
789
- @mutex_fail_count += 1
817
+ @mutex_fail_count += 1 if @mutex_fail_count
790
818
  logger.warn "DangoFrameworkMutexTimeoutException gc_thread_start" +
791
819
  "#{error_message($!, 'u')}"
792
820
  rescue Exception
@@ -830,7 +858,11 @@ EOF
830
858
  begin
831
859
  sleep @herat_beat_interval_sec
832
860
 
833
- next if @gserver.stopped? # gserverが起動していればスキップ
861
+ # gserverが初期化されていなければスキップ
862
+ # gserverが起動していればスキップ
863
+ next if ! @gserver
864
+ next if ! @gserver.respond_to?(:stopped?)
865
+ next if @gserver.stopped?
834
866
 
835
867
  # logger.debug "mpth:1:heart_beat_thread_start "
836
868
  # @mutex_proc_thread.timeout_sync(3, :heart_beat_thread) do
@@ -889,7 +921,7 @@ EOF
889
921
  logger.debug "heart_beat_thread_start end"
890
922
 
891
923
  rescue DangoFrameworkMutexTimeoutException
892
- @mutex_fail_count += 1
924
+ @mutex_fail_count += 1 if @mutex_fail_count
893
925
  logger.warn "DangoFrameworkMutexTimeoutException heart_beat_thread_start" +
894
926
  "#{error_message($!, 'u')}"
895
927
  rescue Exception
@@ -938,7 +970,7 @@ EOF
938
970
  @queue_send_notice.push([sid, send_obj_dup, encode_type].deep_dup)
939
971
  end
940
972
  rescue DangoFrameworkMutexTimeoutException
941
- @mutex_fail_count += 1
973
+ @mutex_fail_count += 1 if @mutex_fail_count
942
974
  logger.warn "mutex_send_notice #{error_message($!, 'u')}"
943
975
  rescue Exception
944
976
  logger.error "mutex_send_notice #{error_message($!, 'u')}"
@@ -1006,7 +1038,7 @@ EOF
1006
1038
  logger.info "thread_send_notice_queue:failed send. sid=#{sid} " +
1007
1039
  "sock=#{sock.object_id} #{$!.class}"
1008
1040
  rescue DangoFrameworkMutexTimeoutException
1009
- @mutex_fail_count += 1
1041
+ @mutex_fail_count += 1 if @mutex_fail_count
1010
1042
  logger.warn "thread_send_notice_queue:failed send. sid=#{sid} " +
1011
1043
  "sock=#{sock.object_id} #{$!.class}"
1012
1044
  rescue Exception
@@ -1023,7 +1055,7 @@ EOF
1023
1055
  sleep @send_receive_sleep_interval_sec # スリープ
1024
1056
 
1025
1057
  rescue DangoFrameworkMutexTimeoutException
1026
- @mutex_fail_count += 1
1058
+ @mutex_fail_count += 1 if @mutex_fail_count
1027
1059
  logger.warn "ERROR:thread_send_notice_queue:DangoFrameworkMutexTimeoutException" +
1028
1060
  "#{error_message($!, 'u')}"
1029
1061
  rescue Exception
@@ -1073,24 +1105,26 @@ EOF
1073
1105
  begin
1074
1106
  before_time = Time.now
1075
1107
 
1076
- logger.debug "mpth:1:sls start"
1108
+ logger.debug "mpth:1:sls"
1077
1109
  @mutex_proc_thread.timeout_sync(3, "set_loop_setting_send_#{method_name}") do
1110
+ logger.debug "mpth:2:sls"
1078
1111
  __send__(method_name)
1079
1112
  end # mutex_proc_thread
1080
- logger.debug "mpth:2:sls end"
1081
1113
  # if count % 1000 == 0
1082
1114
 
1083
- real_wait_sec = wait_sec - (Time.now - before_time)
1084
- logger.debug "set_loop_setting:compute time=#{real_wait_sec - wait_sec}" if real_wait_sec < 0
1115
+ exec_sec = Time.now - before_time
1116
+ logger.info "set_loop_setting:long execute time=#{exec_sec}" if exec_sec > 1.0
1117
+
1118
+ real_wait_sec = wait_sec - exec_sec
1085
1119
  sleep real_wait_sec if real_wait_sec > 0
1086
1120
 
1087
1121
  count += 1
1088
1122
  count = 0 if count >= 10000000
1089
1123
 
1090
1124
  # mutex_fail_countが増えたらサーバーが重くなりすぎていると判断してちょっと待つ
1091
- if @mutex_fail_count > last_mutex_fail_count
1125
+ if @mutex_fail_count.to_i > last_mutex_fail_count
1092
1126
  sleep 1
1093
- last_mutex_fail_count = @mutex_fail_count.deep_dup
1127
+ last_mutex_fail_count = @mutex_fail_count.to_i
1094
1128
  end
1095
1129
 
1096
1130
  # メンテナンス機能
@@ -1099,7 +1133,7 @@ EOF
1099
1133
  sleep 10000
1100
1134
  end
1101
1135
  rescue DangoFrameworkMutexTimeoutException
1102
- @mutex_fail_count += 1
1136
+ @mutex_fail_count += 1 if @mutex_fail_count
1103
1137
  logger.warn "set_loop_setting error:#{error_message($!, 'u')}"
1104
1138
  rescue Exception
1105
1139
  logger.error "set_loop_setting error:#{error_message($!, 'u')}"
@@ -321,6 +321,7 @@ namespace :dango do
321
321
  task :stop_dango_process do
322
322
  dru = DangoRakeUtil.new
323
323
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
324
+ dru.puts_noverbose "stop_dango_process env=#{ENV['RAILS_ENV']}"
324
325
 
325
326
  pid = dru.get_dango_pid()
326
327
  dru.stop_process(pid) if pid # pidがあればプロセス停止
@@ -331,7 +332,7 @@ namespace :dango do
331
332
  task :check_dango_process do
332
333
  dru = DangoRakeUtil.new
333
334
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
334
- dru.puts_noverbose "check_dango_process"
335
+ dru.puts_noverbose "check_dango_process env=#{ENV['RAILS_ENV']}"
335
336
 
336
337
  # サーバーを再起動するかどうかの判定
337
338
  pid = dru.get_dango_pid() # pidのチェック
@@ -359,7 +360,7 @@ namespace :dango do
359
360
  socket_list = dru.drb_call(:_monitor_get_socket_list)
360
361
 
361
362
  dru.puts_noverbose "server_up_time=#{server_info['server_up_time'].inspect} " +
362
- "socket_list.size=#{socket_list.size}"
363
+ "socket_list.size=#{socket_list.size} long_alive_minutes=#{long_alive_minutes}"
363
364
 
364
365
  # サーバーが長く起動していて、接続者がいないのなら
365
366
  if check_dango_process_cmd &&
@@ -422,7 +423,7 @@ namespace :dango do
422
423
  task :get_trouble_status do
423
424
  dru = DangoRakeUtil.new
424
425
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
425
- dru.puts_noverbose "get_trouble_status"
426
+ dru.puts_noverbose "get_trouble_status env=#{ENV['RAILS_ENV']}"
426
427
 
427
428
  config = YAML.load(open("#{RAILS_ROOT}/config/dango/#{ENV['RAILS_ENV']}.yml", "rb"){|fh| fh.read})
428
429
  pid = dru.get_dango_pid() # pidのチェック
@@ -435,7 +436,7 @@ namespace :dango do
435
436
  task :get_server_info do
436
437
  dru = DangoRakeUtil.new
437
438
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
438
- dru.puts_noverbose "get_server_info"
439
+ dru.puts_noverbose "get_server_info env=#{ENV['RAILS_ENV']}"
439
440
  pp dru.drb_call(:_monitor_get_server_info)
440
441
  end
441
442
 
@@ -443,7 +444,7 @@ namespace :dango do
443
444
  task :thread_status do
444
445
  dru = DangoRakeUtil.new
445
446
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
446
- dru.puts_noverbose "thread_status"
447
+ dru.puts_noverbose "thread_status env=#{ENV['RAILS_ENV']}"
447
448
  pp dru.drb_call(:_monitor_thread_status)
448
449
  end
449
450
 
@@ -451,7 +452,7 @@ namespace :dango do
451
452
  task :mutex_status do
452
453
  dru = DangoRakeUtil.new
453
454
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
454
- dru.puts_noverbose "mutex_status"
455
+ dru.puts_noverbose "mutex_status env=#{ENV['RAILS_ENV']}"
455
456
  pp dru.drb_call(:_monitor_mutex_status)
456
457
  end
457
458
 
@@ -459,7 +460,7 @@ namespace :dango do
459
460
  task :get_shared do
460
461
  dru = DangoRakeUtil.new
461
462
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
462
- dru.puts_noverbose "get_shared"
463
+ dru.puts_noverbose "get_shared env=#{ENV['RAILS_ENV']}"
463
464
  pp dru.drb_call(:_monitor_get_shared)
464
465
  end
465
466
 
@@ -467,7 +468,7 @@ namespace :dango do
467
468
  task :write_shared do
468
469
  dru = DangoRakeUtil.new
469
470
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
470
- dru.puts_noverbose "write_shared"
471
+ dru.puts_noverbose "write_shared env=#{ENV['RAILS_ENV']}"
471
472
  key = ENV["KEY"]
472
473
  value = ENV["VALUE"]
473
474
  if ! key || ! value
@@ -481,7 +482,7 @@ namespace :dango do
481
482
  task :get_socket_list do
482
483
  dru = DangoRakeUtil.new
483
484
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
484
- dru.puts_noverbose "get_socket_list"
485
+ dru.puts_noverbose "get_socket_list env=#{ENV['RAILS_ENV']}"
485
486
  pp dru.drb_call(:_monitor_get_socket_list)
486
487
  end
487
488
 
@@ -489,7 +490,7 @@ namespace :dango do
489
490
  task :get_session_list do
490
491
  dru = DangoRakeUtil.new
491
492
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
492
- dru.puts_noverbose "get_session_list"
493
+ dru.puts_noverbose "get_session_list env=#{ENV['RAILS_ENV']}"
493
494
  pp dru.drb_call(:_monitor_get_session_list)
494
495
  end
495
496
 
@@ -497,7 +498,7 @@ namespace :dango do
497
498
  task :get_action_stat do
498
499
  dru = DangoRakeUtil.new
499
500
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
500
- dru.puts_noverbose "get_action_stat"
501
+ dru.puts_noverbose "get_action_stat env=#{ENV['RAILS_ENV']}"
501
502
  pp dru.drb_call(:_monitor_get_action_stat)
502
503
  end
503
504
 
@@ -505,7 +506,7 @@ namespace :dango do
505
506
  task :server_reload do
506
507
  dru = DangoRakeUtil.new
507
508
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
508
- dru.puts_noverbose "server_reload"
509
+ dru.puts_noverbose "server_reload env=#{ENV['RAILS_ENV']}"
509
510
  pp dru.drb_call(:_monitor_server_reload)
510
511
  end
511
512
 
@@ -513,7 +514,7 @@ namespace :dango do
513
514
  task :send_system_message do
514
515
  dru = DangoRakeUtil.new
515
516
  dru.check_verbose_mode() # verboseモードのフラグを立てる処理
516
- dru.puts_noverbose "send_system_message"
517
+ dru.puts_noverbose "send_system_message env=#{ENV['RAILS_ENV']}"
517
518
 
518
519
  message_type = ENV["TYPE"]
519
520
  if ! message_type
@@ -2,7 +2,7 @@ module Dango #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 5
5
- TINY = 1
5
+ TINY = 2
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dango
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keisuke Minami
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-01 00:00:00 +09:00
12
+ date: 2008-12-15 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -105,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
105
  requirements: []
106
106
 
107
107
  rubyforge_project: dango
108
- rubygems_version: 1.2.0
108
+ rubygems_version: 1.3.1
109
109
  signing_key:
110
110
  specification_version: 2
111
111
  summary: Realtime communications network framework for Ruby and Flash on Rails.