Skip to content

Commit c77a07a

Browse files
authored
refactor: Implement RFC-3911 Deleter API (#5392)
1 parent f3bf1d4 commit c77a07a

File tree

176 files changed

+5013
-1898
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

176 files changed

+5013
-1898
lines changed

core/src/docs/rfcs/3911_deleter_api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ And the `delete` API will be changed to return a `oio::Delete` instead:
128128

129129
```diff
130130
trait Accessor {
131-
- async fn delete(&self, path: &str, args: OpDelete) -> Result<RpDelete>;
131+
- async fn delete(&self) -> Result<(RpDelete, Self::Deleter)>;
132132
+ async fn delete(&self, args: OpDelete) -> Result<(RpDelete, Self::Deleter)>;
133133
}
134134
```

core/src/layers/async_backtrace.rs

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ impl<A: Access> LayeredAccess for AsyncBacktraceAccessor<A> {
6565
type BlockingWriter = AsyncBacktraceWrapper<A::BlockingWriter>;
6666
type Lister = AsyncBacktraceWrapper<A::Lister>;
6767
type BlockingLister = AsyncBacktraceWrapper<A::BlockingLister>;
68+
type Deleter = AsyncBacktraceWrapper<A::Deleter>;
69+
type BlockingDeleter = AsyncBacktraceWrapper<A::BlockingDeleter>;
6870

6971
fn inner(&self) -> &Self::Inner {
7072
&self.inner
@@ -102,8 +104,11 @@ impl<A: Access> LayeredAccess for AsyncBacktraceAccessor<A> {
102104
}
103105

104106
#[async_backtrace::framed]
105-
async fn delete(&self, path: &str, args: OpDelete) -> Result<RpDelete> {
106-
self.inner.delete(path, args).await
107+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
108+
self.inner
109+
.delete()
110+
.await
111+
.map(|(rp, r)| (rp, AsyncBacktraceWrapper::new(r)))
107112
}
108113

109114
#[async_backtrace::framed]
@@ -114,11 +119,6 @@ impl<A: Access> LayeredAccess for AsyncBacktraceAccessor<A> {
114119
.map(|(rp, r)| (rp, AsyncBacktraceWrapper::new(r)))
115120
}
116121

117-
#[async_backtrace::framed]
118-
async fn batch(&self, args: OpBatch) -> Result<RpBatch> {
119-
self.inner.batch(args).await
120-
}
121-
122122
#[async_backtrace::framed]
123123
async fn presign(&self, path: &str, args: OpPresign) -> Result<RpPresign> {
124124
self.inner.presign(path, args).await
@@ -141,6 +141,12 @@ impl<A: Access> LayeredAccess for AsyncBacktraceAccessor<A> {
141141
.blocking_list(path, args)
142142
.map(|(rp, r)| (rp, AsyncBacktraceWrapper::new(r)))
143143
}
144+
145+
fn blocking_delete(&self) -> Result<(RpDelete, Self::BlockingDeleter)> {
146+
self.inner
147+
.blocking_delete()
148+
.map(|(rp, r)| (rp, AsyncBacktraceWrapper::new(r)))
149+
}
144150
}
145151

146152
pub struct AsyncBacktraceWrapper<R> {
@@ -173,13 +179,13 @@ impl<R: oio::Write> oio::Write for AsyncBacktraceWrapper<R> {
173179
}
174180

175181
#[async_backtrace::framed]
176-
async fn abort(&mut self) -> Result<()> {
177-
self.inner.abort().await
182+
async fn close(&mut self) -> Result<()> {
183+
self.inner.close().await
178184
}
179185

180186
#[async_backtrace::framed]
181-
async fn close(&mut self) -> Result<()> {
182-
self.inner.close().await
187+
async fn abort(&mut self) -> Result<()> {
188+
self.inner.abort().await
183189
}
184190
}
185191

@@ -205,3 +211,24 @@ impl<R: oio::BlockingList> oio::BlockingList for AsyncBacktraceWrapper<R> {
205211
self.inner.next()
206212
}
207213
}
214+
215+
impl<R: oio::Delete> oio::Delete for AsyncBacktraceWrapper<R> {
216+
fn delete(&mut self, path: &str, args: OpDelete) -> Result<()> {
217+
self.inner.delete(path, args)
218+
}
219+
220+
#[async_backtrace::framed]
221+
async fn flush(&mut self) -> Result<usize> {
222+
self.inner.flush().await
223+
}
224+
}
225+
226+
impl<R: oio::BlockingDelete> oio::BlockingDelete for AsyncBacktraceWrapper<R> {
227+
fn delete(&mut self, path: &str, args: OpDelete) -> Result<()> {
228+
self.inner.delete(path, args)
229+
}
230+
231+
fn flush(&mut self) -> Result<usize> {
232+
self.inner.flush()
233+
}
234+
}

core/src/layers/await_tree.rs

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ impl<A: Access> LayeredAccess for AwaitTreeAccessor<A> {
7676
type BlockingWriter = AwaitTreeWrapper<A::BlockingWriter>;
7777
type Lister = AwaitTreeWrapper<A::Lister>;
7878
type BlockingLister = AwaitTreeWrapper<A::BlockingLister>;
79+
type Deleter = AwaitTreeWrapper<A::Deleter>;
80+
type BlockingDeleter = AwaitTreeWrapper<A::BlockingDeleter>;
7981

8082
fn inner(&self) -> &Self::Inner {
8183
&self.inner
@@ -118,11 +120,12 @@ impl<A: Access> LayeredAccess for AwaitTreeAccessor<A> {
118120
.await
119121
}
120122

121-
async fn delete(&self, path: &str, args: OpDelete) -> Result<RpDelete> {
123+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
122124
self.inner
123-
.delete(path, args)
125+
.delete()
124126
.instrument_await(format!("opendal::{}", Operation::Delete))
125127
.await
128+
.map(|(rp, r)| (rp, AwaitTreeWrapper::new(r)))
126129
}
127130

128131
async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
@@ -140,13 +143,6 @@ impl<A: Access> LayeredAccess for AwaitTreeAccessor<A> {
140143
.await
141144
}
142145

143-
async fn batch(&self, args: OpBatch) -> Result<RpBatch> {
144-
self.inner
145-
.batch(args)
146-
.instrument_await(format!("opendal::{}", Operation::Batch))
147-
.await
148-
}
149-
150146
fn blocking_read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::BlockingReader)> {
151147
self.inner
152148
.blocking_read(path, args)
@@ -164,6 +160,12 @@ impl<A: Access> LayeredAccess for AwaitTreeAccessor<A> {
164160
.blocking_list(path, args)
165161
.map(|(rp, r)| (rp, AwaitTreeWrapper::new(r)))
166162
}
163+
164+
fn blocking_delete(&self) -> Result<(RpDelete, Self::BlockingDeleter)> {
165+
self.inner
166+
.blocking_delete()
167+
.map(|(rp, r)| (rp, AwaitTreeWrapper::new(r)))
168+
}
167169
}
168170

169171
pub struct AwaitTreeWrapper<R> {
@@ -235,3 +237,26 @@ impl<R: oio::BlockingList> oio::BlockingList for AwaitTreeWrapper<R> {
235237
self.inner.next()
236238
}
237239
}
240+
241+
impl<R: oio::Delete> oio::Delete for AwaitTreeWrapper<R> {
242+
fn delete(&mut self, path: &str, args: OpDelete) -> Result<()> {
243+
self.inner.delete(path, args)
244+
}
245+
246+
async fn flush(&mut self) -> Result<usize> {
247+
self.inner
248+
.flush()
249+
.instrument_await(format!("opendal::{}", Operation::DeleterFlush))
250+
.await
251+
}
252+
}
253+
254+
impl<R: oio::BlockingDelete> oio::BlockingDelete for AwaitTreeWrapper<R> {
255+
fn delete(&mut self, path: &str, args: OpDelete) -> Result<()> {
256+
self.inner.delete(path, args)
257+
}
258+
259+
fn flush(&mut self) -> Result<usize> {
260+
self.inner.flush()
261+
}
262+
}

core/src/layers/blocking.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ impl<A: Access> LayeredAccess for BlockingAccessor<A> {
168168
type BlockingWriter = BlockingWrapper<A::Writer>;
169169
type Lister = A::Lister;
170170
type BlockingLister = BlockingWrapper<A::Lister>;
171+
type Deleter = A::Deleter;
172+
type BlockingDeleter = BlockingWrapper<A::Deleter>;
171173

172174
fn inner(&self) -> &Self::Inner {
173175
&self.inner
@@ -203,8 +205,8 @@ impl<A: Access> LayeredAccess for BlockingAccessor<A> {
203205
self.inner.stat(path, args).await
204206
}
205207

206-
async fn delete(&self, path: &str, args: OpDelete) -> Result<RpDelete> {
207-
self.inner.delete(path, args).await
208+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
209+
self.inner.delete().await
208210
}
209211

210212
async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
@@ -215,10 +217,6 @@ impl<A: Access> LayeredAccess for BlockingAccessor<A> {
215217
self.inner.presign(path, args).await
216218
}
217219

218-
async fn batch(&self, args: OpBatch) -> Result<RpBatch> {
219-
self.inner.batch(args).await
220-
}
221-
222220
fn blocking_create_dir(&self, path: &str, args: OpCreateDir) -> Result<RpCreateDir> {
223221
self.handle.block_on(self.inner.create_dir(path, args))
224222
}
@@ -252,8 +250,12 @@ impl<A: Access> LayeredAccess for BlockingAccessor<A> {
252250
self.handle.block_on(self.inner.stat(path, args))
253251
}
254252

255-
fn blocking_delete(&self, path: &str, args: OpDelete) -> Result<RpDelete> {
256-
self.handle.block_on(self.inner.delete(path, args))
253+
fn blocking_delete(&self) -> Result<(RpDelete, Self::BlockingDeleter)> {
254+
self.handle.block_on(async {
255+
let (rp, writer) = self.inner.delete().await?;
256+
let blocking_deleter = Self::BlockingDeleter::new(self.handle.clone(), writer);
257+
Ok((rp, blocking_deleter))
258+
})
257259
}
258260

259261
fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
@@ -298,6 +300,16 @@ impl<I: oio::List> oio::BlockingList for BlockingWrapper<I> {
298300
}
299301
}
300302

303+
impl<I: oio::Delete + 'static> oio::BlockingDelete for BlockingWrapper<I> {
304+
fn delete(&mut self, path: &str, args: OpDelete) -> Result<()> {
305+
self.inner.delete(path, args)
306+
}
307+
308+
fn flush(&mut self) -> Result<usize> {
309+
self.handle.block_on(self.inner.flush())
310+
}
311+
}
312+
301313
#[cfg(test)]
302314
mod tests {
303315
use once_cell::sync::Lazy;

core/src/layers/capability_check.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,13 @@ impl<A: Access> Debug for CapabilityAccessor<A> {
8282
impl<A: Access> LayeredAccess for CapabilityAccessor<A> {
8383
type Inner = A;
8484
type Reader = A::Reader;
85-
type BlockingReader = A::BlockingReader;
8685
type Writer = A::Writer;
87-
type BlockingWriter = A::BlockingWriter;
8886
type Lister = A::Lister;
87+
type Deleter = A::Deleter;
88+
type BlockingReader = A::BlockingReader;
89+
type BlockingWriter = A::BlockingWriter;
8990
type BlockingLister = A::BlockingLister;
91+
type BlockingDeleter = A::BlockingDeleter;
9092

9193
fn inner(&self) -> &Self::Inner {
9294
&self.inner
@@ -123,6 +125,10 @@ impl<A: Access> LayeredAccess for CapabilityAccessor<A> {
123125
self.inner.write(path, args).await
124126
}
125127

128+
async fn delete(&self) -> crate::Result<(RpDelete, Self::Deleter)> {
129+
self.inner.delete().await
130+
}
131+
126132
async fn list(&self, path: &str, args: OpList) -> crate::Result<(RpList, Self::Lister)> {
127133
let capability = self.info.full_capability();
128134
if !capability.list_with_version && args.version() {
@@ -175,6 +181,10 @@ impl<A: Access> LayeredAccess for CapabilityAccessor<A> {
175181
self.inner.blocking_write(path, args)
176182
}
177183

184+
fn blocking_delete(&self) -> crate::Result<(RpDelete, Self::BlockingDeleter)> {
185+
self.inner.blocking_delete()
186+
}
187+
178188
fn blocking_list(
179189
&self,
180190
path: &str,
@@ -207,9 +217,11 @@ mod tests {
207217
type Reader = oio::Reader;
208218
type Writer = oio::Writer;
209219
type Lister = oio::Lister;
220+
type Deleter = oio::Deleter;
210221
type BlockingReader = oio::BlockingReader;
211222
type BlockingWriter = oio::BlockingWriter;
212223
type BlockingLister = oio::BlockingLister;
224+
type BlockingDeleter = oio::BlockingDeleter;
213225

214226
fn info(&self) -> Arc<AccessorInfo> {
215227
let mut info = AccessorInfo::default();

core/src/layers/chaos.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ impl<A: Access> LayeredAccess for ChaosAccessor<A> {
105105
type BlockingWriter = A::BlockingWriter;
106106
type Lister = A::Lister;
107107
type BlockingLister = A::BlockingLister;
108+
type Deleter = A::Deleter;
109+
type BlockingDeleter = A::BlockingDeleter;
108110

109111
fn inner(&self) -> &Self::Inner {
110112
&self.inner
@@ -138,6 +140,14 @@ impl<A: Access> LayeredAccess for ChaosAccessor<A> {
138140
fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
139141
self.inner.blocking_list(path, args)
140142
}
143+
144+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
145+
self.inner.delete().await
146+
}
147+
148+
fn blocking_delete(&self) -> Result<(RpDelete, Self::BlockingDeleter)> {
149+
self.inner.blocking_delete()
150+
}
141151
}
142152

143153
/// ChaosReader will inject error into read operations.

core/src/layers/complete.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,8 @@ impl<A: Access> LayeredAccess for CompleteAccessor<A> {
336336
type BlockingWriter = CompleteWriter<A::BlockingWriter>;
337337
type Lister = CompleteLister<A, A::Lister>;
338338
type BlockingLister = CompleteLister<A, A::BlockingLister>;
339+
type Deleter = A::Deleter;
340+
type BlockingDeleter = A::BlockingDeleter;
339341

340342
fn inner(&self) -> &Self::Inner {
341343
&self.inner
@@ -373,10 +375,18 @@ impl<A: Access> LayeredAccess for CompleteAccessor<A> {
373375
self.complete_stat(path, args).await
374376
}
375377

378+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
379+
self.inner().delete().await
380+
}
381+
376382
async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
377383
self.complete_list(path, args).await
378384
}
379385

386+
async fn presign(&self, path: &str, args: OpPresign) -> Result<RpPresign> {
387+
self.inner.presign(path, args).await
388+
}
389+
380390
fn blocking_create_dir(&self, path: &str, args: OpCreateDir) -> Result<RpCreateDir> {
381391
self.complete_blocking_create_dir(path, args)
382392
}
@@ -398,6 +408,10 @@ impl<A: Access> LayeredAccess for CompleteAccessor<A> {
398408
self.complete_blocking_stat(path, args)
399409
}
400410

411+
fn blocking_delete(&self) -> Result<(RpDelete, Self::BlockingDeleter)> {
412+
self.inner().blocking_delete()
413+
}
414+
401415
fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
402416
self.complete_blocking_list(path, args)
403417
}

0 commit comments

Comments
 (0)