diff --git a/config.properties b/config.properties index fcf2420..decc49f 100644 --- a/config.properties +++ b/config.properties @@ -6,8 +6,9 @@ mysql_password=Michal2407 mysql_database=jnet server_port=1225 debug=true -ping_attempt=2 -ping_timeout=2000 +ping_attempt=4 +ping_timeout=2 +ping_repeat=3 instability_attempt=2 -instability_limit=1000 +instability_limit=1 diff --git a/src/jnet/server/probe/NettyPing.java b/src/jnet/server/probe/NettyPing.java index a20c54f..5b5cab1 100644 --- a/src/jnet/server/probe/NettyPing.java +++ b/src/jnet/server/probe/NettyPing.java @@ -11,39 +11,36 @@ import jnet.lib.Status; import jnet.lib.object.MapObject; import jnet.server.Server; - public class NettyPing extends Thread { - + private static final HashedWheelTimer TIMER = new HashedWheelTimer(); // Netty časovač public NettyPing() { } - - @Override - public void start() { + public void run() { LogFile.printInfo("Ping probe start"); for (MapObject mapObject : Server.mapObject) { schedulePing(mapObject); } } - + private static void schedulePing(MapObject object) { TIMER.newTimeout(new TimerTask() { @Override public void run(Timeout timeout) { pingHost(object); - timeout.timer().newTimeout(this, 3, TimeUnit.SECONDS); // Opakuje každých 5 sekund + timeout.timer().newTimeout(this, Server.config.getInt("ping_repeat"), TimeUnit.SECONDS); // Opakuje každých x sekund } }, 0, TimeUnit.SECONDS); } - + private static void pingHost(MapObject object) { try { String command = System.getProperty("os.name").startsWith("Windows") - ? "ping -n 1 " + object.getIp() - : "ping -c 1 " + object.getIp(); + ? "ping -n 1 -w " + String.valueOf((Server.config.getInt("ping_timeout")*1000)) + " " + object.getIp() // Timeout 2000 ms (Windows) + : "ping -c 1 -W " + String.valueOf(Server.config.getInt("ping_timeout")) + " " + object.getIp(); // Timeout 2 sec (Linux) Process process = Runtime.getRuntime().exec(command); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); @@ -60,16 +57,18 @@ public class NettyPing extends Thread { } //System.out.println("Ping na " + object.getIp() + (success ? " uspesny! RTT: " + timeMs + " ms" : " selhal!")); - if (object.getStatus() != Status.OK) { - PingResult.stateOnline(object); + if (success) { + if (object.getStatus() != Status.OK) { + PingResult.stateOnline(object); + } + } else { + PingResult.stateOffline(object); } - - + process.waitFor(); } catch (Exception e) { - System.err.println("Chyba pri pingu na " + object.getIp()); PingResult.stateOffline(object); - //e.printStackTrace(); + LogFile.printErr("Chyba pri pingu na " + object.getIp() + " " + e.getMessage()); } } @@ -82,6 +81,5 @@ public class NettyPing extends Thread { } return -1; } - } diff --git a/src/jnet/server/probe/PingResult.java b/src/jnet/server/probe/PingResult.java index df2d8d3..2bc16e9 100644 --- a/src/jnet/server/probe/PingResult.java +++ b/src/jnet/server/probe/PingResult.java @@ -10,14 +10,26 @@ import jnet.server.ServerMessageParser; public class PingResult { - private static final int POKUS = 2; - + private static final int POKUS = Server.config.getInt("ping_attempt"); public static void stateOnline(MapObject obj) { // oveří jestli neni zarizeni vypnuto - if (obj.isActive()) { + if (obj.isActive() && obj.getStatus() != Status.OK) { // vynuluje ping pokusy obj.setPingAttemp(0); + // pokud byl předchozí stav offline ukončí event + if (obj.getStatus() == Status.OFFLINE) { + // aktualizace eventu + Event event = Database.endEvent(obj.getId(), Event.TYPE_PING); + for (int i = 0; i < Server.events.size(); i++) { + if (Server.events.get(i).getId() == event.getId()) { + Server.events.set(i, event); + } + } + // odeslani aktualizovaného eventu + ServerMessageParser.sendAll(Message.EVENT_UPDATE, event); + } + // nastavi status objektu obj.setStatus(Status.OK); // odesle informaci o novem stavu klientum @@ -28,7 +40,8 @@ public class PingResult { public static void stateOffline(MapObject obj) { // oveří jestli neni zarizeni vypnuto if (obj.isActive()) { - if (obj.getPingAttemp() >= POKUS) { + if (obj.getPingAttemp() >= POKUS && obj.getStatus() != Status.OFFLINE) { + System.err.println("objekt: " + obj.getName() + " pokus: " + obj.getPingAttemp()); // nastavi status objektu obj.setStatus(Status.OFFLINE); // odesle informaci o novem stavu klientum