Releases: apache/opendal
v0.30.0
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\(\)
toreader($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
toErrorKind::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
tocreate_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
andscan
by @messense in #1541 - feat: Append
EntryMode
toEntry
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
- @PragmaTwice made their first contribution in #1504
- @frostming made their first contribution in #1517
- @uran0sH made their first contribution in #1495
Full Changelog: v0.29.1...v0.30.0
v0.29.1
What's Changed
- docs: Add convert from m*n to m+n by @Xuanwo in #1454
- docs: Polish comments for public types by @Xuanwo in #1455
- chore: fix typo by @jackwener in #1456
- chore: fix typo by @suyanhanx in #1459
- benches: Generate into Bytes instead by @Xuanwo in #1463
- feat(bindings/python): Add basic IO support by @Xuanwo in #1464
- feat(binding/node.js): basic IO by @suyanhanx in #1416
- chore(bindings/nodjes): Don't check-in binaries by @Xuanwo in #1469
- chore(binding/nodejs): specific package manager version with hash by @suyanhanx in #1470
- docs: Add discord chat link by @Xuanwo in #1474
- feat(bindings/nodejs): Align to OpenDAL exports by @suyanhanx in #1466
- chore(bindings/nodejs): remove duplicate attribute & unused comment by @suyanhanx in #1478
- refactor: Promote operator as a mod for futher refactor by @Xuanwo in #1479
- Bump to version 0.29.1 by @Xuanwo in #1481
New Contributors
- @suyanhanx made their first contribution in #1459
Full Changelog: v0.29.0...v0.29.1
v0.29.0
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
- docs: Add services-dashmap feature by @PsiACE in #1404
- docs: Fix incorrect indent for title by @Xuanwo in #1405
- refactor: Decouple decompress read feature from opendal by @Xuanwo in #1406
- docs: Add internal sections of Accessor and Layer by @Xuanwo in #1408
- docs: Add more guide for Accessor by @Xuanwo in #1409
- docs: Add tutorial of building a duck storage service by @Xuanwo in #1410
- ci: Consistently apply license header by @tisonkun in #1411
- chore: typo fix by @jackwener in #1418
- RFC-1420: Object Writer by @Xuanwo in #1420
- docs: Add a basic object example by @Xuanwo in #1422
- chore: Make license check happy by @Xuanwo in #1423
- ci: add typos check by @PsiACE in #1425
- feat: oss backend support http protocol by @jackwener in #1432
- chore: typo-fix by @jackwener in #1434
- feat: Implement ObjectWriter Support by @Xuanwo in #1431
- refactor: Cleanup pager related implementation by @Xuanwo in #1439
- refactor: Polish the implement details for Writer by @Xuanwo in #1445
- refactor: Remove
io::input
and Renameio::output
tooio
by @Xuanwo in #1446 - feat/layers/retry: Add Write Retry support by @Xuanwo in #1447
- feat: Add Write append tests by @Xuanwo in #1448
- fix(services/s3): Fix part number for AWS S3 by @Xuanwo in #1450
- Bump to version 0.29 by @Xuanwo in #1451
New Contributors
- @tisonkun made their first contribution in #1411
- @jackwener made their first contribution in #1418
Full Changelog: v0.28.0...v0.29.0
v0.28.0
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
What's Changed
- feat: Add batch API for Accessor by @Xuanwo in #1339
- docs: Fix broken links by @Xuanwo in #1344
- feat: add Content-Disposition for inner API by @ClSlaid in #1347
- feat: add content-disposition support for services by @ClSlaid in #1350
- feat: webdav service support bearer token by @fatelei in #1349
- refactor: Authorization logic for WebdavBackend by @Young-Flash in #1348
- feat: support auth for HttpBackend by @Young-Flash in #1359
- feat: Add batch delete support by @Xuanwo in #1357
- docs: clarify about opendal user defined client by @ClSlaid in #1356
- fix(webhdfs): should prepend http:// scheme by @ClSlaid in #1354
- ci: Pin time <= 0.3.17 until we decide to bump MSRV by @Xuanwo in #1361
- ci: Only run service test on changing by @Xuanwo in #1363
- refactor(webhdfs): handle 307 redirection instead of noredirect by @ClSlaid in #1358
- refactor: Polish http authorization related logic by @Xuanwo in #1367
- ci: run tests with nextest by @PsiACE in #1370
- refactor: Cleanup duplicated code by @Xuanwo in #1373
- feat(webdav): add list and improve create by @imWildCat in #1330
- refactor: Cleanup some not needed error context by @Xuanwo in #1374
- feat: Integrate batch with existing ecosystem better by @Xuanwo in #1378
- feat: Add batch delete support for oss by @Xuanwo in #1385
- Bump to version 0.27.2 by @Xuanwo in #1386
New Contributors
- @fatelei made their first contribution in #1349
- @imWildCat made their first contribution in #1330
Full Changelog: v0.27.1...v0.27.2
v0.27.1
What's Changed
- feat: Add username and password support for WebDAV by @Young-Flash in #1323
- ci: Add test case for webdav with basic auth by @Xuanwo in #1327
- feat(oli): support s3 uri without profile by @xxchan in #1328
- chore: Make clippy happy by @Xuanwo in #1329
- chore(deps): update moka requirement from 0.9 to 0.10 by @dependabot in #1331
- chore(deps): update rocksdb requirement from 0.19 to 0.20 by @dependabot in #1332
- feat: Add scan support for kv adapter by @Xuanwo in #1333
- feat: Add scan support for sled by @Xuanwo in #1334
- fix(services/oss,s3): Metadata should be marked as complete by @Xuanwo in #1335
- Bump to version 0.27.1 by @Xuanwo in #1336
New Contributors
- @Young-Flash made their first contribution in #1323
Full Changelog: v0.27.0...v0.27.1
v0.27.0
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
- ci: Fix dev container Dockerfile by @PsiACE in #1298
- fix: Rocksdb's scheme not output correctly by @Xuanwo in #1300
- refactor: Hide backon from our public API by @Xuanwo in #1302
- refactor: Don't expose ops structs to users directly by @Xuanwo in #1303
- feat: Add Retryable Pager Support by @ClSlaid in #1304
- refactor: Move and rename ObjectPager and ObjectEntry for more clear semantics by @Xuanwo in #1308
- refactor: Implement strong typed pager by @Xuanwo in #1311
- feat: Add Sled support by @jkleinknox in #1305
- chore: fix name typo in oss backend by @wcy-fdu in #1316
- feat: Add Object::scan() support by @Xuanwo in #1314
- feat: Add object page size support by @Xuanwo in #1318
- chore: Add typos-cli and fix typos by @Xuanwo in #1320
- deps: remove unused deps by @xxchan in #1321
- docs: Add risingwave in projects by @Xuanwo in #1322
- refactor: Extract scan as a new API and remove ListStyle by @Xuanwo in #1324
- Bump to version 0.27 by @Xuanwo in #1325
New Contributors
- @jkleinknox made their first contribution in #1305
- @wcy-fdu made their first contribution in #1316
- @xxchan made their first contribution in #1321
Full Changelog: v0.26.2...v0.27.0
v0.26.2
What's Changed
- docs: fix typo by @hezhizhen in #1285
- feat: Add ChaosLayer to inject errors into underlying services by @Xuanwo in #1287
- docs: Polish docs for better reading by @Xuanwo in #1288
- refactor: Split CompleteReaderLayer from TypeEraserLayer by @Xuanwo in #1290
- feat: Implement retry reader by @Xuanwo in #1291
- feat: use std::path::Path for fs backend by @baszalmstra in #1100
- refactor(services/fs): Remove not needed generic by @Xuanwo in #1292
- fix: FsBuilder can't be used with empty root anymore by @Xuanwo in #1293
- fix: Fix retry happened in seek's read ahead logic by @Xuanwo in #1294
- feat: Implement services webhdfs by @ClSlaid in #1263
- Bump to version 0.26.2 by @Xuanwo in #1296
New Contributors
- @hezhizhen made their first contribution in #1285
- @baszalmstra made their first contribution in #1100
Full Changelog: v0.26.1...v0.26.2
v0.26.1
v0.26.0
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
- refactor: remove the duplicated dependency in dev-dependencies by @Kilerd in #1257
- feat: Add benchmarks for blocking_seek operations by @Xuanwo in #1258
- feat: add dev container by @PsiACE in #1261
- chore: refine devcontainer by @PsiACE in #1262
- feat: Zero Cost OpenDAL by @Xuanwo in #1260
- refactor: some code in GitHub Actions by @yihong0618 in #1269
- refactor: Don't expose services mod directly by @Xuanwo in #1271
- refactor: Polish Builder API by @Xuanwo in #1272
- feat: Allow dynamic dispatch layer by @Xuanwo in #1273
- Bump to version 0.26.0 by @Xuanwo in #1274
New Contributors
Full Changelog: v0.25.2...v0.26.0