Skip to content

Commit e827253

Browse files
committed
rpc: multipart reader needs no completion
1 parent 5213883 commit e827253

2 files changed

Lines changed: 18 additions & 18 deletions

File tree

‎rpc/src/rpc/parts.rs‎

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ use ql_common::ResetCode;
66
use crate::{codec, read_bytes, ChunkQueue, RpcCodec, RpcError, RpcRead};
77

88
/// reads a stream of framed byte parts
9+
///
10+
/// dropping the reader stops receiving further parts
911
pub struct MultipartReader<H, R>
1012
where
1113
H: RpcCodec,
@@ -66,22 +68,6 @@ where
6668
Err(crate::Error::UnexpectedFrameKind(kind.tag()).into())
6769
}
6870

69-
/// rejects any remaining part
70-
pub async fn complete(mut self) -> Result<(), RpcError<H::Error, R::Error>> {
71-
let Some(frame) = self.read_frame().await? else {
72-
return Ok(());
73-
};
74-
75-
let kind = match frame {
76-
PartFrame::PartHeader(_) => FrameKind::PartHeader,
77-
PartFrame::BodyBytes(_) => FrameKind::BodyChunk,
78-
PartFrame::EndPart => FrameKind::EndPart,
79-
};
80-
81-
self.reset_inner(ResetCode::PROTOCOL);
82-
Err(crate::Error::UnexpectedFrameKind(kind.tag()).into())
83-
}
84-
8571
pub fn reset(mut self, code: ResetCode) {
8672
self.reset_inner(code);
8773
}
@@ -117,6 +103,18 @@ where
117103
}
118104
}
119105

106+
impl<H, R> Drop for MultipartReader<H, R>
107+
where
108+
H: RpcCodec,
109+
R: RpcRead,
110+
{
111+
fn drop(&mut self) {
112+
if !self.finished {
113+
self.stream.reset(ResetCode::CANCELLED);
114+
}
115+
}
116+
}
117+
120118
impl<H, R> MultipartPart<'_, H, R>
121119
where
122120
H: RpcCodec,

‎rpc/src/rpc/tests.rs‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ fn download() {
440440
for chunk_size in chunk_sizes() {
441441
let (client, server) = stream_pair(chunk_size);
442442
let client = async move {
443+
let pipe = client.reader.pipe.clone();
443444
let download = download::start::<Rpc, _>(client, &b"file".to_vec())
444445
.await
445446
.unwrap();
@@ -457,7 +458,8 @@ fn download() {
457458
}
458459
assert_eq!(body, b"abcdef".to_vec());
459460
drop(part);
460-
reader.complete().await.unwrap();
461+
drop(reader);
462+
assert_eq!(pipe.borrow().reset, Some(ResetCode::CANCELLED));
461463
};
462464
let server = download::handle_download::<(), Rpc, _, _, _, _>(
463465
(),
@@ -524,7 +526,7 @@ fn upload() {
524526
}
525527
assert_eq!(body, b"abcdef".to_vec());
526528
drop(part);
527-
upload.complete().await.unwrap();
529+
assert!(upload.next_part().await.unwrap().is_none());
528530
responder.respond(b"stored".to_vec()).await.unwrap();
529531
},
530532
|_, error| panic!("upload failed: {error:?}"),

0 commit comments

Comments
 (0)