Only mark servers as offline if they fail pings 3+ times (#5664)
* wip: online status fix * use INCR * properly clear cache
This commit is contained in:
@@ -24,6 +24,7 @@ pub struct ServerPingQueue {
|
||||
}
|
||||
|
||||
pub const REDIS_NAMESPACE: &str = "minecraft_java_server_ping";
|
||||
pub const REDIS_FAILURE_NAMESPACE: &str = "minecraft_java_server_ping_failures";
|
||||
pub const CLICKHOUSE_TABLE: &str = "minecraft_java_server_pings";
|
||||
|
||||
impl ServerPingQueue {
|
||||
@@ -118,27 +119,65 @@ impl ServerPingQueue {
|
||||
.await
|
||||
.wrap_err("failed to write ping record")?;
|
||||
|
||||
redis
|
||||
.set_serialized_to_json(
|
||||
REDIS_NAMESPACE,
|
||||
project_id,
|
||||
ping,
|
||||
let mut updated_project = false;
|
||||
if data.is_some() {
|
||||
// ping succeeded; immediately update its online status in redis
|
||||
|
||||
redis
|
||||
.set_serialized_to_json(
|
||||
REDIS_NAMESPACE,
|
||||
project_id,
|
||||
ping,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.wrap_err("failed to set redis key")?;
|
||||
updated_project = true;
|
||||
|
||||
redis
|
||||
.delete(REDIS_FAILURE_NAMESPACE, project_id)
|
||||
.await
|
||||
.wrap_err("failed to delete failure count")?;
|
||||
} else {
|
||||
// ping failed; if it's failed too many times, mark it as offline in redis
|
||||
// otherwise, just add to the fail counter
|
||||
|
||||
let failure_count = redis
|
||||
.incr(REDIS_FAILURE_NAMESPACE, &project_id.to_string())
|
||||
.await
|
||||
.wrap_err("failed to increment failure count")?;
|
||||
|
||||
if let Some(count) = failure_count
|
||||
&& count >= ENV.SERVER_PING_MAX_FAIL_COUNT
|
||||
{
|
||||
redis
|
||||
.set_serialized_to_json(
|
||||
REDIS_NAMESPACE,
|
||||
project_id,
|
||||
ping,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.wrap_err(
|
||||
"failed to set failed ping record in redis",
|
||||
)?;
|
||||
updated_project = true;
|
||||
}
|
||||
}
|
||||
|
||||
if updated_project {
|
||||
DBProject::clear_cache(
|
||||
(*project_id).into(),
|
||||
None,
|
||||
None,
|
||||
&self.redis,
|
||||
)
|
||||
.await
|
||||
.wrap_err("failed to set redis key")?;
|
||||
|
||||
DBProject::clear_cache(
|
||||
(*project_id).into(),
|
||||
None,
|
||||
None,
|
||||
&self.redis,
|
||||
)
|
||||
.await
|
||||
.inspect_err(|err| {
|
||||
warn!("failed to clear project cache: {err:#}")
|
||||
})
|
||||
.ok();
|
||||
.inspect_err(|err| {
|
||||
warn!("failed to clear project cache: {err:#}")
|
||||
})
|
||||
.ok();
|
||||
}
|
||||
}
|
||||
|
||||
ch.end()
|
||||
|
||||
Reference in New Issue
Block a user