Large improvements to server stability

This commit is contained in:
ceikry 2021-07-30 10:49:49 -05:00
parent 88cca3dea8
commit d618239e0a
9 changed files with 67 additions and 86 deletions

View file

@ -1,54 +1,33 @@
package core.game.system.task; package core.game.system.task
import java.util.concurrent.Executors; import kotlinx.coroutines.GlobalScope
import java.util.concurrent.ScheduledExecutorService; import kotlinx.coroutines.launch
/** /**
* A class holding methods to execute tasks. * A class holding methods to execute tasks.
* @author Emperor * @author Emperor
*/ */
public final class TaskExecutor { object TaskExecutor {
/** /**
* The executor to use. * Executes an SQL handling task.
*/ * @param task The task.
private static final ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor(); */
@JvmStatic
fun executeSQL(task: () -> Unit) {
GlobalScope.launch {
task.invoke()
}
}
/** /**
* The SQL task executor. * Executes the task.
*/ * @param task The task to execute.
private static final ScheduledExecutorService SQL_EXECUTOR = Executors.newSingleThreadScheduledExecutor(); */
@JvmStatic
/** fun execute(task: () -> Unit) {
* Constructs a new {@code TaskExecutor} {@code Object}. GlobalScope.launch {
*/ task.invoke()
private TaskExecutor() { }
/* }
* empty.
*/
}
/**
* Executes an SQL handling task.
* @param task The task.
*/
public static void executeSQL(Runnable task) {
SQL_EXECUTOR.execute(task);
}
/**
* Executes the task.
* @param task The task to execute.
*/
public static void execute(Runnable task) {
EXECUTOR.execute(task);
}
/**
* Gets the executor.
* @return The executor.
*/
public static ScheduledExecutorService getExecutor() {
return EXECUTOR;
}
} }

View file

@ -10,6 +10,7 @@ import core.gui.ConsoleFrame;
import core.gui.ConsoleTab; import core.gui.ConsoleTab;
import core.tools.PlayerLoader; import core.tools.PlayerLoader;
import core.tools.StringUtils; import core.tools.StringUtils;
import kotlin.Unit;
import javax.swing.*; import javax.swing.*;
import javax.swing.border.EtchedBorder; import javax.swing.border.EtchedBorder;
@ -417,6 +418,7 @@ public final class UtilityTab extends ConsoleTab {
populating = true; populating = true;
players.clear(); players.clear();
TaskExecutor.execute(() -> { TaskExecutor.execute(() -> {
Thread.currentThread().setName("Utility Tab");
ConsoleFrame.getInstance().getPlayerTab().getPlayerNames().clear(); ConsoleFrame.getInstance().getPlayerTab().getPlayerNames().clear();
ConsoleFrame.getInstance().getPlayerTab().populatePlayerSearch(); ConsoleFrame.getInstance().getPlayerTab().populatePlayerSearch();
for (String name : ConsoleFrame.getInstance().getPlayerTab().getPlayerNames()) { for (String name : ConsoleFrame.getInstance().getPlayerTab().getPlayerNames()) {
@ -435,6 +437,7 @@ public final class UtilityTab extends ConsoleTab {
populating = false; populating = false;
System.gc(); System.gc();
lblPlayersLoaded.setText("Players loaded: " + players.size()); lblPlayersLoaded.setText("Players loaded: " + players.size());
return Unit.INSTANCE;
}); });
} }

View file

@ -7,6 +7,7 @@ import core.net.EventProducer;
import core.net.IoSession; import core.net.IoSession;
import core.net.NioReactor; import core.net.NioReactor;
import core.net.producer.MSHSEventProducer; import core.net.producer.MSHSEventProducer;
import kotlin.Unit;
import rs09.game.node.entity.player.info.login.LoginParser; import rs09.game.node.entity.player.info.login.LoginParser;
import rs09.game.system.SystemLogger; import rs09.game.system.SystemLogger;
import rs09.game.world.GameWorld; import rs09.game.world.GameWorld;
@ -76,15 +77,13 @@ public final class WorldCommunicator {
return; return;
} }
loginAttempts.put(parser.getDetails().getUsername(), parser); loginAttempts.put(parser.getDetails().getUsername(), parser);
TaskExecutor.executeSQL(new Runnable() { TaskExecutor.executeSQL(() -> {
@Override if (!parser.getDetails().parse()) {
public void run() { parser.getDetails().getSession().write(Response.INVALID_LOGIN_SERVER, true);
if (!parser.getDetails().parse()) { return Unit.INSTANCE;
parser.getDetails().getSession().write(Response.INVALID_LOGIN_SERVER, true);
return;
}
MSPacketRepository.sendPlayerRegistry(parser);
} }
MSPacketRepository.sendPlayerRegistry(parser);
return Unit.INSTANCE;
}); });
} }

