@@ -77,40 +77,53 @@ impl Group {
7777 }
7878 true
7979 } ) ,
80- Stage :: Queueing => true ,
80+ Stage :: Queueing | Stage :: Stopping => true ,
8181 } ) ;
8282
83- if self . scaling . stop_empty_servers && self . servers . len ( ) as u32 > target_count {
84- let mut to_stop = self . servers . len ( ) as u32 - target_count;
83+ // Count all servers that are active
84+ let current_count = self
85+ . servers
86+ . iter ( )
87+ . filter ( |server| matches ! ( server. 1 . 1 , Stage :: Active ) )
88+ . count ( ) ;
89+
90+ if self . scaling . stop_empty_servers && current_count as u32 > target_count {
91+ let mut to_stop = current_count as u32 - target_count;
8592 let mut requests = vec ! [ ] ;
86- self . servers . retain ( |id, server| match & server. 1 {
87- Stage :: Active => servers. get_server_mut ( id. uuid ( ) ) . is_some_and ( |server| {
88- if server. connected_users ( ) == & 0 {
89- if server. flags ( ) . should_stop ( ) && to_stop > 0 {
90- debug ! (
93+ self . servers
94+ . retain ( |id, group_server| match & group_server. 1 {
95+ Stage :: Active => servers. get_server_mut ( id. uuid ( ) ) . is_some_and ( |server| {
96+ if server. connected_users ( ) == & 0 {
97+ if server. flags ( ) . should_stop ( ) && to_stop > 0 {
98+ debug ! (
9199 "Server {} is empty and reached the timeout, stopping it..." ,
92100 server. id( )
93101 ) ;
94- requests. push ( StopRequest :: new ( None , server. id ( ) . clone ( ) ) ) ;
95- to_stop -= 1 ;
102+ requests. push ( StopRequest :: new ( None , server. id ( ) . clone ( ) ) ) ;
103+ to_stop -= 1 ;
104+ server. flags_mut ( ) . clear_stop ( ) ;
105+ // Mark server as stopping
106+ group_server. 1 = Stage :: Stopping ;
107+ } else if !server. flags ( ) . is_stop_set ( ) {
108+ debug ! (
109+ "Server {} is empty, starting stop timer..." ,
110+ server. id( )
111+ ) ;
112+ server
113+ . flags_mut ( )
114+ . replace_stop ( * config. empty_server_timeout ( ) ) ;
115+ }
116+ } else if server. flags ( ) . is_stop_set ( ) {
117+ debug ! (
118+ "Server {} is no longer empty, clearing stop timer..." ,
119+ server. id( )
120+ ) ;
96121 server. flags_mut ( ) . clear_stop ( ) ;
97- } else if !server. flags ( ) . is_stop_set ( ) {
98- debug ! ( "Server {} is empty, starting stop timer..." , server. id( ) ) ;
99- server
100- . flags_mut ( )
101- . replace_stop ( * config. empty_server_timeout ( ) ) ;
102122 }
103- } else if server. flags ( ) . is_stop_set ( ) {
104- debug ! (
105- "Server {} is no longer empty, clearing stop timer..." ,
106- server. id( )
107- ) ;
108- server. flags_mut ( ) . clear_stop ( ) ;
109- }
110- true
111- } ) ,
112- Stage :: Queueing => true ,
113- } ) ;
123+ true
124+ } ) ,
125+ Stage :: Queueing | Stage :: Stopping => true ,
126+ } ) ;
114127 servers. schedule_stops ( requests) ;
115128 }
116129 }
@@ -181,6 +194,7 @@ impl Group {
181194 servers. cancel_start ( id. uuid ( ) ) ;
182195 false
183196 }
197+ Stage :: Stopping => false ,
184198 } ) ;
185199
186200 self . status = LifecycleStatus :: Inactive ;
@@ -196,7 +210,7 @@ impl Group {
196210 . iter ( )
197211 . find_map ( |( id, server) | match & server. 1 {
198212 Stage :: Active => servers. get_server ( id. uuid ( ) ) ,
199- Stage :: Queueing => None ,
213+ Stage :: Queueing | Stage :: Stopping => None ,
200214 } )
201215 }
202216
@@ -244,6 +258,7 @@ struct GroupServer(usize, Stage);
244258enum Stage {
245259 Queueing ,
246260 Active ,
261+ Stopping ,
247262}
248263
249264impl GroupServer {
0 commit comments