feat: blob removal — serve /blob/remove, /upload/remove, /blob/abort (FIL-522)#33
Open
frrist wants to merge 3 commits into
Open
feat: blob removal — serve /blob/remove, /upload/remove, /blob/abort (FIL-522)#33frrist wants to merge 3 commits into
frrist wants to merge 3 commits into
Conversation
github.com/fil-forge/libforge aac837a — Space on RemoveArguments plus the /blob/abort (client to upload service, Cause required) and /blob/reject (upload service to storage node) bindings. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…bort (FIL-522) /blob/remove releases a space's claim on an accepted blob: sprue deregisters the space's registration and forwards /blob/remove to every provider holding the blob. /upload/remove composes it over an upload's shards. /blob/abort abandons an in-flight upload of a parked (never-accepted) blob: the provider is recovered from the Cause receipt chain (a parked blob has no registration or acceptance to look up by) and the abort is forwarded as /blob/reject under the provider's registration delegation. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This was referenced Jul 17, 2026
…pted Align with the blob-removal RFC's per-leg commands: the provider-rooted translation of a client /blob/remove is now /blob/release — the piri client gains Release/ReleaseInvocation and the remove handler forwards it. The client-facing /blob/remove and /blob/abort arguments no longer carry the space; it was already read from the invocation subject. Abort now returns the RFC's named failures instead of generic execution errors: a cause that does not resolve to a known /space/blob/add task fails with MissingCause, and a node refusing the translated reject because the space accepted the blob has its BlobAccepted re-surfaced in the abort receipt, so clients can distinguish 'use /blob/remove' from a retryable fault. Both names come from libforge, shared with piri. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Serves the upload-service half of blob removal, aligned with the blob-removal RFC (fil-one/RFC#13):
/blob/remove(subject = the space, args{digest}) — releases a space's claim on an accepted blob: recovers every provider holding it (primary via the registration's receipt chain, plus non-failed replicas), forwards a provider-rooted/blob/release{space, digest}to each (best-effort), and deregisters last so the receipt chain survives for a retry if every forward fails./blob/abort(subject = the space, args{digest, cause}) — abandons a parked (never-accepted) blob: the provider is recovered from the cause's receipt chain and the abort is forwarded as/blob/reject. A cause that doesn't resolve to a known/blob/addtask fails with the named errorMissingCause; a node refusing because the space accepted the blob has itsBlobAcceptedre-surfaced in the abort receipt, so clients can distinguish "use/blob/remove" from a retryable fault. No local state mutates, so aborts are safely retryable./upload/remove(subject = the space, args{root}) — deletes the upload's root→shards index entry only. Shard blobs are the client's per-digest/blob/removedecision (content addressing shares shards between uploads).All handlers are idempotent (unknown/already-removed → success). Named errors come from libforge, shared with piri.
Landing order
fil-forge/libforge#49 (
/blob/releasebinding + named errors; pinned at its branch head, re-pin on merge) → fil-forge/piri#30 (piri serves/blob/release+/blob/reject) → this — the forwards here invoke piri capabilities that only exist on #30.Same chain: fil-forge/smelt#19 (devnet delegations), fil-forge/ingot#40 (S3 surface). Validated end-to-end by ingot's delete-finality and deferred-multipart itests against piri #30 + this branch.
🤖 Generated with Claude Code