Skip to content

Commit

Permalink
Improve thread flow
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexProgrammerDE committed Feb 20, 2024
1 parent 557fc09 commit 8f95467
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,12 @@
import javax.inject.Inject;
import lombok.extern.slf4j.Slf4j;
import net.pistonmaster.soulfire.client.gui.GUIManager;
import net.pistonmaster.soulfire.client.gui.LogPanel;
import net.pistonmaster.soulfire.util.BuiltinSettingsConstants;

@Slf4j
public class DeveloperPanel extends NavigationItem {
@Inject
public DeveloperPanel(GUIManager guiManager, LogPanel logPanel, CardsContainer cardsContainer) {
public DeveloperPanel(GUIManager guiManager, CardsContainer cardsContainer) {
setLayout(new GridBagLayout());

GeneratedPanel.addComponents(
Expand Down
24 changes: 15 additions & 9 deletions src/main/java/net/pistonmaster/soulfire/server/AttackManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
Expand All @@ -53,6 +53,7 @@
import net.pistonmaster.soulfire.server.api.event.attack.AttackStartEvent;
import net.pistonmaster.soulfire.server.protocol.BotConnection;
import net.pistonmaster.soulfire.server.protocol.BotConnectionFactory;
import net.pistonmaster.soulfire.server.protocol.ExecutorManager;
import net.pistonmaster.soulfire.server.protocol.netty.ResolveUtil;
import net.pistonmaster.soulfire.server.protocol.netty.SFNettyHelper;
import net.pistonmaster.soulfire.server.settings.AccountSettings;
Expand Down Expand Up @@ -82,7 +83,8 @@ public class AttackManager {
throw new IllegalStateException("This event handler only accepts attack events");
}
});
private final List<BotConnection> botConnections = new CopyOnWriteArrayList<>();
private final Map<UUID, BotConnection> botConnections = new ConcurrentHashMap<>();
private final ExecutorManager executorManager = new ExecutorManager("SoulFire-Attack-" + id);
private final SoulFireServer soulFireServer;
@Setter private AttackState attackState = AttackState.STOPPED;

Expand Down Expand Up @@ -198,6 +200,7 @@ public CompletableFuture<?> start(SettingsHolder settingsHolder) {
factories.add(
new BotConnectionFactory(
this,
UUID.randomUUID(),
targetAddress.orElseThrow(
() -> new IllegalStateException("Could not resolve address")),
settingsHolder,
Expand All @@ -223,7 +226,7 @@ public CompletableFuture<?> start(SettingsHolder settingsHolder) {

// Used for concurrent bot connecting
var connectService =
Executors.newFixedThreadPool(settingsHolder.get(BotSettings.CONCURRENT_CONNECTS));
executorManager.newFixedExecutorService(settingsHolder.get(BotSettings.CONCURRENT_CONNECTS), null, "Connect");

return CompletableFuture.runAsync(
() -> {
Expand All @@ -244,7 +247,7 @@ public CompletableFuture<?> start(SettingsHolder settingsHolder) {

logger.debug("Connecting bot {}", factory.minecraftAccount().username());
var botConnection = factory.prepareConnection();
botConnections.add(botConnection);
botConnections.put(botConnection.connectionId(), botConnection);

try {
botConnection.connect().get();
Expand Down Expand Up @@ -274,14 +277,17 @@ public CompletableFuture<?> stop() {
}

private void stopInternal() {
logger.info("Shutting down attack executor");
executorManager.shutdownAll();

logger.info("Disconnecting bots");
do {
var eventLoopGroups = new HashSet<EventLoopGroup>();
var disconnectFuture = new ArrayList<CompletableFuture<?>>();
for (var botConnection : List.copyOf(botConnections)) {
disconnectFuture.add(botConnection.gracefulDisconnect());
eventLoopGroups.add(botConnection.session().eventLoopGroup());
botConnections.remove(botConnection);
for (var entry : Map.copyOf(botConnections).entrySet()) {
disconnectFuture.add(entry.getValue().gracefulDisconnect());
eventLoopGroups.add(entry.getValue().session().eventLoopGroup());
botConnections.remove(entry.getKey());
}

logger.info("Waiting for all bots to fully disconnect");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ public void postConstruct() {
forEveryAttackEnsureHasBots(
attackManager -> {
var online = new ArrayList<String>();
for (var bot : attackManager.botConnections()) {
for (var bot : attackManager.botConnections().values()) {
if (!bot.isOnline()) {
continue;
}
Expand Down Expand Up @@ -377,7 +377,7 @@ public void postConstruct() {
log.info("Total bots: {}", attackManager.botConnections().size());
long readTraffic = 0;
long writeTraffic = 0;
for (var bot : attackManager.botConnections()) {
for (var bot : attackManager.botConnections().values()) {
var trafficShapingHandler = bot.getTrafficHandler();

if (trafficShapingHandler == null) {
Expand All @@ -399,7 +399,7 @@ public void postConstruct() {

long currentReadTraffic = 0;
long currentWriteTraffic = 0;
for (var bot : attackManager.botConnections()) {
for (var bot : attackManager.botConnections().values()) {
var trafficShapingHandler = bot.getTrafficHandler();

if (trafficShapingHandler == null) {
Expand Down Expand Up @@ -500,7 +500,7 @@ private int forEveryBot(ToIntFunction<BotConnection> consumer) {
return forEveryAttackEnsureHasBots(
attackManager -> {
var resultCode = Command.SINGLE_SUCCESS;
for (var bot : attackManager.botConnections()) {
for (var bot : attackManager.botConnections().values()) {
log.info(
"--- Running command for bot {} ---", bot.meta().minecraftAccount().username());
var result = consumer.applyAsInt(bot);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@
*/
package net.pistonmaster.soulfire.server.plugins;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
Expand All @@ -34,8 +32,6 @@
import net.pistonmaster.soulfire.server.util.RandomUtil;

public class AutoReconnect implements InternalExtension {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

@EventHandler
public static void onSettingsManagerInit(SettingsRegistryInitEvent event) {
event.settingsRegistry().addClass(AutoReconnectSettings.class, "Auto Reconnect");
Expand All @@ -55,31 +51,33 @@ public void onDisconnect(BotDisconnectedEvent event) {
return;
}

scheduler.schedule(
() -> {
var eventLoopGroup = connection.session().eventLoopGroup();
if (eventLoopGroup.isShuttingDown()
|| eventLoopGroup.isShutdown()
|| eventLoopGroup.isTerminated()) {
return;
}
connection
.attackManager()
.executorManager()
.newScheduledExecutorService(connection, "Reconnect")
.schedule(
() -> {
var eventLoopGroup = connection.session().eventLoopGroup();
if (eventLoopGroup.isShuttingDown()
|| eventLoopGroup.isShutdown()
|| eventLoopGroup.isTerminated()) {
return;
}

connection.gracefulDisconnect().join();
var newConnection = connection.factory().prepareConnection();
connection.gracefulDisconnect().join();
var newConnection = connection.factory().prepareConnection();

connection
.attackManager()
.botConnections()
.replaceAll(
connectionEntry ->
connectionEntry == connection ? newConnection : connectionEntry);
connection
.attackManager()
.botConnections()
.put(connection.connectionId(), newConnection);

newConnection.connect();
},
RandomUtil.getRandomInt(
settingsHolder.get(AutoReconnectSettings.DELAY.min()),
settingsHolder.get(AutoReconnectSettings.DELAY.max())),
TimeUnit.SECONDS);
newConnection.connect();
},
RandomUtil.getRandomInt(
settingsHolder.get(AutoReconnectSettings.DELAY.min()),
settingsHolder.get(AutoReconnectSettings.DELAY.max())),
TimeUnit.SECONDS);
}

@NoArgsConstructor(access = AccessLevel.PRIVATE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@

public record BotConnectionFactory(
AttackManager attackManager,
UUID botConnectionId,
ResolveUtil.ResolvedAddress resolvedAddress,
SettingsHolder settingsHolder,
Logger logger,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,18 @@ public ExecutorService newExecutorService(BotConnection botConnection, String th
return executor;
}

public ExecutorService newFixedExecutorService(int threadAmount, BotConnection botConnection, String threadName) {
if (shutdown) {
throw new IllegalStateException("Cannot create new executor after shutdown!");
}

var executor = Executors.newFixedThreadPool(threadAmount, getThreadFactory(botConnection, threadName));

executors.add(executor);

return executor;
}

public ExecutorService newCachedExecutorService(BotConnection botConnection, String threadName) {
if (shutdown) {
throw new IllegalStateException("Cannot create new executor after shutdown!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ public Entity getClosestEntity(
}

if (ignoreBots
&& dataManager.connection().attackManager().botConnections().stream()
&& dataManager.connection().attackManager().botConnections().values().stream()
.anyMatch(
b -> {
if (b.sessionDataManager().clientEntity() == null) {
Expand Down

0 comments on commit 8f95467

Please sign in to comment.