Skip to content

A sole voter whose snapshot marker runs ahead of its applied entries (#6111 stale-snapshot floor) has no operator override either #9498

Closed

Description

@robfrank

Follow-up to #9449.

Gap

#9449 adds POST /api/v1/cluster/accept-diverged/{database} (and the gRPC AcceptDivergedDatabase twin), which lifts a per-database quarantine and its per-database read floor on a node that is the sole voter. It deliberately does not touch the node-wide stale-snapshot floor (ArcadeStateMachine.staleSnapshotAppliedFloor, issue #6111), which reinitialize() publishes when the Ratis snapshot marker runs ahead of the entries this node actually applied.

That floor is also part of LocalResyncState.inProgress(), so it keeps /api/v1/ready at 503 and clamps LINEARIZABLE reads. It is lifted only by a successful snapshot download, and triggerSnapshotDownload() / retryUnfilledSnapshotGap() refuse on a leader (it cannot resync from itself). On a one-voter cluster no peer can take leadership, so, as ha-raft/CLAUDE.md says, the wedge is terminal until an operator acts, and there is no operator action short of rebuilding the node.

Why it was out of scope for #9449

#9449 is about the per-database quarantine named by a DivergenceCause. The global floor is a different state with a different owner (the replay position, not a skipped entry), it is not per database, and lifting it means accepting that the whole node may be missing committed entries. That needs its own decision.

Suggested fix

Either extend the #9449 override with a node-wide variant (root-only, sole voter only, audited the same way), or document the terminal state with its recovery procedure. Per the repo rule, a new API needs the HTTP handler, OpenAPI, gRPC/proto parity and the Remote clients together.

Activity

  1. added this to the 26.11.1 milestone on Oct 8, 2026
  2. added
    enhancementNew feature or request
    haHigh availability / replication (Raft)
    on Oct 8, 2026
  3. added
    grpcgRPC wire protocol (grpc/grpc-client/grpcw)
    serverCore server: HTTP API, users, security enforcement
    severity:minorCosmetic, documentation, edge case, or a workaround exists
    on Oct 8, 2026
  4. self-assigned this
    on Oct 9, 2026
  5. robfrank commented on Oct 9, 2026

    @robfrank
    CollaboratorAuthor

    Implemented by #9593. A sole voter held behind the node-wide stale-snapshot read floor (#6111) can now be unstuck by an operator with the new root-only POST /api/v1/cluster/accept-stale-snapshot (also gRPC AcceptStaleSnapshot, and RemoteServer / RemoteGrpcServer clients). It records the node's own position as applied, so the next restart does not raise the floor again, then clears the floor, wakes waiting readers and logs a WARNING audit line. If the write fails, it puts back exactly what it changed and the floor stays. It is refused on a node with peers (409 / FAILED_PRECONDITION), while a download or install is running (409), and when no floor stands (404 / NOT_FOUND). The cluster alert and the sole-voter log line now point to this route.

    Still open:


    ❤️ Thanks for helping make ArcadeDB better! ArcadeDB is free and open source, sustained by its community. If it's useful to you or your company, please consider becoming a sponsor to keep development going.

  6. removed
    in progressThe team is actively working on this issue
    on Oct 9, 2026
  7. added a commit that references this issue on Oct 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestgrpcgRPC wire protocol (grpc/grpc-client/grpcw)haHigh availability / replication (Raft)serverCore server: HTTP API, users, security enforcementseverity:minorCosmetic, documentation, edge case, or a workaround exists

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions