OSDN Git Service

* [shogi-server] Support a graceful shutdown. (Closes #38544)
[shogi-server/shogi-server.git] / shogi_server / league / floodgate_thread.rb
index 937e47c..a665704 100644 (file)
@@ -68,14 +68,18 @@ module ShogiServer
       floodgate.match_game
     end
 
-    # Regenerate floodgate instances from next_array for the next matches.
-    # @param next_array array of [game_name, next_time]
+    # Regenerate floodgate instances from next_instances for the next matches.
+    # @param next_instances array of [game_name, next_time]
     #
-    def regenerate_leagues(next_array)
-      leagues = next_array.collect do |game_name, next_time|
+    def regenerate_leagues(next_instances)
+      leagues = next_instances.collect do |prev|
+        log_message("Regenerating a floodgate league...: %s %s %s %s %d %d" %
+                    [prev.game_name, prev.next_time, prev.pairing_factory, prev.sacrifice, prev.max_moves, prev.least_time_per_move])
         floodgate = ShogiServer::League::Floodgate.new($league, 
-                                                       {:game_name => game_name,
-                                                        :next_time => next_time})
+                      {:game_name       => prev.game_name,       :next_time => prev.next_time,
+                       :pairing_factory => prev.pairing_factory, :sacrifice => prev.sacrifice,
+                       :max_moves       => prev.max_moves,       :least_time_per_move => prev.least_time_per_move})
+        floodgate
       end
       floodgate_reload_log(leagues)
       return leagues
@@ -97,20 +101,22 @@ module ShogiServer
             floodgate = next_league(leagues)
             next if wait_next_floodgate(floodgate)
 
-            next_array = leagues.collect do |floodgate|
-              if (floodgate.next_time - Time.now) > 0
-                [floodgate.game_name, floodgate.next_time]
-              else
-                start_games(floodgate)
-                floodgate.charge # updates next_time
-                [floodgate.game_name, floodgate.next_time] 
+            next_instances = leagues.collect do |fg|
+              unless (fg.next_time - Time.now) > 0
+                if ShogiServer::available?
+                  start_games(fg)
+               else
+                  log_message("The STOP file prevents from starting new Floodgate matches")
+               end
+                fg.charge # updates next_time
               end
+              fg
             end
 
             reload_shogi_server
 
             # Regenerate floodgate instances after ShogiServer.realod
-            leagues = regenerate_leagues(next_array)
+            leagues = regenerate_leagues(next_instances)
           rescue Exception => ex 
             # ignore errors
             log_error("[in Floodgate's thread] #{ex} #{ex.backtrace}")