Add heartbeat timeout
This commit is contained in:
parent
fde7d50edc
commit
8d1fb524ec
@ -12,6 +12,7 @@ import fr.javatic.mongo.jacksonCodec.objectId.Id;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import net.frozenorb.apiv3.APIv3;
|
import net.frozenorb.apiv3.APIv3;
|
||||||
import net.frozenorb.apiv3.serialization.gson.ExcludeFromReplies;
|
import net.frozenorb.apiv3.serialization.gson.ExcludeFromReplies;
|
||||||
|
import net.frozenorb.apiv3.util.TimeUtils;
|
||||||
import org.bson.Document;
|
import org.bson.Document;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
@ -46,6 +47,7 @@ public final class Server {
|
|||||||
static {
|
static {
|
||||||
updateCache();
|
updateCache();
|
||||||
APIv3.getVertxInstance().setPeriodic(TimeUnit.MINUTES.toMillis(1), (id) -> updateCache());
|
APIv3.getVertxInstance().setPeriodic(TimeUnit.MINUTES.toMillis(1), (id) -> updateCache());
|
||||||
|
APIv3.getVertxInstance().setPeriodic(TimeUnit.MINUTES.toMillis(1), (id) -> updateTimedOutServers());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void updateCache() {
|
private static void updateCache() {
|
||||||
@ -66,6 +68,42 @@ public final class Server {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: This code isn't multi-instance safe AND will send more
|
||||||
|
// db requests than needed.
|
||||||
|
private static void updateTimedOutServers() {
|
||||||
|
for (Server server : serverCache) {
|
||||||
|
int lastUpdatedAgo = TimeUtils.getSecondsBetween(server.getLastUpdatedAt(), Instant.now());
|
||||||
|
|
||||||
|
if (lastUpdatedAgo < TimeUnit.SECONDS.toSeconds(30)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (UUID online : server.getPlayers()) {
|
||||||
|
User.findById(online, (user, error) -> {
|
||||||
|
if (error != null) {
|
||||||
|
error.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user.leftServer(server)) {
|
||||||
|
user.save((ignored, error2) -> {
|
||||||
|
if (error2 != null) {
|
||||||
|
error2.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
server.players = new HashSet<>();
|
||||||
|
server.save((ignored, error) -> {
|
||||||
|
if (error != null) {
|
||||||
|
error.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Server() {} // For Jackson
|
private Server() {} // For Jackson
|
||||||
|
|
||||||
public Server(String id, String displayName, String apiKey, ServerGroup serverGroup, String serverIp) {
|
public Server(String id, String displayName, String apiKey, ServerGroup serverGroup, String serverIp) {
|
||||||
|
@ -349,12 +349,16 @@ public final class User {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void leftServer(Server server) {
|
// Returns if any change was actually made.
|
||||||
|
public boolean leftServer(Server server) {
|
||||||
// We have this check to prevent issues where one server's
|
// We have this check to prevent issues where one server's
|
||||||
// leave is processed after another server's login.
|
// leave is processed after another server's login.
|
||||||
if (server.getId().equals(lastSeenOn)) {
|
if (server.getId().equals(lastSeenOn)) {
|
||||||
this.lastSeenAt = Instant.now();
|
this.lastSeenAt = Instant.now();
|
||||||
this.online = false;
|
this.online = false;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user