Skip to content

Commit cad36b3

Browse files
committed
feat: remove write buffer and check piece length when write piece finished
Signed-off-by: Gaius <gaius.qi@gmail.com>
1 parent fb3be39 commit cad36b3

File tree

6 files changed

+66
-26
lines changed

6 files changed

+66
-26
lines changed

Cargo.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ members = [
1212
]
1313

1414
[workspace.package]
15-
version = "1.0.0"
15+
version = "1.0.1"
1616
authors = ["The Dragonfly Developers"]
1717
homepage = "https://d7y.io/"
1818
repository = "https://github.com/dragonflyoss/client.git"
@@ -22,13 +22,13 @@ readme = "README.md"
2222
edition = "2021"
2323

2424
[workspace.dependencies]
25-
dragonfly-client = { path = "dragonfly-client", version = "1.0.0" }
26-
dragonfly-client-core = { path = "dragonfly-client-core", version = "1.0.0" }
27-
dragonfly-client-config = { path = "dragonfly-client-config", version = "1.0.0" }
28-
dragonfly-client-storage = { path = "dragonfly-client-storage", version = "1.0.0" }
29-
dragonfly-client-backend = { path = "dragonfly-client-backend", version = "1.0.0" }
30-
dragonfly-client-util = { path = "dragonfly-client-util", version = "1.0.0" }
31-
dragonfly-client-init = { path = "dragonfly-client-init", version = "1.0.0" }
25+
dragonfly-client = { path = "dragonfly-client", version = "1.0.1" }
26+
dragonfly-client-core = { path = "dragonfly-client-core", version = "1.0.1" }
27+
dragonfly-client-config = { path = "dragonfly-client-config", version = "1.0.1" }
28+
dragonfly-client-storage = { path = "dragonfly-client-storage", version = "1.0.1" }
29+
dragonfly-client-backend = { path = "dragonfly-client-backend", version = "1.0.1" }
30+
dragonfly-client-util = { path = "dragonfly-client-util", version = "1.0.1" }
31+
dragonfly-client-init = { path = "dragonfly-client-init", version = "1.0.1" }
3232
dragonfly-api = "=2.1.40"
3333
thiserror = "2.0"
3434
futures = "0.3.31"

dragonfly-client-storage/src/content.rs

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ impl Content {
359359
&self,
360360
task_id: &str,
361361
offset: u64,
362+
expected_length: u64,
362363
reader: &mut R,
363364
) -> Result<WritePieceResponse> {
364365
// Open the file and seek to the offset.
@@ -393,6 +394,13 @@ impl Content {
393394
error!("flush {:?} failed: {}", task_path, err);
394395
})?;
395396

