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}"/>

Reply via email to