Skip to content

Commit d882012

Browse files
authored
fix: Controller stops all servers instead of one when trying to stop a empty server (#133)
* fix: Fix * fix: Useless warning * fix: Useless warning
1 parent 15d4821 commit d882012

3 files changed

Lines changed: 53 additions & 34 deletions

File tree

controller/src/application/group.rs

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
244258
enum Stage {
245259
Queueing,
246260
Active,
261+
Stopping,
247262
}
248263

249264
impl GroupServer {

controller/src/application/subscriber.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use anyhow::Result;
2-
use simplelog::error;
32
use tokio::sync::mpsc::{channel, Receiver, Sender};
43
use tokio_stream::wrappers::ReceiverStream;
54
use tonic::Status;
@@ -33,8 +32,8 @@ impl<T> Subscriber<T> {
3332
pub async fn send_network(&self, data: Result<T, Status>) -> bool {
3433
match &self.0 {
3534
Dispatch::Network(sender) => {
36-
if let Err(error) = sender.send(data).await {
37-
error!("Failed to send network message: {}", error);
35+
if sender.send(data).await.is_err() {
36+
// Channel closed
3837
false
3938
} else {
4039
true
@@ -47,16 +46,16 @@ impl<T> Subscriber<T> {
4746
pub async fn send_message(&self, message: T) -> bool {
4847
match &self.0 {
4948
Dispatch::Network(sender) => {
50-
if let Err(error) = sender.send(Ok(message)).await {
51-
error!("Failed to send network message: {}", error);
49+
if sender.send(Ok(message)).await.is_err() {
50+
// Channel closed
5251
false
5352
} else {
5453
true
5554
}
5655
}
5756
Dispatch::Plugin(sender) => {
58-
if let Err(error) = sender.send(Ok(message)).await {
59-
error!("Failed to send plugin message: {}", error);
57+
if sender.send(Ok(message)).await.is_err() {
58+
// Channel closed
6059
false
6160
} else {
6261
true

plugins/cloudflare/src/plugin/dns/manager.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,11 @@ impl Records {
170170
}
171171
}
172172

173+
if batch.deletes.is_empty() {
174+
// No request to cloudflare required
175+
continue;
176+
}
177+
173178
count += batch.deletes.len();
174179
backend.send_batch(zone_id, &batch);
175180
}

0 commit comments

Comments
 (0)