github apache/opendal v0.57.0

4 hours ago

Breaking Changes

  • core: Operator::copy, copy_options, copy_with, and blocking copy APIs now return Metadata instead of (). Custom raw copy implementations must implement the new copier flow and return server-side completion metadata from oio::Copy::close.
  • core: RpRead now carries optional Metadata observed while opening a read operation. Out-of-tree raw services that previously populated RpRead size or range fields must return RpRead::new(metadata) when read metadata is available, or RpRead::default() otherwise.
  • core: RetryInterceptor::intercept now takes a single RetryEvent<'_> argument instead of (&Error, Duration). Update custom retry interceptors to read retry error, delay, operation, and attempt data from the event.
  • observability: HTTP metrics now include the service_operation label for service-specific request names. Update Prometheus, OpenTelemetry, fastmetrics, or custom metrics consumers that assume the previous HTTP metric label set.
  • services: S3-compatible services now use skip_signature for unsigned requests. S3, OSS, and GCS keep allow_anonymous as a deprecated alias; TOS users must migrate to skip_signature because allow_anonymous has been removed. GCS skip_signature now unconditionally bypasses signing instead of falling back on credential errors.
  • services/hf: repo_type is now required for the Hugging Face service. Set repo_type explicitly, for example model, dataset, space, or bucket, instead of relying on the previous implicit model default.
  • services/tos: TosBuilder::enable_versioning and TosConfig::enable_versioning have been removed. TOS now declares versioned stat/read/delete capabilities natively.
  • bindings/java: generated ServiceConfig now uses canonical service names. Replace ServiceConfig.Huggingface with ServiceConfig.Hf; generated scheme() values for services such as Aliyun Drive, Cloudflare KV, HDFS Native, Vercel Artifacts, Vercel Blob, and Yandex Disk now return hyphenated canonical schemes instead of underscore variants.

What's Changed

Added

  • feat(bindings/python): add behavior tests for conditional read/write by @TennyZhuang in #7449
  • feat(bindings/python): expose list_with_versions and list_with_deleted in Capability by @TennyZhuang in #7445
  • feat(bindings/python): expose if_not_exists option for copy by @TennyZhuang in #7442
  • feat(bindings/python): expose DeleteOptions version and recursive params by @TennyZhuang in #7443
  • feat(metrics): Add regression test for metrics recording by @dentiny in #7362
  • feat(bindings/nodejs): add Operator.fromUri static factory by @TennyZhuang in #7471
  • feat(bindings/nodejs): add Entry.name getter by @TennyZhuang in #7470
  • feat(bindings/nodejs): add presignDelete method and Capability getter by @TennyZhuang in #7468
  • feat(bindings/dart): add File.read and File.write with error mapping by @TennyZhuang in #7473
  • feat(services/oss): support ECS RAM role credentials by @WenyXu in #7480
  • feat(retry): record more fields in the retry interceptor by @dentiny in #7406
  • feat(metrics): add service operation to metrics label by @dentiny in #7407
  • feat(bindings/python): expose stat_with_if_modified_since, stat_with_if_unmodified_since, stat_with_version in Capability by @TennyZhuang in #7444
  • feat(oss): add operation label for metrics by @dentiny in #7489
  • feat(azure): Add operation label to azure operations by @dentiny in #7488
  • feat(gcs): add service operation in metrics by @dentiny in #7487
  • feat(core): expose metadata access for raw list entries by @ngg in #7493
  • feat(hf): auto-discover token from env and credential file by @kszucs in #7490
  • feat(services/opfs): OPFS backend for OpenDAL by @jccampagne in #7199
  • feat(services/s3): support configuring assume role duration_seconds by @YuangGao in #7495
  • feat(services/goosefs): implement opendal-service-goosefs crate backed by goosefs-sdk by @XuQianJin-Stars in #7428
  • feat(service/tos): impl tos read/write/delete by @ddupg in #7350
  • feat(services/mysql): support list by @fengys1996 in #7076
  • feat(services/s3): support configuring assume role session tags by @YuangGao in #7518
  • feat(services/cos): support copy_with_if_not_exists via x-cos-forbid-… by @mikewhb in #7526
  • feat(core): add split_to and split_off to Buffer by @kimjune01 in #7513
  • feat(bindings/java): Add musl platform support by @Xuanwo in #7087
  • feat(services/azdls): Add user defined metadata support by @YuangGao in #7528
  • feat(binding/c): extract metadata from list entry by @dentiny in #7529
  • feat(binding/golang): expose metadata on list operation by @dentiny in #7534
  • feat(core): add copier api by @Xuanwo in #7527
  • feat(services/azblob): support skip_signature by @YuangGao in #7533
  • feat(services/s3): add multipart copier by @Xuanwo in #7541
  • feat(core): add capability override layer by @Xuanwo in #7520
  • feat(services/gcs): add rewrite copier by @Xuanwo in #7545
  • feat(services/s3): Rename allow_anonymous to skip_signature by @YuangGao in #7544
  • feat(core): Add content length hints for read and copy by @leiysky in #7543
  • feat(services/tos): add list support by @ddupg in #7536
  • feat(services/oss): Rename allow_anonymous to skip_signature by @YuangGao in #7556
  • feat(services/tos): Add native copy support by @ddupg in #7553
  • feat(services/tos): Rename allow_anonymous to skip_signature by @YuangGao in #7566
  • feat(services/gcs): Rename allow_anonymous to skip_signature by @YuangGao in #7567
  • feat(services/azblob): add block copier by @Xuanwo in #7551
  • feat(services/tos): implement stat and multipart upload by @ddupg in #7552
  • feat(services/tos): add versioning support by @ddupg in #7575
  • feat(services/tos): enable shared capability by @ddupg in #7580
  • feat(services/tos): implement copier by @ddupg in #7576
  • feat(services/goosefs): bump goosefs-sdk to 0.1.2 and image to v2.1.0.1 by @XuQianJin-Stars in #7588
  • feat: add reqwest-rustls-no-provider-tls feature by @valkum in #7582
  • feat(services/cos): support cosn scheme and STS security token by @WangXiaoBao1222 in #7418
  • feat(copy): apply timeout to copy operations by @dentiny in #7594
  • feat(copy): add conditional destination copy by @dentiny in #7600
  • feat(s3): validate multipart copy part number by @dentiny in #7585
  • feat(core): return metadata from copy by @Xuanwo in #7606
  • feat: C/Go bindings support layers by @yuchanns in #7611
  • feat(core): return metadata from read by @Xuanwo in #7624
  • feat(core): complete copy_with_if_match implementation by @YuangGao in #7627
  • feat(services/hf): add download_mode option and require explicit repo_type by @kszucs in #7625

