Skip to content

actioncollections: archiveGivenActionCollection swallows child action errors - orphaned NewAction documents accumulate in MongoDB #42116

Description

@harsh4vardhan

Bug Description

�rchiveGivenActionCollection iterates child JS actions and calls �rchiveGivenNewAction on each. Errors from that call are caught and swallowed via onErrorResume(throwable -> Mono.empty()). The parent ActionCollection is then archived unconditionally, regardless of how many child actions actually failed. Failed child actions remain as orphaned NewAction documents in MongoDB.

Affected file

�pp/server/appsmith-server/src/main/java/com/appsmith/server/actioncollections/base/ActionCollectionServiceCEImpl.java, lines 443-465:

java return unpublishedJsActionsFlux .mergeWith(publishedJsActionsFlux) .flatMap(toArchive -> newActionService .archiveGivenNewAction(toArchive) .onErrorResume(throwable -> { log.debug("Failed to delete action ..."); log.error(throwable.getMessage()); return Mono.empty(); // action NOT archived, error silently dropped })) .collectList() ... .then(repository.archive(actionCollection).thenReturn(actionCollection)); // archived regardless

The same pattern exists in deleteUnpublishedActionCollection at lines 310-323.

Failure scenario

  1. User deletes a JS query collection containing 5 actions.
  2. �rchiveGivenNewAction fails for action 3 (transient MongoDB error).
  3. The error is logged but swallowed - action 3 remains in the
    ewAction collection.
  4. The parent ActionCollection is archived.
  5. Action 3 is now orphaned: invisible in the UI, unreachable through normal delete flows, but still returned by indByCollectionId queries and counted in analytics/audit logs.
  6. Over time these orphaned documents accumulate, inflating collection sizes and causing phantom results in action queries.

Fix

Propagate the error instead of swallowing it, or collect failures and surface them after the bulk operation:

java .flatMap(toArchive -> newActionService .archiveGivenNewAction(toArchive) .onErrorMap(throwable -> new AppsmithException( AppsmithError.REPOSITORY_SAVE_FAILED, toArchive.getId(), throwable.getMessage() )))

If partial failure is acceptable, collect failed IDs and return them in the response so callers can retry or surface the information to users.

Environment

Appsmith elease branch (2026-08-13), Java/Spring WebFlux, MongoDB.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions