More draft stability (#9718)

This commit is contained in:
sprangg 2022-11-25 18:44:14 +02:00 committed by GitHub
parent 3a036fe52a
commit 0627dc4640
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 4 deletions

View file

@ -304,7 +304,9 @@
countdown.start(); countdown.start();
} }
SessionHandler.setBoosterLoaded(draftId); // confirm to the server that the booster has been loaded if (!draftBooster.isEmptyGrid()) {
SessionHandler.setBoosterLoaded(draftId); // confirm to the server that the booster has been successfully loaded, otherwise the server will re-send the booster
}
} }
private void loadCardsToPickedCardsArea(SimpleCardsView pickedCards) { private void loadCardsToPickedCardsArea(SimpleCardsView pickedCards) {

View file

@ -31,6 +31,7 @@ public class DraftSession {
protected final Draft draft; protected final Draft draft;
protected boolean killed = false; protected boolean killed = false;
protected UUID markedCard; protected UUID markedCard;
protected int timeoutCardNum; // the pick number for which the current timeout has been set up
private ScheduledFuture<?> futureTimeout; private ScheduledFuture<?> futureTimeout;
protected final ScheduledExecutorService timeoutExecutor; protected final ScheduledExecutorService timeoutExecutor;
@ -79,6 +80,7 @@ public class DraftSession {
public void pickCard(int timeout) { public void pickCard(int timeout) {
if (!killed) { if (!killed) {
setupTimeout(timeout); setupTimeout(timeout);
timeoutCardNum = draft.getCardNum();
managerFactory.userManager() managerFactory.userManager()
.getUser(userId) .getUser(userId)
.ifPresent(user -> user.fireCallback(new ClientCallback(ClientCallbackMethod.DRAFT_PICK, draft.getId(), .ifPresent(user -> user.fireCallback(new ClientCallback(ClientCallbackMethod.DRAFT_PICK, draft.getId(),
@ -91,7 +93,16 @@ public class DraftSession {
cancelTimeout(); cancelTimeout();
if (seconds > 0) { if (seconds > 0) {
futureTimeout = timeoutExecutor.schedule( futureTimeout = timeoutExecutor.schedule(
() -> managerFactory.draftManager().timeout(draft.getId(), userId), () -> {
try {
if (timeoutCardNum == draft.getCardNum()) {
managerFactory.draftManager().timeout(draft.getId(), userId);
setupTimeout(1); // The timeout keeps happening at a 1 second interval to make sure that the draft moves onto the next pick
}
} catch (Exception e) {
logger.fatal("DraftSession error - userId " + userId + " draftId " + draft.getId(), e);
}
},
seconds, TimeUnit.SECONDS seconds, TimeUnit.SECONDS
); );
} }
@ -113,7 +124,6 @@ public class DraftSession {
} }
public DraftPickView sendCardPick(UUID cardId, Set<UUID> hiddenCards) { public DraftPickView sendCardPick(UUID cardId, Set<UUID> hiddenCards) {
cancelTimeout();
if (draft.addPick(playerId, cardId, hiddenCards)) { if (draft.addPick(playerId, cardId, hiddenCards)) {
return getDraftPickView(0); return getDraftPickView(0);
} }

View file

@ -8,6 +8,7 @@ import mage.game.events.*;
import mage.game.events.TableEvent.EventType; import mage.game.events.TableEvent.EventType;
import mage.players.Player; import mage.players.Player;
import mage.players.PlayerList; import mage.players.PlayerList;
import org.apache.log4j.Logger;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
@ -20,6 +21,8 @@ import java.util.concurrent.TimeUnit;
*/ */
public abstract class DraftImpl implements Draft { public abstract class DraftImpl implements Draft {
protected static final Logger logger = Logger.getLogger(DraftImpl.class);
protected final UUID id; protected final UUID id;
protected final Map<UUID, DraftPlayer> players = new LinkedHashMap<>(); protected final Map<UUID, DraftPlayer> players = new LinkedHashMap<>();
protected final PlayerList table = new PlayerList(); protected final PlayerList table = new PlayerList();
@ -225,7 +228,7 @@ public abstract class DraftImpl implements Draft {
synchronized (this) { synchronized (this) {
while (!donePicking()) { while (!donePicking()) {
try { try {
this.wait(); this.wait(10000); // checked every 10s to make sure the draft moves on
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
} }
} }
@ -245,6 +248,7 @@ public abstract class DraftImpl implements Draft {
boosterLoadingCounter++; boosterLoadingCounter++;
} }
} catch (Exception ex) { } catch (Exception ex) {
logger.fatal("Fatal boosterLoadingHandle error in draft " + id + " pack " + boosterNum + " pick " + cardNum, ex);
} }
}, 0, BOOSTER_LOADING_INTERVAL, TimeUnit.SECONDS); }, 0, BOOSTER_LOADING_INTERVAL, TimeUnit.SECONDS);
} }