This is an automated email from the ASF dual-hosted git repository. jungm pushed a commit to branch ee11 in repository https://gitbox.apache.org/repos/asf/tomee-tck.git
commit 135f76ca7eddd6faf692ae74ee13e01b945016ba Author: Markus Jung <[email protected]> AuthorDate: Sun Jul 19 01:36:39 2026 +0200 Rebuild the transactions exclusion baseline from the pristine zip entry The configure-tck step snapshotted ts.jtx.orig from the extracted ts.jtx with copy overwrite=false, so re-runs took the snapshot after an earlier iteration had already appended the exclusions, contaminating the baseline and silently keeping exclusions in a 'none' run. Re-materialize ts.jtx.orig from the distribution zip's single bin/ts.jtx entry every run, then concat. Retitle the failures as cross-request UserTransaction state leakage across pooled servlet requests (leaker/victim pairs), the honest signature from the true no-exclusions baseline and per-area isolation runs. Drop the disproven commit-after-timeout root cause: settransactiontimeout001 passes in isolation when its 30s sleep actually reaches commit(). The three affected areas stay excluded whole because a narrower id list just shifts the victims. --- KNOWN_ISSUES.md | 31 +++++++++++++++------- runner-standalone/README.md | 2 +- runner-standalone/exclusions/transactions.txt | 37 ++++++++++++++++++--------- runner-standalone/transactions/pom.xml | 17 +++++++++--- 4 files changed, 62 insertions(+), 25 deletions(-) diff --git a/KNOWN_ISSUES.md b/KNOWN_ISSUES.md index 1478563..8508bd9 100644 --- a/KNOWN_ISSUES.md +++ b/KNOWN_ISSUES.md @@ -33,7 +33,7 @@ Detail lives next to each runner: | cdi-ee | 1,829 run, 106 F | 79 methods + 27 deploy-failing classes | OpenWebBeans 4.1 build-compatible-extensions gap + EE integration | | el | 361/361 pass (incl. signature test) | — | — | | persistence | 2,135/2,135 pass (incl. signature test) | — | — (standalone/SE vehicle on Plume's EclipseLink) | -| transactions | 49 tests, 40 pass, 9 F (all 3 signature vehicles pass) | 22 test ids (3 client files) | TomEE UserTransaction rollback/timeout state leaks | +| transactions | 49 tests, 40 pass, 9 F (all 3 signature vehicles pass) | 22 test ids (3 client files, whole) | Cross-request UserTransaction state leaks across pooled servlet requests | | jsonp | 197/197 pass (incl. pluggability + signature) | — | — | | jsonb | 295 tests, 1 F + 1 E | 2 tests | 2 Johnzon 2.1.0 gaps | | debugging | passes (4 SMAPs validated) | — | — | @@ -124,14 +124,27 @@ Fixes belong in Apache TomEE (or Tomcat); each removes exclusion entries. 8. **Jakarta Tags TLD registration** — the `jakarta.tags.*` URIs of the replacement Jakarta Tags 3.0 jar are not exposed to applications; all 50 Tags classes plus the EJB-Lite JSP vehicles fail as collateral. -9. **Transactions** — CDI `@Transactional` interceptors fail propagation, - rollback-rule, and `TransactionScoped` assertions; `UserTransaction` - rollback/timeout semantics leak state between requests. Confirmed by the - standalone Transactions 2.0 TCK web vehicles: `commit()` does not throw - after `setTransactionTimeout` expiry, and rollback/`setRollbackOnly` - `IllegalStateException` semantics poison the following request — 22 - entries in - [transactions.txt](runner-standalone/exclusions/transactions.txt). +9. **Transactions — cross-request `UserTransaction` state leakage across + pooled servlet requests.** A `UserTransaction` a servlet/jsp request leaves + in a non-clean state poisons the next request served on the same pooled + Tomcat exec thread; the victim sees an `IllegalStateException` that is not + thrown (or an unexpected exception). It is a leaker/victim pair — the same + test passes in one vehicle and fails in the other, and the failing set + depends on which request lands on which thread. The standalone Transactions + 2.0 TCK web vehicles show it directly (49 tests, 40 pass, 9 fail at the full + baseline; all three signature vehicles pass): the chronologically first + failures land in the `rollback` area, before any `setTransactionTimeout` + call. Run in isolation on a fresh server the `rollback` area passes 10/10 + and `settransactiontimeout` 4/4; `setrollbackonly` passes 7/8, its last + request still a victim of its own prior request. There is no + commit-after-timeout gap — `settransactiontimeout001` sleeps 30s before + `commit()` and, when it reaches that path in isolation, `commit()` throws as + required. Because excluding only the baseline-failing ids just shifts the + victims to other tests in the same areas, the three affected areas are + excluded whole (order-stable, green default run) — 22 entries in + [transactions.txt](runner-standalone/exclusions/transactions.txt). The + Platform catalog additionally shows CDI `@Transactional` interceptors + failing propagation, rollback-rule, and `TransactionScoped` assertions. 10. **Enterprise Beans** — timer callbacks expose incomplete/not-retried transactions, `java:comp` is mutable where the spec requires `OperationNotSupportedException`, and failed CDI/EJB deployments leak diff --git a/runner-standalone/README.md b/runner-standalone/README.md index 13c7b2d..0267d36 100644 --- a/runner-standalone/README.md +++ b/runner-standalone/README.md @@ -68,7 +68,7 @@ derived from; with the default exclusions applied these suites run green. | Enterprise Beans 4.0 Lite | Covered by the Platform TCK catalog (`runner-webprofile`, `ejb30`/`ejb32`) | — | See `runner-webprofile/KNOWN_FAILURES.md` | | Standard Tag Library 3.0 | Covered by the Platform TCK catalog (`tags-tck`) | — | Blocked by the Jakarta Tags TLD registration gap | | Expression Language 6.0 | EFTL zip (installed as `jakarta.tck:jakarta-expression-language-tck:6.0.1`, the jar's own embedded coordinates) | `el` | **Passes 361/361 (no exclusions)** (2026-07-18) against Tomcat's Jasper EL, the implementation every TomEE distribution bundles, in the local JVM: 360 functional tests plus the signature test. The runner supplies the vendor VariableMapper the TCK's `VarMapperELContext` instantiates through the `variable.mapper` porting property (`org.apache. [...] -| Transactions 2.0 | EFTL zip 2.0.1 (JavaTest harness, prebuilt servlet/jsp vehicle WARs) | `transactions` (Maven module) | **Runs: 49 tests, 40 pass, 9 fail; all three signature-test vehicles pass** (2026-07-18). The runner provisions TomEE, predeploys the vehicle WARs (the TCK's `none` deployment handler), and drives JavaTest in the web vehicles; the no-container `standalone` vehicle (RI-local JTA stack) stays out except for the signature test. The 9 failures are TomEE UserTransaction [...] +| Transactions 2.0 | EFTL zip 2.0.1 (JavaTest harness, prebuilt servlet/jsp vehicle WARs) | `transactions` (Maven module) | **Runs: 49 tests, 40 pass, 9 fail; all three signature-test vehicles pass** (2026-07-19). The runner provisions TomEE, predeploys the vehicle WARs (the TCK's `none` deployment handler), and drives JavaTest in the web vehicles; the no-container `standalone` vehicle (RI-local JTA stack) stays out except for the signature test. The 9 failures are cross-request `UserTra [...] | Persistence 3.2 | EFTL zip 3.2.1 (installed as `jakarta.tck:persistence-tck-*`) | `persistence` | **Passes 2,135/2,135 (0 failures, 0 errors, 4 skipped, signature test included, no exclusions)** (2026-07-18) in the TCK's standalone (SE) vehicle against the EclipseLink build bundled in TomEE Plume, on the harness Derby with the TCK schema and stored procedures (`-Dtck.derby.port` overridable). Not a Web Profile certification input; the Platform catalog covers the EE integration half | ## Layout conventions diff --git a/runner-standalone/exclusions/transactions.txt b/runner-standalone/exclusions/transactions.txt index c2a7960..7a5c8dd 100644 --- a/runner-standalone/exclusions/transactions.txt +++ b/runner-standalone/exclusions/transactions.txt @@ -1,18 +1,31 @@ # Jakarta Transactions 2.0 TCK (jakarta-transactions-tck-2.0.1, JavaTest # UserTransaction suite in the servlet and jsp vehicles) against the TomEE -# Plume snapshot, Java 21, 2026-07-18 baseline: 49 tests, 40 pass, 9 fail; -# all three signature-test vehicles pass. The failures are TomEE -# UserTransaction product results (KNOWN_ISSUES.md, product gap -# "Transactions"): commit() does not throw after setTransactionTimeout -# expiry, and rollback/setRollbackOnly IllegalStateException semantics -# leak transaction state into the following request. Because a failing -# test poisons the next test in the same vehicle webapp, the failing set -# shifts with execution order; every test id of the three affected client -# files is excluded so the remaining suite is order-stable. The begin, -# commit, and getstatus areas pass completely and stay in. +# Plume snapshot, Java 21. Full-baseline result (no exclusions): 49 tests, +# 40 pass, 9 fail; all three signature-test vehicles pass. # -# Format: JavaTest jtx exclusion lines (test/path.java#testid), -# appended to the harness ts.jtx by the runner. +# The failures are cross-request UserTransaction state leakage (KNOWN_ISSUES.md +# product gap "Transactions"): a UserTransaction left in a non-clean state by +# one servlet/jsp request poisons the next request served on the same pooled +# Tomcat exec thread, so the victim sees an IllegalStateException that is not +# thrown / an unexpected exception. The leak is a leaker/victim pair: the same +# test that fails in one vehicle passes in the other, and the failing set +# depends on which request lands on which thread. Run in isolation on a fresh +# server, the rollback area passes 10/10 and settransactiontimeout passes 4/4; +# setrollbackonly passes 7/8, its last request (004_from_servlet) still a +# victim of its own prior request. There is no commit-after-timeout gap: +# settransactiontimeout001 sleeps 30s before commit() and, when it actually +# reaches that path in isolation, commit() throws as required and the test +# passes. +# +# Because a failing request poisons the next one in the same webapp, excluding +# only the baseline-failing ids just shifts the victims to other tests in these +# areas (verified: a 9-id list leaves 4 different tests failing). All three +# affected areas are therefore excluded whole so the default run is order- +# stable and green. The begin, commit, and getstatus areas pass completely and +# stay in. +# +# Format: JavaTest jtx exclusion lines (test/path.java#testid; a file-only +# line matches nothing), appended to the harness ts.jtx by the runner. com/sun/ts/tests/jta/ee/usertransaction/rollback/UserRollbackClient.java#testUserRollback001_from_jsp com/sun/ts/tests/jta/ee/usertransaction/rollback/UserRollbackClient.java#testUserRollback001_from_servlet diff --git a/runner-standalone/transactions/pom.xml b/runner-standalone/transactions/pom.xml index a1f495b..fc9d1ab 100644 --- a/runner-standalone/transactions/pom.xml +++ b/runner-standalone/transactions/pom.xml @@ -151,9 +151,20 @@ </macrodef> <!-- Reviewed TomEE known-gap exclusions on top of the TCK's - own exclude list; rebuilt from the pristine copy so - re-runs never accumulate duplicates. --> - <copy file="${tck.home}/bin/ts.jtx" tofile="${tck.home}/bin/ts.jtx.orig" overwrite="false"/> + own exclude list. The pristine baseline (ts.jtx.orig) is + re-materialized from the distribution zip on every run: + ts.jtx in the extracted tree is the file we append to, so + copying it into ts.jtx.orig would snapshot a copy that a + previous iteration already appended to (the exclusions + stack, and a 'none' baseline run silently keeps them). + Unzipping the single pristine entry each time keeps the + baseline honest and re-runs duplicate-free. --> + <delete file="${tck.home}/bin/ts.jtx.orig" quiet="true"/> + <unzip src="${project.build.directory}/jakarta-transactions-tck-${transactions.tck.version}.zip" + dest="${project.build.directory}"> + <patternset><include name="transactions-tck/bin/ts.jtx"/></patternset> + <mapper type="merge" to="transactions-tck/bin/ts.jtx.orig"/> + </unzip> <concat destfile="${tck.home}/bin/ts.jtx" fixlastline="true"> <file file="${tck.home}/bin/ts.jtx.orig"/> <file file="${tck.exclusions.file}"/>
