Skip to content

A Flowable job-acquisition race no longer fails whichever test is polling - #7682

Merged
delchev merged 2 commits into
eclipse-dirigible:masterfrom
nedelcho-delchev-tues:issue-7581-it-reliability-coverage
Oct 5, 2026
Merged

delchev merged 2 commits into
eclipse-dirigible:masterfrom
nedelcho-delchev-tues:issue-7581-it-reliability-coverage

Conversation

@nedelcho-delchev-tues

Copy link
Copy Markdown
Contributor

Fixes #7581

Awaitility catches uncaught exceptions from every thread while an await() is running and rethrows them on the test thread, and the framework polls through await() almost everywhere (RestAssuredExecutor, AwaitilityExecutor, IntegrationTest itself). Nothing ever turned that off — there was no dontCatchUncaughtExceptions anywhere in tests/.

So a Flowable async-executor thread that could not lock a timer job failed IntentEmissionCoverageIT on a PR that had touched nothing but generated markup. The stack carried no test frame at all, and Flowable recovers from the contention on its next acquire cycle.

The second option in the issue, taken as narrowly as it reads. IntegrationTest registers one global ignore predicate matching a FlowableOptimisticLockingException raised from ExecuteAsyncRunnable — the one exception type, from the one class that acquires jobs. It is matched by class name, so the test framework keeps no Flowable dependency; that is the only thing it ever needs to know about Flowable.

ConditionAwaiter.uncaughtException consults ConditionSettings.shouldExceptionBeIgnored before storing a throwable, which is the same predicate the condition path uses, so registering it is the whole change — catchUncaughtExceptions stays on. Everything else still fails the test, from any thread, and so does anything thrown inside an await's own condition.

nedelcho-delchev-tues and others added 2 commits October 5, 2026 12:01
…ling

Awaitility catches uncaught exceptions from every thread while an `await()` is
running and rethrows them on the test thread, and the framework polls through
`await()` almost everywhere. So a Flowable async-executor thread that could
not lock a timer job failed `IntentEmissionCoverageIT` on a PR that had
touched nothing but generated markup. The stack carried no test frame at all,
and Flowable recovers from the contention on its next acquire cycle.

`IntegrationTest` registers one global ignore predicate matching exactly that:
a `FlowableOptimisticLockingException` raised from `ExecuteAsyncRunnable`,
matched by class name so the test framework keeps no Flowable dependency.
Awaitility consults the same predicate for an uncaught exception as for one
thrown inside a condition, so the whitelist is the whole change.

Everything else still fails the test, from any thread, and so does anything
thrown inside an await's own condition.

Fixes eclipse-dirigible#7581

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The ANTLR parser sources and the minified Monaco client are build output of
the worktree they were committed from, not part of this change. The formatter
validation rejects them, and they belong to nobody here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@delchev
delchev merged commit 2551a30 into eclipse-dirigible:master Oct 5, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

tests: a Flowable async-executor lock race on a background thread fails whichever IT is inside an Awaitility await

2 participants