Changed

  • refactor(services/s3): complete capability override migration by @Xuanwo in #7546
  • refactor(services/oss): complete capability override migration by @Xuanwo in #7549
  • refactor(services/cos): complete capability override migration by @Xuanwo in #7554
  • refactor(services/tos): remove versioning option by @Xuanwo in #7555
  • refactor(services/onedrive): deprecate versioning option by @Xuanwo in #7558
  • refactor(services/obs): deprecate versioning option by @Xuanwo in #7560
  • refactor(services/azblob): deprecate batch option by @Xuanwo in #7561
  • refactor(services/webdav): deprecate capability toggles by @Xuanwo in #7562
  • refactor(services/hdfs): deprecate append option by @Xuanwo in #7563
  • refactor(services/sftp): deprecate copy option by @Xuanwo in #7568
  • refactor(services/azblob): use OsEnv instead of StaticEnv hack by @YuangGao in #7589

Fixed

  • fix(core): validate range bounds to prevent underflow by @TennyZhuang in #7441
  • fix(bindings/python): add RateLimited and RangeNotSatisfied exception kinds by @TennyZhuang in #7437
  • fix(core): prevent integer overflow in parse_into_range for u64::MAX bounds by @TennyZhuang in #7397
  • fix(layers/concurrent-limit): limit copy and rename by @TennyZhuang in #7452
  • fix(services/ghac): normalize cache URL joins by @TennyZhuang in #7450
  • Revert "fix(services/s3): support write if-none-match" by @dentiny in #7462
  • fix(core): prevent integer overflow/underflow in BytesRange conversions by @TennyZhuang in #7398
  • fix(services/gdrive): stabilize behavior CI semantics by @suyanhanx in #7390
  • fix(services/gdrive): restore behavior CI semantics by @suyanhanx in #7486
  • fix(core): refresh tos lockfile entry by @Xuanwo in #7515
  • fix(bindings/go): release owned c strings via c api by @jihuayu in #7403
  • fix(services): redact credentials in debug output by @jihuayu in #7523
  • fix(dev/generator): fix service generation after services refactor by @trim21 in #7531
  • fix(services/azdls): return user metadata from stat by @Xuanwo in #7532
  • fix(binding/go): correct entry free ffi signature by @Xuanwo in #7538
  • fix(binding/go): keep service library loaded by @Xuanwo in #7542
  • fix(ci): disable WebDAV metadata test for Nextcloud and OwnCloud by @Xuanwo in #7565
  • fix(bindings/nodejs): Align versioned list startAfter test by @ddupg in #7579
  • ci: fix up Haskell workflows by @dentiny in #7586
  • fix(copy): avoid caching source metadata in copiers by @Xuanwo in #7590
  • fix(copy): add retry for copy operation by @dentiny in #7595
  • fix(layers): wrap copier with all layers by @dentiny in #7596
  • fix(services/goosefs): bump goosefs-sdk to 0.1.3 by @XuQianJin-Stars in #7603
  • fix(services/tos): Set user agent header by @ddupg in #7598
  • fix(s3): fix S3 copy response by @dentiny in #7602
  • fix(ci/goosefs): bind master 9200 to IPv4 literal so worker can register by @XuQianJin-Stars in #7613
  • fix(ci): address release gate failures by @Xuanwo in #7620

Docs

CI

Chore

  • chore: Update .gitignore to remove bin and build entries by @tisonkun in #7460
  • chore(bindings/dart): upgrade flutter_rust_bridge to 2.12.0 and fix native library loading by @TennyZhuang in #7472
  • chore(deps): bump the docusaur group in /website with 3 updates by @dependabot[bot] in #7464
  • chore(deps): upgrade rand to 0.10.1 by @Xuanwo in #7510
  • test(bindings/nodejs): upgrade vitest for behavior stability by @suyanhanx in #7564
  • chore(release): prepare v0.57.0 by @Xuanwo in #7591

New Contributors

Full Changelog: v0.56.0...v0.57.0

Don't miss a new opendal release

NewReleases is sending notifications on new releases.