The GitHub Actions job "CI" on grails-core.git/fix/autotimestamp-thread-safety 
has succeeded.
Run started by GitHub user codeconsole (triggered by codeconsole).

Head commit for run:
b0d7fe489d44ae4e266c1f36f2cff55ff4c0fe1b / Scott Murphy Heiberg 
<[email protected]>
Make AutoTimestampEventListener temporary disabling thread-safe

Fixes #14510. The withoutTimestamps, withoutDateCreated and
withoutLastUpdated methods disabled timestamping by mutating the
listener-wide entity maps (capturing each entry and setting it to
Optional.empty()), which is JVM-global state. Overlapping windows on
concurrent threads corrupted each other: a thread leaving its window
re-enabled timestamping for every other thread still inside one, so
historical dateCreated/lastUpdated values were silently overwritten.
An exception inside the closure also left timestamping permanently
disabled because the previous state was restored without try/finally.

Suppression is now tracked per thread: the property-name getters
consult a ThreadLocal holding an all-entities nesting depth plus the
set of entity names disabled by per-class scopes. Each scope only
re-enables the names it added, so nested and overlapping scopes
restore correctly, and try/finally guarantees restoration when the
closure throws. The shared metadata maps are no longer mutated.

Behavioral note: disabling is now scoped to the calling thread;
threads spawned inside the closure are no longer affected. The GORM
auto-timestamping guide documents this.

The spec now exercises the listener through beforeInsert/beforeUpdate
and covers cross-thread isolation, overlapping windows, nested and
overlapping same-class scopes, exception restoration and concurrent
use.

Report URL: https://github.com/apache/grails-core/actions/runs/29069671796

With regards,
GitHub Actions via GitBox

Reply via email to