mirror of
https://github.com/correl/mage.git
synced 2024-11-28 19:19:55 +00:00
Added some lost and reconnect statistics to footer data.
This commit is contained in:
parent
55dc0f8b6a
commit
5770dd6014
3 changed files with 64 additions and 29 deletions
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -27,8 +27,6 @@
|
||||||
*/
|
*/
|
||||||
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 {
|
||||||
|
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue