Skip to content

fix: evaluate activation conditions outside the workflow executor's monitor - #3626

Open
afalhambra-hivemq wants to merge 2 commits into
operator-framework:nextfrom
afalhambra-hivemq:fix/activation-start-outside-monitor-3617
Open

afalhambra-hivemq wants to merge 2 commits into
operator-framework:nextfrom
afalhambra-hivemq:fix/activation-start-outside-monitor-3617

Conversation

@afalhambra-hivemq

@afalhambra-hivemq afalhambra-hivemq commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Moves the activation condition evaluation and the event source register/deregister out of handleReconcile and into NodeReconcileExecutor, so the blocking informer sync no longer happens while the executor's monitor is held. The delete and cleanup paths already work this way.

A node whose activation or reconcile precondition does not hold defers its delete cascade to onNodeExecutionFinished, a new hook that runs with the monitor held, right after the node's execution mark is cleared. Work scheduled from there carries its own mark, so reconcile() cannot return while a delete it scheduled is still running.

Two behaviour notes:

  • a throwing activation or reconcile precondition is now recorded against its own dependent rather than its parent, and one on a top-level dependent is aggregated instead of escaping reconcile() raw. This changes getErroredDependents() keys.
  • the informer sync now blocks a workflow pool thread instead of the reconciling thread.

The second commit is unrelated cleanup, happy to drop it.

Fixes #3617

Copilot AI lite review requested due to automatic review settings September 17, 2026 16:58
@openshift-ci
openshift-ci Bot requested review from metacosm and xstefank September 17, 2026 16:58
@coderabbitai

coderabbitai Bot commented Sep 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 01679550-b96f-4b9d-8c96-56e85ab9076f

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@afalhambra-hivemq
afalhambra-hivemq force-pushed the fix/activation-start-outside-monitor-3617 branch from 542a697 to 6313ad4 Compare September 17, 2026 17:04

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Pull request overview

Aligns reconcile execution with delete/cleanup paths by moving activation/precondition evaluation and event source registration out from under the WorkflowReconcileExecutor monitor to reduce blocking while holding the lock.

Changes:

  • Moved activation condition + event source register/deregister into NodeReconcileExecutor.doRun
  • Added unmarkAsExecuting helper to support the “conditions not met” cascade semantics
  • Added a test to ensure activation condition isn’t evaluated on the reconciling thread

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileExecutorTest.java Adds a regression test asserting activation conditions run off the reconciling thread
operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileExecutor.java Moves condition evaluation + event source registration out of the monitor and adjusts “not met” path
operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutor.java Introduces unmarkAsExecuting helper for early execution relinquish

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@afalhambra-hivemq
afalhambra-hivemq marked this pull request as draft September 18, 2026 06:19
@openshift-ci openshift-ci Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Sep 18, 2026
@afalhambra-hivemq
afalhambra-hivemq force-pushed the fix/activation-start-outside-monitor-3617 branch from 6313ad4 to f6da6d7 Compare September 18, 2026 06:51
@afalhambra-hivemq
afalhambra-hivemq marked this pull request as ready for review September 18, 2026 06:51
@openshift-ci openshift-ci Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Sep 18, 2026
@openshift-ci
openshift-ci Bot requested a review from csviri September 18, 2026 06:51
@afalhambra-hivemq
afalhambra-hivemq force-pushed the fix/activation-start-outside-monitor-3617 branch from f6da6d7 to 1ab4887 Compare September 18, 2026 06:51
@afalhambra-hivemq
afalhambra-hivemq requested a lite review from Copilot September 18, 2026 06:51

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

No unresolved blocking issues remain; the test-coverage comment is a minor nit.

Review details

Suppressed comments (1)

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileExecutorTest.java:787

  • The added regression test only rendezvous inside Condition; it never blocks dynamicallyRegisterEventSource or an event source's start(). As a result, the suite would still pass if the registration call were accidentally moved back under the executor monitor, even though that is the blocking operation behind #3617. Please add a test event source whose startup blocks until a second activation-conditioned dependent reaches the same rendezvous.
  void activationConditionsEvaluatedConcurrently() {
    // they can only meet at the barrier if neither of them holds the executor's monitor
    var rendezvousCondition = rendezvousCondition(new CyclicBarrier(2));
  • Files reviewed: 4/4 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

…onitor

Signed-off-by: Antonio Fernandez Alhambra <antonio.alhambra@hivemq.com>
Signed-off-by: Antonio Fernandez Alhambra <antonio.alhambra@hivemq.com>
@afalhambra-hivemq
afalhambra-hivemq force-pushed the fix/activation-start-outside-monitor-3617 branch from 1ab4887 to e8a5562 Compare September 18, 2026 07:51
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.

2 participants