in Stable-Diffusion-UI-Agones/agones-sidecar/main.go [154:200]
func shutdownAfterNAllocations(s *sdk.SDK, readyIterations, shutdownDelaySec int) {
gs, err := s.GameServer()
if err != nil {
log.Fatalf("Could not get game server: %v", err)
}
log.Printf("Initial game Server state = %s", gs.Status.State)
m := sync.Mutex{} // protects the following two variables
lastAllocated := gs.ObjectMeta.Annotations["agones.dev/last-allocated"]
remainingIterations := readyIterations
if err := s.WatchGameServer(func(gs *coresdk.GameServer) {
m.Lock()
defer m.Unlock()
la := gs.ObjectMeta.Annotations["agones.dev/last-allocated"]
log.Printf("Watch Game Server callback fired. State = %s, Last Allocated = %q", gs.Status.State, la)
if lastAllocated != la {
log.Println("Game Server Allocated")
lastAllocated = la
remainingIterations--
// Run asynchronously
go func(iterations int) {
time.Sleep(time.Duration(shutdownDelaySec) * time.Second)
if iterations > 0 {
log.Println("Moving Game Server back to Ready")
readyErr := s.Ready()
if readyErr != nil {
log.Fatalf("Could not set game server to ready: %v", readyErr)
}
log.Println("Game Server is Ready")
return
}
log.Println("Moving Game Server to Shutdown")
if shutdownErr := s.Shutdown(); shutdownErr != nil {
log.Fatalf("Could not shutdown game server: %v", shutdownErr)
}
// The process will exit when Agones removes the pod and the
// container receives the SIGTERM signal
return
}(remainingIterations)
}
}); err != nil {
log.Fatalf("Could not watch Game Server events, %v", err)
}
}