Compare commits

...
Author SHA1 Message Date
adminandClaude Opus 4.5 209ee63d84 Add logging to diagnose stuck LLM requests
Logs each unrequested text being processed with its type, ID,
eagleGameId (in both decimal and hex), and requestedAfterHistoryCount.
Also logs the result of each request (submitted, bypassed, deferred,
or waiting on dependency).

This helps diagnose why certain LLM requests are repeatedly triggering
disk loads for old game states.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 10:25:04 -08:00
2 changed files with 34 additions and 2 deletions
@@ -581,6 +581,7 @@ scala_library(
deps = [
":llm_resolver",
"//src/main/scala/net/eagle0/common:functional_random",
"//src/main/scala/net/eagle0/common:simple_timed_logger",
"//src/main/scala/net/eagle0/eagle:eagle_pkg",
"//src/main/scala/net/eagle0/eagle/client_text",
"//src/main/scala/net/eagle0/eagle/client_text:client_text_store",
@@ -1,6 +1,6 @@
package net.eagle0.eagle.service
import net.eagle0.common.SeededRandom
import net.eagle0.common.{SeededRandom, SimpleTimedLogger}
import net.eagle0.eagle.client_text.{ClientTextStore, IncompleteClientText}
import net.eagle0.eagle.library.{EagleInternalException, GameHistory}
import net.eagle0.eagle.library.util.hero_name_fetcher.HeroNameFetcher
@@ -89,6 +89,13 @@ class UnrequestedTextHandler(llmResolver: LlmResolver) {
val llmRequestsWithGameStates =
llmRequests.map { ut =>
val requestType = ut.llmRequest.getClass.getSimpleName
val gameIdHex = f"0x${ut.llmRequest.eagleGameId}%016x"
SimpleTimedLogger.printLogger.logLine(
s"Processing unrequested text: id=${ut.id}, type=$requestType, " +
s"eagleGameId=${ut.llmRequest.eagleGameId} ($gameIdHex), " +
s"requestedAfterHistoryCount=${ut.requestedAfterHistoryCount}"
)
LlmResolver.LlmRequestWithGameState(
llmRequest = ut.llmRequest,
gameState = gameHistory.stateAfter(ut.requestedAfterHistoryCount)
@@ -111,25 +118,44 @@ class UnrequestedTextHandler(llmResolver: LlmResolver) {
)
) {
case (acc, (llmRequest, llmResolverResult)) =>
val requestType = llmRequest.getClass.getSimpleName
llmResolverResult match {
case LlmResolverRequested(_) =>
SimpleTimedLogger.printLogger.logLine(
s"LLM request submitted: id=${llmRequest.requestId}, type=$requestType"
)
Accumulator(
clientTextStore = acc.clientTextStore
.withMarkedRequested(llmRequest.requestId),
acc.stuckEntries
)
case LlmResolverBypassed =>
SimpleTimedLogger.printLogger.logLine(
s"LLM request bypassed: id=${llmRequest.requestId}, type=$requestType"
)
Accumulator(
clientTextStore = acc.clientTextStore.withBypassed(llmRequest.requestId),
acc.stuckEntries
)
case LlmResolverTooManyRequestsInFlight =>
SimpleTimedLogger.printLogger.logLine(
s"LLM request deferred (too many in flight): id=${llmRequest.requestId}, type=$requestType"
)
acc
case LlmResolverGameDeleted =>
// Game was deleted (e.g., warmup game during blue-green deployment)
// Just skip the request - it will be cleaned up when the game's data is deleted
val gameIdHex = f"0x${llmRequest.eagleGameId}%016x"
SimpleTimedLogger.printLogger.logLine(
s"LLM request skipped (game deleted): id=${llmRequest.requestId}, type=$requestType, " +
s"eagleGameId=${llmRequest.eagleGameId} ($gameIdHex)"
)
acc
case LlmResolverDependencyNotSatisfied(unsatisfiedTextId) =>
SimpleTimedLogger.printLogger.logLine(
s"LLM request waiting on dependency: id=${llmRequest.requestId}, type=$requestType, " +
s"waitingOn=$unsatisfiedTextId"
)
acc.copy(stuckEntries =
acc.stuckEntries :+ StuckUnrequested(
llmRequest,
@@ -209,8 +235,13 @@ class UnrequestedTextHandler(llmResolver: LlmResolver) {
s"Moving stalled incomplete text ${llmRequest.requestId} back to unrequested due to unsatisfied dependency"
)
cts.withMovedBackToUnrequested(llmRequest.requestId)
case (cts, (_, LlmResolverGameDeleted)) =>
case (cts, (llmRequest, LlmResolverGameDeleted)) =>
// Game was deleted - just skip, texts will be cleaned up with the game
val gameIdHex = f"0x${llmRequest.eagleGameId}%016x"
SimpleTimedLogger.printLogger.logLine(
s"Incomplete text skipped (game deleted): id=${llmRequest.requestId}, " +
s"eagleGameId=${llmRequest.eagleGameId} ($gameIdHex)"
)
cts
case (cts, _) =>
cts