Skip to content

Releases: apache/opendal

v0.30.0

10 Mar 10:37
v0.30.0
975e18d
Compare
Choose a tag to compare

Upgrade to v0.30

In version 0.30, we made significant breaking changes by removing objects. Our goal in doing so was to provide our users with APIs that are easier to understand and maintain.

More detailes could be found at [RFC: Remove Object Concept][crate::docs::rfcs::rfc_1477_remove_object_concept].

To upgrade to OpenDAL v0.30, users need to make the following changes:

  • regex replace object\((.*)\).reader\(\) to reader($1)
    • replace the function on your case, it's recomanded to do it one by one
  • rename ObjectMetakey => Metakey
  • rename ObjectMode => EntryMode
  • replace ErrorKind::ObjectXxx to ErrorKind::Xxx
  • rename AccessorMetadata => AccessorInfo
  • rename ObjectMetadata => Metadata
  • replace operator.metadata() => operator.info()

What's Changed

  • refactor: Split operator APIs into different part by @Xuanwo in #1483
  • RFC-1477: Remove Object Concept by @Xuanwo in #1477
  • feat(bindings/nodejs): fs Operator by @suyanhanx in #1485
  • refactor: Remove Object prefix for public API by @Xuanwo in #1488
  • chore: Re-organize the project layout by @Xuanwo in #1489
  • refactor: Remove the concept of Object by @Xuanwo in #1496
  • fix(services/s3): Make sure the ureq's body has been consumed by @Xuanwo in #1497
  • feat(service/dashmap): Add scan support by @suyanhanx in #1492
  • ci: Don't run binding tests if only services changes by @Xuanwo in #1498
  • chore: typo & clippy by @suyanhanx in #1499
  • feat(bindings/nodejs): Add Writer Support by @suyanhanx in #1490
  • docs: Remove all references to object by @Xuanwo in #1500
  • chore: typo by @suyanhanx in #1501
  • ci: Improve rocksdb build speed by link dynamic libs by @Xuanwo in #1502
  • feat: Add dummy implementation for accessor and builder by @Xuanwo in #1503
  • refactor: remove ReadDir in FTP service by @PragmaTwice in #1504
  • feat(bindings/nodejs): Support List & append all default services by @suyanhanx in #1505
  • feat(bindings/python): Setup operator init logic by @Xuanwo in #1513
  • refactor: rename public api create to create_dir by @suyanhanx in #1512
  • refactor(bindings/python): return bytes directly and add type stub file by @messense in #1514
  • tests: Remove not needed create file test by @Xuanwo in #1516
  • feat(bindings/nodejs): write support string by @suyanhanx in #1520
  • refactor: improve the python binding implementation by @frostming in #1517
  • feat(bindings/python): add support for services that opendal enables by default by @messense in #1522
  • docs(bindings/python): Add building docs by @Xuanwo in #1526
  • docs(bindings/nodejs): update readme by @suyanhanx in #1527
  • feat(bindings/nodejs): Remove Operator.writer until we are ready by @suyanhanx in #1528
  • ci: Fix bindings CI not running on PR by @Xuanwo in #1530
  • fix(services/s3): Allow retry error RequestTimeout by @Xuanwo in #1532
  • feat(bindings/nodejs): Support Operator.create_dir by @suyanhanx in #1529
  • docs: Add detailed docs for create_dir by @Xuanwo in #1537
  • feat(bindings/python): implement create_dir by @messense in #1534
  • feat(bindings/python): implement delete and export more metadata fields by @messense in #1539
  • feat(bindings/python): implement blocking list and scan by @messense in #1541
  • feat: Append EntryMode to Entry by @suyanhanx in #1543
  • chore: Move memcache-async into opendal by @Xuanwo in #1544
  • feat: Entry refactoring to allow external creation by @damooo in #1547
  • feat(bindings/nodejs): Support Operator.scanSync & Operator.listSync by @suyanhanx in #1546
  • feat: remove_via can delete files concurrently by @uran0sH in #1495
  • refactor(bindings/nodejs): Remove scheme from bindings by @Xuanwo in #1552
  • ci: Polish scripts and prepare for releasing by @Xuanwo in #1553
  • feat(bindings/python): implement blocking file-like reader API by @messense in #1554
  • Bump OpenDAL to 0.30 by @Xuanwo in #1555

New Contributors

Full Changelog: v0.29.1...v0.30.0

v0.29.1

05 Mar 09:08
v0.29.1
b9dd40f
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.29.0...v0.29.1

v0.29.0

01 Mar 13:02
v0.29.0
8f62f9b
Compare
Choose a tag to compare

Upgrade to v0.29

In v0.29, we introduced [Object Writer][crate::docs::rfcs::rfc_1420_object_writer] to replace existing Multipart related APIs.

Users can now append multiparts bytes into object via:

let mut w = o.writer().await?;
w.write(bs1).await?;
w.write(bs2).await?;
w.close()

Along with this change, we cleaned up a lot of internal structs and traits. Users who used to depend on opendal::raw::io::{input,output} should use opendal::raw::oio instead.

Also, decompress related feature also removed. Users can use async-compression with ObjectReader directly.


What's Changed

New Contributors

Full Changelog: v0.28.0...v0.29.0

v0.28.0

22 Feb 06:38
v0.28.0
f824e98
Compare
Choose a tag to compare

Upgrade to v0.28

In v0.28, we introduced Query Based Metadata. Users can query cached metadata with ObjectMetakey to make sure that OpenDAL always makes the best decision.