397+
if length != expected_length {
398+
return Err(Error::Unknown(format!(
399+
"expected length {} but got {}",
400+
expected_length, length
401+
)));
402+
}
403+
396404
// Calculate the hash of the piece.
397405
Ok(WritePieceResponse {
398406
length,
@@ -573,6 +581,7 @@ impl Content {
573581
&self,
574582
task_id: &str,
575583
offset: u64,
584+
expected_length: u64,
576585
reader: &mut R,
577586
) -> Result<WritePieceResponse> {
578587
// Open the file and seek to the offset.
@@ -607,6 +616,13 @@ impl Content {
607616
error!("flush {:?} failed: {}", task_path, err);
608617
})?;
609618

619+
if length != expected_length {
620+
return Err(Error::Unknown(format!(
621+
"expected length {} but got {}",
622+
expected_length, length
623+
)));
624+
}
625+
610626
// Calculate the hash of the piece.
611627
Ok(WritePieceResponse {
612628
length,
@@ -730,7 +746,10 @@ mod tests {
730746

731747
let data = b"hello, world!";
732748
let mut reader = Cursor::new(data);
733-
content.write_piece(task_id, 0, &mut reader).await.unwrap();
749+
content
750+
.write_piece(task_id, 0, 13, &mut reader)
751+
.await
752+
.unwrap();
734753

735754
let mut reader = content.read_piece(task_id, 0, 13, None).await.unwrap();
736755
let mut buffer = Vec::new();
@@ -765,7 +784,10 @@ mod tests {
765784

766785
let data = b"test";
767786
let mut reader = Cursor::new(data);
768-
let response = content.write_piece(task_id, 0, &mut reader).await.unwrap();
787+
let response = content
788+
.write_piece(task_id, 0, 4, &mut reader)
789+
.await
790+
.unwrap();
769791
assert_eq!(response.length, 4);
770792
assert!(!response.hash.is_empty());
771793
}
@@ -872,7 +894,7 @@ mod tests {
872894
let data = b"hello, world!";
873895
let mut reader = Cursor::new(data);
874896
content
875-
.write_persistent_cache_piece(task_id, 0, &mut reader)
897+
.write_persistent_cache_piece(task_id, 0, 13, &mut reader)
876898
.await
877899
.unwrap();
878900

@@ -916,7 +938,7 @@ mod tests {
916938
let data = b"test";
917939
let mut reader = Cursor::new(data);
918940
let response = content
919-
.write_persistent_cache_piece(task_id, 0, &mut reader)
941+
.write_persistent_cache_piece(task_id, 0, 4, &mut reader)
920942
.await
921943
.unwrap();
922944
assert_eq!(response.length, 4);

dragonfly-client-storage/src/lib.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ impl Storage {
385385
) -> Result<metadata::Piece> {
386386
let response = self
387387
.content
388-
.write_persistent_cache_piece(task_id, offset, reader)
388+
.write_persistent_cache_piece(task_id, offset, length, reader)
389389
.await?;
390390
let digest = Digest::new(Algorithm::Crc32, response.hash);
391391

@@ -454,7 +454,10 @@ impl Storage {
454454
buffer.extend_from_slice(bytes);
455455
});
456456

457-
let response = self.content.write_piece(task_id, offset, &mut tee).await?;
457+
let response = self
458+
.content
459+
.write_piece(task_id, offset, length, &mut tee)
460+
.await?;
458461

459462
self.cache
460463
.write_piece(task_id, piece_id, bytes::Bytes::from(buffer))
@@ -463,7 +466,9 @@ impl Storage {
463466

464467
response
465468
} else {
466-
self.content.write_piece(task_id, offset, reader).await?
469+
self.content
470+
.write_piece(task_id, offset, length, reader)
471+
.await?
467472
};
468473

469474
let digest = Digest::new(Algorithm::Crc32, response.hash);
@@ -521,7 +526,10 @@ impl Storage {
521526
buffer.extend_from_slice(bytes);
522527
});
523528

524-
let response = self.content.write_piece(task_id, offset, &mut tee).await?;
529+
let response = self
530+
.content
531+
.write_piece(task_id, offset, length, &mut tee)
532+
.await?;
525533

526534
self.cache
527535
.write_piece(task_id, piece_id, bytes::Bytes::from(buffer))
@@ -530,7 +538,9 @@ impl Storage {
530538

531539
response
532540
} else {
533-
self.content.write_piece(task_id, offset, reader).await?
541+
self.content
542+
.write_piece(task_id, offset, length, reader)
543+
.await?
534544
};
535545

536546
let length = response.length;
@@ -668,6 +678,7 @@ impl Storage {
668678
}
669679

670680
/// download_persistent_cache_piece_from_parent_finished is used for downloading persistent cache piece from parent.
681+
#[allow(clippy::too_many_arguments)]
671682
#[instrument(skip_all)]
672683
pub async fn download_persistent_cache_piece_from_parent_finished<
673684
R: AsyncRead + Unpin + ?Sized,
@@ -676,13 +687,14 @@ impl Storage {
676687
piece_id: &str,
677688
task_id: &str,
678689
offset: u64,
690+
length: u64,
679691
expected_digest: &str,
680692
parent_id: &str,
681693
reader: &mut R,
682694
) -> Result<metadata::Piece> {
683695
let response = self
684696
.content
685-
.write_persistent_cache_piece(task_id, offset, reader)
697+
.write_persistent_cache_piece(task_id, offset, length, reader)
686698
.await?;
687699

688700
let length = response.length;

dragonfly-client/src/resource/piece.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,7 @@ impl Piece {
840840
piece_id,
841841
task_id,
842842
offset,
843+
length,
843844
digest.as_str(),
844845
parent.id.as_str(),
845846
&mut reader,

dragonfly-client/src/resource/task.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1588,6 +1588,11 @@ impl Task {
15881588
}
15891589
};
15901590

1591+
if !piece.is_finished() {
1592+
debug!("piece {} is not finished, skip it", piece_id);
1593+
continue;
1594+
}
1595+
15911596
// Fake the download from the local.
15921597
self.piece.download_from_local(task_id, piece.length);
15931598
info!("finished piece {} from local", piece_id,);

0 commit comments

Comments
 (0)