Added some lost and reconnect statistics to footer data.

This commit is contained in:
LevelX2 2016-04-14 23:43:08 +02:00
parent 55dc0f8b6a
commit 5770dd6014
3 changed files with 64 additions and 29 deletions

View file

@ -11,8 +11,8 @@ import mage.remote.traffic.ZippedObjectImpl;
public class CompressUtil { public class CompressUtil {
/** /**
* Defines should data be compressed or not. True by default. * Defines should data be compressed or not. True by default. Read from
* Read from system property: * system property:
*/ */
private static boolean compressData = true; private static boolean compressData = true;
@ -28,10 +28,12 @@ public class CompressUtil {
/** /**
* Hidden constructor * Hidden constructor
*/ */
private CompressUtil() {} private CompressUtil() {
}
/** /**
* Decompress data, but only if it was compressed previously return original object otherwise. * Decompress data, but only if it was compressed previously return original
* object otherwise.
* *
* @param data Data to decompress * @param data Data to decompress
* @return Decompressed object * @return Decompressed object
@ -40,7 +42,7 @@ public class CompressUtil {
if (data == null || !(data instanceof ZippedObject)) { if (data == null || !(data instanceof ZippedObject)) {
return data; return data;
} }
return ((ZippedObject)data).unzip(); return ((ZippedObject) data).unzip();
} }
/** /**
@ -51,7 +53,7 @@ public class CompressUtil {
*/ */
public static Object compress(Object data) { public static Object compress(Object data) {
if (data != null && compressData) { if (data != null && compressData) {
return new ZippedObjectImpl<Object>(data); return new ZippedObjectImpl<>(data);
} }
return null; return null;
} }

View file

@ -53,6 +53,7 @@ import mage.server.record.UserStatsRepository;
import mage.server.tournament.TournamentController; import mage.server.tournament.TournamentController;
import mage.server.tournament.TournamentManager; import mage.server.tournament.TournamentManager;
import mage.server.tournament.TournamentSession; import mage.server.tournament.TournamentSession;
import mage.server.util.ServerMessagesUtil;
import mage.server.util.SystemUtil; import mage.server.util.SystemUtil;
import mage.view.TableClientMessage; import mage.view.TableClientMessage;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
@ -63,7 +64,7 @@ import org.apache.log4j.Logger;
*/ */
public class User { public class User {
private static final Logger LOGGER = Logger.getLogger(User.class); private static final Logger logger = Logger.getLogger(User.class);
public enum UserState { public enum UserState {
@ -131,15 +132,15 @@ public class User {
if (sessionId.isEmpty()) { if (sessionId.isEmpty()) {
userState = UserState.Disconnected; userState = UserState.Disconnected;
lostConnection(); lostConnection();
LOGGER.trace("USER - lost connection: " + userName + " id: " + userId); logger.trace("USER - lost connection: " + userName + " id: " + userId);
} else if (userState == UserState.Created) { } else if (userState == UserState.Created) {
userState = UserState.Connected; userState = UserState.Connected;
LOGGER.trace("USER - created: " + userName + " id: " + userId); logger.trace("USER - created: " + userName + " id: " + userId);
} else { } else {
userState = UserState.Reconnected; userState = UserState.Reconnected;
reconnect(); reconnect();
LOGGER.trace("USER - reconnected: " + userName + " id: " + userId); logger.trace("USER - reconnected: " + userName + " id: " + userId);
} }
} }
@ -150,6 +151,7 @@ public class User {
GameManager.getInstance().stopWatching(gameId, userId); GameManager.getInstance().stopWatching(gameId, userId);
iterator.remove(); iterator.remove();
} }
ServerMessagesUtil.getInstance().incLostConnection();
} }
public boolean isConnected() { public boolean isConnected() {
@ -275,17 +277,18 @@ public class User {
public boolean isExpired(Date expired) { public boolean isExpired(Date expired) {
if (lastActivity.before(expired)) { if (lastActivity.before(expired)) {
LOGGER.trace(userName + " is expired!"); logger.trace(userName + " is expired!");
userState = UserState.Expired; userState = UserState.Expired;
return true; return true;
} }
LOGGER.trace(new StringBuilder("isExpired: User ").append(userName).append(" lastActivity: ").append(lastActivity).append(" expired: ").append(expired).toString()); logger.trace("isExpired: User " + userName + " lastActivity: " + lastActivity + " expired: " + expired);
return false; return false;
/*userState == UserState.Disconnected && */ /*userState == UserState.Disconnected && */
} }
private void reconnect() { private void reconnect() {
logger.trace(userName + " started reconnect");
for (Entry<UUID, Table> entry : tables.entrySet()) { for (Entry<UUID, Table> entry : tables.entrySet()) {
ccJoinedTable(entry.getValue().getRoomId(), entry.getValue().getId(), entry.getValue().isTournament()); ccJoinedTable(entry.getValue().getRoomId(), entry.getValue().getId(), entry.getValue().isTournament());
} }
@ -316,6 +319,8 @@ public class User {
TableController controller = TableManager.getInstance().getController(entry.getKey()); TableController controller = TableManager.getInstance().getController(entry.getKey());
ccSideboard(entry.getValue(), entry.getKey(), controller.getRemainingTime(), controller.getOptions().isLimited()); ccSideboard(entry.getValue(), entry.getKey(), controller.getRemainingTime(), controller.getOptions().isLimited());
} }
ServerMessagesUtil.getInstance().incReconnects();
logger.trace(userName + " ended reconnect");
} }
public void addGame(UUID playerId, GameSessionPlayer gameSession) { public void addGame(UUID playerId, GameSessionPlayer gameSession) {
@ -363,35 +368,35 @@ public class User {
} }
public void remove(DisconnectReason reason) { public void remove(DisconnectReason reason) {
LOGGER.trace("REMOVE " + getName() + " Draft sessions " + draftSessions.size()); logger.trace("REMOVE " + getName() + " Draft sessions " + draftSessions.size());
for (DraftSession draftSession : draftSessions.values()) { for (DraftSession draftSession : draftSessions.values()) {
draftSession.setKilled(); draftSession.setKilled();
} }
draftSessions.clear(); draftSessions.clear();
LOGGER.trace("REMOVE " + getName() + " Tournament sessions " + userTournaments.size()); logger.trace("REMOVE " + getName() + " Tournament sessions " + userTournaments.size());
for (UUID tournamentId : userTournaments.values()) { for (UUID tournamentId : userTournaments.values()) {
TournamentManager.getInstance().quit(tournamentId, getId()); TournamentManager.getInstance().quit(tournamentId, getId());
} }
userTournaments.clear(); userTournaments.clear();
LOGGER.trace("REMOVE " + getName() + " Tables " + tables.size()); logger.trace("REMOVE " + getName() + " Tables " + tables.size());
for (Entry<UUID, Table> entry : tables.entrySet()) { for (Entry<UUID, Table> entry : tables.entrySet()) {
LOGGER.debug("-- leave tableId: " + entry.getValue().getId()); logger.debug("-- leave tableId: " + entry.getValue().getId());
TableManager.getInstance().leaveTable(userId, entry.getValue().getId()); TableManager.getInstance().leaveTable(userId, entry.getValue().getId());
} }
tables.clear(); tables.clear();
LOGGER.trace("REMOVE " + getName() + " Game sessions: " + gameSessions.size()); logger.trace("REMOVE " + getName() + " Game sessions: " + gameSessions.size());
for (GameSessionPlayer gameSessionPlayer : gameSessions.values()) { for (GameSessionPlayer gameSessionPlayer : gameSessions.values()) {
LOGGER.debug("-- kill game session of gameId: " + gameSessionPlayer.getGameId()); logger.debug("-- kill game session of gameId: " + gameSessionPlayer.getGameId());
GameManager.getInstance().quitMatch(gameSessionPlayer.getGameId(), userId); GameManager.getInstance().quitMatch(gameSessionPlayer.getGameId(), userId);
gameSessionPlayer.quitGame(); gameSessionPlayer.quitGame();
} }
gameSessions.clear(); gameSessions.clear();
LOGGER.trace("REMOVE " + getName() + " watched Games " + watchedGames.size()); logger.trace("REMOVE " + getName() + " watched Games " + watchedGames.size());
for (UUID gameId : watchedGames) { for (UUID gameId : watchedGames) {
GameManager.getInstance().stopWatching(gameId, userId); GameManager.getInstance().stopWatching(gameId, userId);
} }
watchedGames.clear(); watchedGames.clear();
LOGGER.trace("REMOVE " + getName() + " Chats "); logger.trace("REMOVE " + getName() + " Chats ");
ChatManager.getInstance().removeUser(userId, reason); ChatManager.getInstance().removeUser(userId, reason);
} }
@ -450,11 +455,11 @@ public class User {
} }
} else { } else {
// can happen if tournamet has just ended // can happen if tournamet has just ended
LOGGER.debug(getName() + " tournament player missing - tableId:" + table.getId(), null); logger.debug(getName() + " tournament player missing - tableId:" + table.getId(), null);
tablesToDelete.add(tableEntry.getKey()); tablesToDelete.add(tableEntry.getKey());
} }
} else { } else {
LOGGER.error(getName() + " tournament key missing - tableId: " + table.getId(), null); logger.error(getName() + " tournament key missing - tableId: " + table.getId(), null);
} }
} else { } else {
switch (table.getState()) { switch (table.getState()) {

View file

@ -24,11 +24,9 @@
* The views and conclusions contained in the software and documentation are those of the * The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.server.util; package mage.server.util;
import org.apache.log4j.Logger;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.InputStream; import java.io.InputStream;
@ -41,10 +39,11 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.log4j.Logger;
/** /**
* Handles server messages (Messages of the Day). * Handles server messages (Messages of the Day). Reloads messages every 5
* Reloads messages every 5 minutes. * minutes.
* *
* @author nantuko * @author nantuko
*/ */
@ -66,6 +65,8 @@ public class ServerMessagesUtil {
private static long startDate; private static long startDate;
private static final AtomicInteger gamesStarted = new AtomicInteger(0); private static final AtomicInteger gamesStarted = new AtomicInteger(0);
private static final AtomicInteger tournamentsStarted = new AtomicInteger(0); private static final AtomicInteger tournamentsStarted = new AtomicInteger(0);
private static final AtomicInteger lostConnection = new AtomicInteger(0);
private static final AtomicInteger reconnects = new AtomicInteger(0);
static { static {
pathToExternalMessages = System.getProperty("messagesPath"); pathToExternalMessages = System.getProperty("messagesPath");
@ -102,6 +103,7 @@ public class ServerMessagesUtil {
newMessages.addAll(motdMessages); newMessages.addAll(motdMessages);
} }
newMessages.add(getServerStatistics()); newMessages.add(getServerStatistics());
newMessages.add(getServerStatistics2());
lock.writeLock().lock(); lock.writeLock().lock();
try { try {
@ -166,7 +168,7 @@ public class ServerMessagesUtil {
private String getServerStatistics() { private String getServerStatistics() {
long current = System.currentTimeMillis(); long current = System.currentTimeMillis();
long hours = ((current - startDate)/(1000*60*60)); long hours = ((current - startDate) / (1000 * 60 * 60));
StringBuilder statistics = new StringBuilder("Server uptime: "); StringBuilder statistics = new StringBuilder("Server uptime: ");
statistics.append(hours); statistics.append(hours);
statistics.append(" hour(s), games played: "); statistics.append(" hour(s), games played: ");
@ -176,12 +178,25 @@ public class ServerMessagesUtil {
return statistics.toString(); return statistics.toString();
} }
private String getServerStatistics2() {
long current = System.currentTimeMillis();
long minutes = ((current - startDate) / (1000 * 60));
if (minutes == 0) {
minutes = 1;
}
StringBuilder statistics = new StringBuilder("Disconnects: ");
statistics.append(lostConnection.get());
statistics.append(" avg/hour ").append(lostConnection.get() * 60 / minutes);
statistics.append(" Reconnects: ").append(reconnects.get());
statistics.append(" avg/hour ").append(reconnects.get() * 60 / minutes);
return statistics.toString();
}
// private Timer timer = new Timer(1000 * 60, new ActionListener() { // private Timer timer = new Timer(1000 * 60, new ActionListener() {
// public void actionPerformed(ActionEvent e) { // public void actionPerformed(ActionEvent e) {
// reloadMessages(); // reloadMessages();
// } // }
// }); // });
public void setStartDate(long milliseconds) { public void setStartDate(long milliseconds) {
this.startDate = milliseconds; this.startDate = milliseconds;
} }
@ -200,5 +215,18 @@ public class ServerMessagesUtil {
} while (!tournamentsStarted.compareAndSet(value, value + 1)); } while (!tournamentsStarted.compareAndSet(value, value + 1));
} }
public void incReconnects() {
int value;
do {
value = reconnects.get();
} while (!reconnects.compareAndSet(value, value + 1));
}
public void incLostConnection() {
int value;
do {
value = lostConnection.get();
} while (!lostConnection.compareAndSet(value, value + 1));
}
} }