- pub async fn metadata(&self) -> Result<ObjectMetadata>;
+ pub async fn metadata(
+        &self,
+        flags: impl Into<FlagSet<ObjectMetakey>>,
+    ) -> Result<Arc<ObjectMetadata>>;

Please visit Object::metadata()'s example for more details.


What's Changed

  • feat: add dashmap support by @PsiACE in #1390
  • RFC-1391: Object Metadataer by @Xuanwo in #1391
  • refactor: Implement query based object metadata cache by @Xuanwo in #1395
  • refactor: Store complete inside bits and add more examples by @Xuanwo in #1397
  • RFC-1398: Query Based Metadata by @Xuanwo in #1398
  • refactor: Trigger panic if users try to visit not fetched metadata by @Xuanwo in #1399
  • refactor: Polish the implement of Query Based Metadata Cache by @Xuanwo in #1400
  • Bump version to 0.28 by @Xuanwo in #1401

Full Changelog: v0.27.2...v0.28.0

v0.27.2

20 Feb 08:19
v0.27.2
adafc83
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.27.1...v0.27.2

v0.27.1

13 Feb 08:08
v0.27.1
c913415
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.27.0...v0.27.1

v0.27.0

11 Feb 07:23
v0.27.0
43541c6
Compare
Choose a tag to compare

Upgrade to v0.27

In v0.27, we refactored our list related logic and added scan support. So make Pager and BlockingPager associated types in Accessor too!

pub trait Accessor: Send + Sync + Debug + Unpin + 'static {
    type Reader: output::Read;
    type BlockingReader: output::BlockingRead;
+    type Pager: output::Page;
+    type BlockingPager: output::BlockingPage;
}

User defined layers

Due to this change, all layers implementation should be changed. If there is not changed over pager, they can by changed like the following:

impl<A: Accessor> LayeredAccessor for MyAccessor<A> {
    type Inner = A;
    type Reader = MyReader<A::Reader>;
    type BlockingReader = MyReader<A::BlockingReader>;
+    type Pager = A::Pager;
+    type BlockingPager = A::BlockingPager;

+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+        self.inner.list(path, args).await
+    }

+    async fn scan(&self, path: &str, args: OpScan) -> Result<(RpScan, Self::Pager)> {
+        self.inner.scan(path, args).await
+    }

+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+        self.inner.blocking_list(path, args)
+    }

+    fn blocking_scan(&self, path: &str, args: OpScan) -> Result<(RpScan, Self::BlockingPager)> {
+        self.inner.blocking_scan(path, args)
+    }
}

Usage of ops

To reduce the understanding overhead, we move all OpXxx into opendal::ops now. User may need to change:

- use opendal::OpWrite;
+ use opendal::ops::OpWrite;

Usage of RetryLayer

backon is the implementation detail of our RetryLayer, so we hide it from our public API. Users of RetryLayer need to change the code like:

- RetryLayer::new(backon::ExponentialBackoff::default())
+ RetryLayer::new()

What's Changed

New Contributors

Full Changelog: v0.26.2...v0.27.0

v0.26.2

07 Feb 06:51
v0.26.2
5d5c651
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.26.1...v0.26.2

v0.26.1

05 Feb 10:18
v0.26.1
48f49bc
Compare
Choose a tag to compare

v0.26.1 - 2023-02-05

Changed

  • refactor: Remove not used layer subdir (#1280)

Docs

  • docs: Add v0.26 upgrade guide (#1276)
  • docs: Add feature sets in services (#1277)
  • docs: Migrate all docs in rustdoc instead (#1281)
  • docs: Fix index page not redirected (#1282)

v0.26.0

04 Feb 10:06
v0.26.0
50c2608
Compare
Choose a tag to compare

Upgrade to v0.26

In v0.26 we have replaced all internal dynamic dispatch usage with static dispatch. With this change, we can ensure that all operations performed inside OpenDAL are zero cost.

Due to this change, we have to refactor the logic of Operator's init logic. In v0.26, we added opendal::Builder trait and opendal::OperatorBuilder. For the first glance, the only change to existing code will be like:

- let op = Operator::new(builder.build()?);
+ let op = Operator::new(builder.build()?).finish();

By adding a finish() call, we will erase all generic types so that Operator can still be easily to used everywhere as before.

Accessor

In v0.26, Accessor has been changed into trait with associated types.

All services need to decalare the types returned as Reader or BlockingReader:

pub trait Accessor: Send + Sync + Debug + Unpin + 'static {
    type Reader: output::Read;
    type BlockingReader: output::BlockingRead;
}

If your service doesn't support read or blocking_read, we can use () to represent an dummy reader:

impl Accessor for MyDummyAccessor {
    type Reader = ();
    type BlockingReader = ();
}

Layer

As described before, OpenDAL prefer to use static dispatch. Layers are required to implement the new Layer and LayeredAccessor trait:

pub trait Layer<A: Accessor> {
    type LayeredAccessor: Accessor;

    fn layer(&self, inner: A) -> Self::LayeredAccessor;
}

#[async_trait]
pub trait LayeredAccessor: Send + Sync + Debug + Unpin + 'static {
    type Inner: Accessor;
    type Reader: output::Read;
    type BlockingReader: output::BlockingRead;
}

LayeredAccessor is a wrapper of Accessor with the typed Innder. All methods that not implemented will be forward to inner instead.

Builder

Since v0.26, we implement opendal::Builder for all services, and services' mod will not be exported.

- use opendal::services::s3::Builder;
+ use opendal::services::S3;

Conclusion

Sorry again for the big changes in this release. It's a big step for OpenDAL to work in more critical systems.


What's Changed

New Contributors

Full Changelog: v0.25.2...v0.26.0