dango 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.