Ethan-Xingyue opened a new issue, #1175: URL: https://github.com/apache/incubator-seata-go/issues/1175
## 🚀 Go Version go1.24.3 darwin/arm64 (CI: 1.20.14) ## 📦 Seata-go Version master, commit 3bf73586af81db1bd428982c93d82000d80cb1c8 (fetched 2026-09-02) ## 💾 Operating System macOS ## 📝 Bug Description `.github/workflows/unit-test.yml` runs `go test -v ./... -race ...` on Go 1.20.14 only, via `actions/setup-go@v3`: https://github.com/apache/incubator-seata-go/blob/3bf73586af81db1bd428982c93d82000d80cb1c8/.github/workflows/unit-test.yml#L36-L66 Running the same race test on a current toolchain crashes. `TestGrpcGlobalTransactionBegin` patches methods of the `GetGrpcRemotingClient()` singleton with `gomonkey.ApplyMethod` (https://github.com/apache/incubator-seata-go/blob/3bf73586af81db1bd428982c93d82000d80cb1c8/pkg/tm/transaction/grpc/grpc_global_transaction_test.go#L122-L133): - On go1.24.3 darwin/arm64 with `-race`, the first three cases log their expected errors and the test process then dies with `unexpected fault address ... fatal error: fault [signal SIGBUS]` at `grpc_global_transaction_test.go:133`. - On go1.25.5 the failure was observed as a nil pointer dereference inside the real `channelManager` after a patch silently stopped applying (reported by a separate audit run, not re-verified here). - Without `-race` the same test passes on go1.24.3 (`ok seata.apache.org/seata-go/v2/pkg/tm/transaction/grpc 1.440s`). Root cause: the tests rely on rewriting machine code of methods at runtime. Race instrumentation and newer compilers change inlining and code layout, so the patches either crash or silently stop applying and the test falls through to the real, uninitialised gRPC remoting/channel manager. `-gcflags=all=-l` hides the problem but cannot be a permanent CI setting. This blocks moving CI off Go 1.20 (see #1154) and makes the test seam untrustworthy. Related: #479. Suggested priority: P1 (blocks the toolchain upgrade; not a proven production race). ## 🔄 Steps to Reproduce ```bash git clone https://github.com/apache/incubator-seata-go.git cd incubator-seata-go git checkout 3bf73586af81db1bd428982c93d82000d80cb1c8 go version go test -race -run '^TestGrpcGlobalTransactionBegin$' -count=1 ./pkg/tm/transaction/grpc go test -run '^TestGrpcGlobalTransactionBegin$' -count=1 ./pkg/tm/transaction/grpc # passes ``` ## ✅ Expected Behavior The test passes reliably on current stable and oldstable Go, with and without `-race`, and does not depend on whether runtime code patching survives compiler changes. ## ❌ Actual Behavior go1.24.3 darwin/arm64, `-race` (excerpt; the three ERROR log lines from the first cases are omitted): ```text unexpected fault address 0xc00004cf60 fatal error: fault [signal SIGBUS: bus error code=0x1 addr=0xc00004cf60 pc=0xc00004cf60] ... goroutine 5 gp=0xc0003c3340 m=0 mp=0x1016a1cc0 [running]: runtime.throw({0x100d56c65?, 0x100c9766c?}) /opt/homebrew/Cellar/go/1.24.3/libexec/src/runtime/panic.go:1101 +0x38 fp=0xc0003d94d0 sp=0xc0003d94a0 pc=0x10036f268 runtime.sigpanic() /opt/homebrew/Cellar/go/1.24.3/libexec/src/runtime/signal_unix.go:922 +0x170 fp=0xc0003d9530 sp=0xc0003d94d0 pc=0x100371770 seata.apache.org/seata-go/v2/pkg/tm/transaction/grpc_test.TestGrpcGlobalTransactionBegin(0xc0003c36c0) <checkout>/pkg/tm/transaction/grpc/grpc_global_transaction_test.go:133 +0x6b0 fp=0xc0003d9ec0 sp=0xc0003d9540 pc=0x100c986b0 testing.tRunner(0xc0003c36c0, 0x1010850c8) ... FAIL seata.apache.org/seata-go/v2/pkg/tm/transaction/grpc 1.443s FAIL ``` ## 💡 Possible Solution - Replace `gomonkey.ApplyMethod` on the remoting singleton with an injectable `RemotingClient` interface or fake; use `-gcflags=all=-l` only as a temporary bridge while migrating. - Upgrade the workflow to a maintained `actions/setup-go` and a stable/oldstable Go matrix. - Migrate this test first, then converge the remaining monkey patches package by package; do not bundle large production refactors into the same PR. Acceptance criteria: - [ ] The command above passes 20 consecutive runs on stable and oldstable Go, with and without `-race`. - [ ] The test does not need `-gcflags=all=-l` and does not touch the real network or channel singleton. - [ ] CI action and Go matrix are upgraded; the matrix matches the minimum Go version stated in the README. - [ ] Any remaining full-suite race failures are classified as real race / test seam / business bug, each with an owner or a separate issue. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
