Breaking Changes
- Core: construct
MetadatawithMetadataBuilder. Direct constructors, setters, andwith_*methods have been removed;Metadata::user_metadata()now returns a borrowedUserMetadataview. Metadata and frozen operation value blocks must fit withinu16::MAXencoded bytes. - Core:
DeleteInputhas been removed. Pass(String, DeleteOptions)when delete options are required; customIntoDeleteInputimplementations must return that pair. - Core:
Capabilityand the public operation option structs gained fields. Use..Default::default()in struct literals to remain source-compatible. - Core: service conflicts can now return
ErrorKind::Conflict. Conditional failures still returnErrorKind::ConditionNotMatch; update recovery logic that grouped both cases together. - Raw API:
OpCopierhas been merged intoOpCopy. Raw operation mutation methods and directFrom<WriteOptions>,From<DeleteOptions>, andFrom<CopyOptions>conversions have been removed; use capability-awarefrom_optionsconstructors. - Raw API: listed entries now contain finalized
Metadata;raw::oio::Entry::set_modeandmetadata_muthave been removed. The newComposeandRestorevariants also changed implicit numericOperationdiscriminants, which are not a stable contract. - Services:
CloudflareKvConfig,MemcachedConfig, andRedisConfignow useOption<raw::SignedDuration>for publicdefault_ttlfields. - Integrations:
object_store_opendal0.60 andparquet_opendal0.10 useopendal0.59. Update direct OpenDAL dependencies together.
See the core upgrade guide, object_store integration guide, and Parquet integration guide for migration examples.
What's Changed
Added
- feat(bindings/dotnet): add DeleteOptions with delete functions by @Fatorin in #8098
- feat(services/s3): add conditional delete with if-match by @YuangGao in #7607
- feat(bindings/dotnet): support conditional delete with if-match by @Fatorin in #8137
- feat(services/s3): support S3 Express session authentication by @Xuanwo in #8135
- feat(services/s3): support object restoration by @Xuanwo in #8143
- feat(services): support conditional delete for Azure services by @Xuanwo in #8142
- RFC: Add limited read by @Xuanwo in #7945
- feat(services/azdls): support custom credential providers by @zakariya-s in #8030
- feat(core): add conflict error kind by @Xuanwo in #8154
- feat(parquet): expose writer abort by @starpact in #8102
- feat: support if_not_changed preconditions by @Xuanwo in #8156
- feat(services/s3): support Writer::copy_from by @Xuanwo in #8140
- feat(services/gcs-grpc): add GCS gRPC service by @Xuanwo in #8153
- feat(services/gcs): support compose by @Xuanwo in #8191
Changed
- refactor(services/monoiofs): use asyncband channels by @tisonkun in #8126
- refactor(bindings/dotnet): generate capability and service configs from core by @Fatorin in #8146
- refactor(services): standardize error normalization by @Xuanwo in #8174
- refactor!: merge OpCopier into OpCopy by @Xuanwo in #8190
- refactor!: compact metadata and operation arguments by @Xuanwo in #8196
Fixed
- fix(bindings/dotnet): correct stream error kind and if-modified-since test by @Fatorin in #8121
- Reapply "fix(core): deserialize duration config values from strings" by @erickguan in #8123
- fix: Canonicalize HuggingFace IDs to avoid inconsistent API by @mhambre in #8108
- fix(services/goosefs): skip CreateDirectory when rename parent already exists by @XuQianJin-Stars in #8129
- fix(services/azblob): carry content type and user metadata on Put Block List by @PDGGK in #8148
- fix(services/memcached): reject a TTL over 30 days by @PDGGK in #8150
- fix(dev): validate integration version bumps by @Xuanwo in #8139
- fix(services/ghac): propagate v2 finalize errors by @fly1d in #8136
- fix(services/hf): cache XET classification and CAS auth tokens by @kszucs in #8106
- fix(core): add missing tokio test features so crates build on their own by @Lstarsky0 in #8103
- fix(ci): use distinct reusable concurrency groups by @jsk1004ha in #8119
- fix(bindings/python): fix sized File.readline by @Xuanwo in #8169
- fix: repair azfile, b2, and conditional read behavior by @Xuanwo in #8175
- fix(core): align conditional missing-target semantics by @Xuanwo in #8172
- fix(bindings): enable gcs-grpc service by @Xuanwo in #8185
- fix: update generated gcs-grpc service docs by @Xuanwo in #8186
- fix(bindings/python): remove greenlet benchmark dependencies by @Xuanwo in #8189
Docs
- docs: add AI-assisted contribution policy by @Xuanwo in #8099
- RFC-8147: write_if_not_changed by @Xuanwo in #8147
- RFC-8145: Distinguish conflicts from unmet conditions by @Xuanwo in #8145
- docs: forbid speculative service changes in agent guidance by @Xuanwo in #8152
- docs: clarify helper function guidelines by @Xuanwo in #8155
- docs: establish OpenDAL specifications by @Xuanwo in #8183
- docs: add RFC for whole-object composition by @Xuanwo in #8188
- RFC: Compact metadata and operation arguments by @Xuanwo in #8194
CI
Chore
- chore(services/hf): bump hf-xet to 1.6.0 by @kszucs in #8113
- chore(services/ftp): upgrade suppaftp to 10 and switch to tokio by @Xuanwo in #8184
New Contributors
- @fly1d made their first contribution in #8136
- @zakariya-s made their first contribution in #8030
- @Lstarsky0 made their first contribution in #8103
- @starpact made their first contribution in #8102
- @bavardage made their first contribution in #8162
- @jsk1004ha made their first contribution in #8119
Full Changelog: v0.58.2...v0.59.0