View file

@ -8,6 +8,7 @@ import core.game.system.mysql.SQLManager;
import core.game.system.task.TaskExecutor; import core.game.system.task.TaskExecutor;
import core.net.Constants; import core.net.Constants;
import core.net.IoSession; import core.net.IoSession;
import kotlin.Unit;
import rs09.ServerConstants; import rs09.ServerConstants;
import rs09.game.system.SystemLogger; import rs09.game.system.SystemLogger;
import rs09.game.world.GameWorld; import rs09.game.world.GameWorld;
@ -76,19 +77,17 @@ public class AccountRegister extends SQLEntryHandler<RegistryDetails> {
break; break;
} }
System.out.println(username); System.out.println(username);
TaskExecutor.executeSQL(new Runnable() { TaskExecutor.executeSQL(() -> {
@Override try {
public void run() { if (PlayerSQLManager.hasSqlAccount(username, "username")) {
try { response(session, RegistryResponse.NOT_AVAILBLE_USER);
if (PlayerSQLManager.hasSqlAccount(username, "username")) { return Unit.INSTANCE;
response(session, RegistryResponse.NOT_AVAILBLE_USER);
return;
}
response(session, RegistryResponse.SUCCESS);
} catch (SQLException e) {
e.printStackTrace();
} }
response(session, RegistryResponse.SUCCESS);
} catch (SQLException e) {
e.printStackTrace();
} }
return Unit.INSTANCE;
}); });
break; break;
case 36://Register details case 36://Register details
@ -129,21 +128,19 @@ public class AccountRegister extends SQLEntryHandler<RegistryDetails> {
buffer.getInt(); buffer.getInt();
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
final RegistryDetails details = new RegistryDetails(name, SystemManager.getEncryption().hashPassword(password), new Date(year, month, day), country); final RegistryDetails details = new RegistryDetails(name, SystemManager.getEncryption().hashPassword(password), new Date(year, month, day), country);
TaskExecutor.execute(new Runnable() { TaskExecutor.execute(() -> {
@Override try {
public void run() { if (PlayerSQLManager.hasSqlAccount(name, "username")) {
try {
if (PlayerSQLManager.hasSqlAccount(name, "username")) {
response(session, RegistryResponse.CANNOT_CREATE);
return;
}
SQLEntryHandler.write(new AccountRegister(details));
response(session, RegistryResponse.SUCCESS);
} catch (SQLException e) {
e.printStackTrace();
response(session, RegistryResponse.CANNOT_CREATE); response(session, RegistryResponse.CANNOT_CREATE);
return Unit.INSTANCE;
} }
SQLEntryHandler.write(new AccountRegister(details));
response(session, RegistryResponse.SUCCESS);
} catch (SQLException e) {
e.printStackTrace();
response(session, RegistryResponse.CANNOT_CREATE);
} }
return Unit.INSTANCE;
}); });
break; break;
default: default:

View file

@ -340,7 +340,7 @@ class ScriptAPI(private val bot: Player) {
*/ */
fun walkTo(loc: Location){ fun walkTo(loc: Location){
if(!bot.walkingQueue.isMoving) { if(!bot.walkingQueue.isMoving) {
Executors.newSingleThreadExecutor().execute { GlobalScope.launch {
walkToIterator(loc) walkToIterator(loc)
} }
} }
@ -645,7 +645,7 @@ class ScriptAPI(private val bot: Player) {
* @return true if item was successfully bought, false if not. * @return true if item was successfully bought, false if not.
*/ */
fun buyFromGE(bot: Player, itemID: Int, amount: Int){ fun buyFromGE(bot: Player, itemID: Int, amount: Int){
Executors.newSingleThreadExecutor().execute{ GlobalScope.launch {
val offer = GrandExchangeOffer() val offer = GrandExchangeOffer()
offer.itemID = itemID offer.itemID = itemID
offer.sell = false offer.sell = false

View file

@ -100,6 +100,7 @@ class CombatStateIntermediate(val bot: PestControlTestBot2) {
fun randomWalkTo(loc: Location, radius: Int) { fun randomWalkTo(loc: Location, radius: Int) {
if(!bot.walkingQueue.isMoving) { if(!bot.walkingQueue.isMoving) {
Executors.newSingleThreadExecutor().execute { Executors.newSingleThreadExecutor().execute {
Thread.currentThread().name = "RandomWalkToIteratorBot"
var newloc = loc.transform(RandomFunction.random(radius, -radius), var newloc = loc.transform(RandomFunction.random(radius, -radius),
RandomFunction.random(radius, -radius), 0) RandomFunction.random(radius, -radius), 0)
walkToIterator(newloc) walkToIterator(newloc)

View file

@ -15,6 +15,7 @@ object ImmerseWorld {
@JvmStatic @JvmStatic
fun init() { fun init() {
Executors.newSingleThreadExecutor().execute { Executors.newSingleThreadExecutor().execute {
Thread.currentThread().name = "BotSpawner"
immerseSeersAndCatherby() immerseSeersAndCatherby()
immerseLumbridgeDraynor() immerseLumbridgeDraynor()
immerseVarrock() immerseVarrock()

View file

@ -2,9 +2,6 @@ package rs09.game.world.repository
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.node.entity.player.info.login.PlayerParser import core.game.node.entity.player.info.login.PlayerParser
import core.game.system.mysql.SQLEntryHandler
import core.game.system.mysql.impl.HighscoreSQLHandler
import core.game.system.mysql.impl.PlayerLogSQLHandler
import core.game.system.task.TaskExecutor import core.game.system.task.TaskExecutor
import rs09.game.system.SystemLogger import rs09.game.system.SystemLogger
import rs09.game.world.GameWorld import rs09.game.world.GameWorld
@ -71,7 +68,10 @@ class DisconnectionQueue {
return true return true
} }
if (!force) { if (!force) {
TaskExecutor.executeSQL { save(player, true) } TaskExecutor.executeSQL {
Thread.currentThread().name = "PlayerSave SQL"
save(player, true)
}
return true return true
} }
save(player, false) save(player, false)

View file

@ -103,21 +103,22 @@ class LoginReadEvent
session.isaacPair = ISAACPair(inCipher, outCipher) session.isaacPair = ISAACPair(inCipher, outCipher)
session.clientInfo = ClientInfo(displayMode, windowMode, screenWidth, screenHeight) session.clientInfo = ClientInfo(displayMode, windowMode, screenWidth, screenHeight)
val b = buffer val b = buffer
TaskExecutor.executeSQL(Runnable { TaskExecutor.executeSQL {
Thread.currentThread().name = "Login Password Response"
try { try {
val username = StringUtils.longToString(b.long) val username = StringUtils.longToString(b.long)
val password = ByteBufferUtils.getString(b) val password = ByteBufferUtils.getString(b)
val response = PlayerSQLManager.getCredentialResponse(username, password) val response = PlayerSQLManager.getCredentialResponse(username, password)
if (response != Response.SUCCESSFUL) { if (response != Response.SUCCESSFUL) {
session.write(response, true) session.write(response, true)
return@Runnable return@executeSQL
} }
login(PlayerDetails(username, password), session, b, opcode) login(PlayerDetails(username, password), session, b, opcode)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
session.write(Response.COULD_NOT_LOGIN) session.write(Response.COULD_NOT_LOGIN)
} }
}) }
} }
/** /**
@ -138,7 +139,7 @@ class LoginReadEvent
if (WorldCommunicator.isEnabled()) { if (WorldCommunicator.isEnabled()) {
WorldCommunicator.register(parser) WorldCommunicator.register(parser)
} else { } else {
TaskExecutor.executeSQL(parser) TaskExecutor.executeSQL {parser.run()}
} }
} }