From d36b20955a253bea5759010ecf0af259e1a1935a Mon Sep 17 00:00:00 2001 From: Daigo Moriwaki Date: Mon, 12 Dec 2011 22:10:09 +0900 Subject: [PATCH] Improved robustness of test/benchmark.rb. --- shogi-server | 5 ++++- test/benchmark.rb | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/shogi-server b/shogi-server index 89e6118..d79f165 100755 --- a/shogi-server +++ b/shogi-server @@ -420,7 +420,10 @@ def main client.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true) # Keepalive time can be set by /proc/sys/net/ipv4/tcp_keepalive_time player, login = login_loop(client) # loop - next unless player + unless player + log_error("Detected a timed out login attempt") + next + end log_message(sprintf("user %s login", player.name)) login.process diff --git a/test/benchmark.rb b/test/benchmark.rb index 2d3be05..28539d7 100644 --- a/test/benchmark.rb +++ b/test/benchmark.rb @@ -1,14 +1,18 @@ #!/usr/bin/ruby +require 'logger' require 'socket' require 'thread' +$logger = nil + class BenchPlayer def initialize(game_name, name, sente) @game_name = game_name @name = "%s_%s" % [game_name, name] @turn_mark = sente ? "+" : "-" @nmoves = 0 + @socket = nil end attr_reader :nmoves @@ -22,37 +26,42 @@ class BenchPlayer def reader Thread.new do + Thread.pass loop do - if r = select([@socket], nil, nil, 10) + if r = select([@socket], nil, nil, 300) str = r[0].first.gets if %r!^[\+\-]\d{4}\w{2},T\d+$! =~ str @nmoves += 1 end - @message << str + @message << str if str else - raise "timed out" + $logger.warn "Timed out: %s" % [@name] end end + $logger.error "Socket error: %s" % [@name] end end def wait(reg) loop do break if reg =~ @message - sleep 0.1 + #$logger.debug "WAIT %s: %s" % [reg, @message] + sleep 0.001 + #Thread.pass end end def wait_nmoves(n) loop do break if @nmoves == n - sleep 0.01 + sleep 0.001 + #Thread.pass end end def login @socket.puts "LOGIN #{@name} dummy x1" - wait %r!^LOGIN! + wait %r!^##\[LOGIN\] \+OK! end def game @@ -94,12 +103,20 @@ class BenchGame end def start + $logger.info "Starting... %s" % [@game_name] + $logger.debug "Connecting... %s" % [@game_name] each_player {|player| player.connect} + $logger.debug "Logging in... %s" % [@game_name] each_player {|player| player.login} + $logger.debug "Sending GAME... %s" % [@game_name] each_player {|player| player.game} + $logger.debug "Waiting... %s" % [@game_name] each_player {|player| player.wait %r!^END Game_Summary!} + $logger.debug "Agreeing... %s" % [@game_name] each_player {|player| player.agree} + $logger.debug "AGREE waiting... %s" % [@game_name] each_player {|player| player.wait %r!^START:!} + $logger.info "Started %s" % [@game_name] turn = true # black nmoves = 0 @csa.each_line do |line| @@ -115,10 +132,15 @@ class BenchGame turn = true nmoves += 1 when /^%TORYO/ + $logger.debug "Waiting TORYO... %s" % [@game_name] + @p1.wait_nmoves nmoves + @p2.wait_nmoves nmoves turn ? @p1.toryo : @p2.toryo end end + $logger.info "Logging out... %s" % [@game_name] each_player {|player| player.logout} + $logger.info "Finished %s" % [@game_name] end end @@ -127,11 +149,15 @@ if __FILE__ == $0 filepath = ARGV.shift || File.join(File.dirname(__FILE__), "csa", "wdoor+floodgate-900-0+gps_normal+gps_l+20100507120007.csa") csa = File.open(filepath){|f| f.read} + $logger = Logger.new(STDOUT) + $logger.level = $DEBUG ? Logger::DEBUG : Logger::INFO + nclients = ARGV.shift || 1 nclients = nclients.to_i threads = [] nclients.times do |i| threads << Thread.new do + Thread.pass game = BenchGame.new("b#{i}", csa) game.start end -- 2.11.0