Files
MoonBridge/testing/smoke/results/2026-09-26-initial-login-repeat.md
T
layue13andClaude Opus 5.5 789648c82f refactor: 仓库根目录按用途分组
- proxy/:core、plugin-api、luckperms 及其上游子模块 vendor/luckperms
- messaging/、backend/ 保持在根目录(messaging 是代理与后端共用的 API)
- build-logic/(原 proxy-build-logic)
- testing/:smoke/ 与 benchmarks/,不进入发行物

Gradle 项目名不变(settings.gradle.kts 映射目录),任务路径与 Maven 坐标照旧。
脚本的仓库根定位、文档与记录中的链接同步更新。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 14:34:01 +08:00

28 lines
4.7 KiB
Markdown

# Initial-login EOF repeat on local Uranium
Date: 2026-09-26 (Asia/Shanghai). Windows 11, local loopback, Java 25 proxy and Java 8 Uranium. The smoke starts two fresh Uranium instances, an installed proxy with the external transfer plugin, and a synthetic protocol-5 Forge client. Each run requests old → new → old and checks both backend login logs.
Command per run:
```powershell
.\smoke\local-uranium-transfer.ps1 -BundlePath <Uranium bundle> -InstalledPlugin -ReturnToOld
```
At `a09fc07`, three runs passed and the fourth failed while the probe waited for the **initial Login Success** (`EOFException` at `UraniumTransferProbe.java:72`). The proxy log confirmed that the plugin's placement callback saw `[old, new]`; the old Uranium log had no player login. The failure directory is `build/local-uranium-transfer-4a2cb3e895d14a07bee6cae884c65247` in this workspace. An earlier single run also failed at the same probe line, followed by two successful runs.
The next local build added failure-path DEBUG diagnostics to `Session` and an optional `-DebugSession` flag for this smoke. One validation run, six further runs with success-path DEBUG, and eight runs with only failure-path DEBUG all passed. The added diagnostics did not capture a failing session. These outcomes establish an intermittent initial-login failure in this environment; they do **not** identify a root cause or prove that the logging change fixed it.
If it recurs, run the smoke with `-DebugSession` and inspect `proxy.stdout.log` in the printed run directory for the selected backend, login deadline, channel closure, and any frame-handling exception. The target Forge modpack has not been tested.
Follow-up: a focused test demonstrated that `tcp://127.0.0.1` was submitted to the asynchronous backend resolver as an unresolved address: when the resolver deliberately held the literal IP, Login Success timed out. The connection helper now constructs a resolved socket address for numeric IPs and retains asynchronous resolution for hostnames. The focused test failed before this change and passed afterward; the full `check` and installed DNS/Agent smoke passed. Six fresh Uranium roundtrips with the default logging configuration also passed. This removes an unnecessary DNS dependency for numeric addresses. It does not establish that DNS resolution caused the two earlier EOFs, which remain unresolved until a failing run yields a closing reason.
Another focused test found that the login-stage deadline itself closed the client connection with raw EOF after Login Start. The proxy now sends a Login Disconnect packet with `Login timed out.` before closing when that deadline expires. The test failed with EOF before the change and passed after it. This fixes the timeout response, but it does not identify why the earlier intermittent initial login stopped progressing.
A separate focused test found another raw-EOF path: a backend that accepted the connection and read the login packets could close before Login Success. The proxy now sends `Selected server closed during login.` to the client and releases the pending session. The test failed with EOF before the change and passed afterward. The earlier intermittent case still has no captured backend-close event, so this remains a behavior fix rather than a root-cause claim.
After this change, `./gradlew.bat check --no-daemon` passed and one installed-plugin Uranium roundtrip with `-DebugSession` passed both transfers and backend-log checks. Runtime evidence is in `build/local-uranium-transfer-a41f1bcb359a40ed93629076084753c1` (ignored local directory). One passing run does not establish that the intermittent initial-login failure is gone.
Uranium source review narrows what its logs can prove. `NetHandlerLoginServer.processLoginStart` logs `Login attempt` only when `cauldron.yml` enables `logging.user-login` (default `false`). `ServerConfigurationManager.initializeConnectionToPlayer` writes `logged in with entity id` only after the Forge handshake completes. `NetHandlerHandshakeTCP.onDisconnect` is empty, so an early handshake close may leave no player-specific line. Therefore, the earlier missing `logged in` line proves only that the player did not finish joining; it does not prove that Uranium never accepted the TCP connection or Login Start.
The `-DebugSession` smoke option now enables `logging.user-login` in each copied Uranium configuration, alongside the proxy session DEBUG logger. A fresh installed-plugin roundtrip passed; both backend logs contain `Login attempt`, `Received profile`, and completed-login lines, and both generated `cauldron.yml` files show `user-login: true`. Its local evidence directory is `build/local-uranium-transfer-4ff529545a3d45359a9b4d70efadfc56`. The source bundle is not edited.