Skip to content

Conditional uploads and ranged downloads on every backend - #34

Open
theomonnom wants to merge 2 commits into
mainfrom
conditional-and-ranged
Open

theomonnom wants to merge 2 commits into
mainfrom
conditional-and-ranged

Conversation

@theomonnom

@theomonnom theomonnom commented Sep 20, 2026

Copy link
Copy Markdown
Member
  • UploadDataIfAbsent, UploadFileIfAbsent, DownloadRange(ctx, ...) on Storage, implemented by every backend: S3 If-None-Match, GCS DoesNotExist precondition, Azure ETag condition, OSS forbid-overwrite, local O_EXCL
  • ErrNotFound, ErrObjectExists wrapped into every backend's errors (404, 412, 409 as each service reports them), so callers use errors.Is
  • ConditionalUploader and RangeDownloader remain as the named subsets
  • New methods take a context.Context; the older ones keep their shape
  • Tests: shared suite on local, and on any S3 endpoint via S3_* env (passes on MinIO); GCS, Azure and OSS compile against their SDKs and follow the same suite once their env is set

ConditionalUploader adds UploadDataIfAbsent and UploadFileIfAbsent: the
object is written only when none is there, with S3's If-None-Match on the
put and on the multipart completion, and O_EXCL on local storage.
RangeDownloader adds DownloadRange for part of an object. Both take a
context. ErrNotFound and ErrObjectExists are wrapped into the backend
errors for those outcomes, so callers decide with errors.Is. S3 and local
implement both; the other backends are unchanged.
@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.


Théo Monnom seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.
You have signed the CLA already but the status is still pending? Let us recheck it.

UploadDataIfAbsent, UploadFileIfAbsent and DownloadRange join Storage
rather than sitting in optional interfaces two backends offered: S3 uses
If-None-Match, GCS a DoesNotExist precondition, Azure an ETag condition,
OSS forbid-overwrite, local storage O_EXCL. Every backend wraps its
not-found and already-exists outcomes in ErrNotFound and ErrObjectExists.
ConditionalUploader and RangeDownloader remain as the named subsets.
@theomonnom theomonnom changed the title Conditional uploads, ranged downloads and error sentinels Conditional uploads and ranged downloads on every backend Sep 21, 2026
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