15
15
*/
16
16
17
17
use super :: * ;
18
- use crate :: grpc:: dfdaemon_upload:: DfdaemonUploadClient ;
19
18
use crate :: metrics:: {
20
19
collect_backend_request_failure_metrics, collect_backend_request_finished_metrics,
21
20
collect_backend_request_started_metrics, collect_download_piece_traffic_metrics,
22
21
collect_upload_piece_traffic_metrics,
23
22
} ;
24
23
use chrono:: Utc ;
25
24
use dragonfly_api:: common:: v2:: { Hdfs , ObjectStorage , Range , TrafficType } ;
26
- use dragonfly_api:: dfdaemon:: v2:: DownloadPieceRequest ;
27
25
use dragonfly_client_backend:: { BackendFactory , GetRequest } ;
28
26
use dragonfly_client_config:: dfdaemon:: Config ;
29
27
use dragonfly_client_core:: { error:: BackendError , Error , Result } ;
@@ -66,6 +64,9 @@ pub struct Piece {
66
64
/// storage is the local storage.
67
65
storage : Arc < Storage > ,
68
66
67
+ /// downloader_factory is the piece downloader factory.
68
+ downloader_factory : Arc < piece_downloader:: DownloaderFactory > ,
69
+
69
70
/// backend_factory is the backend factory.
70
71
backend_factory : Arc < BackendFactory > ,
71
72
@@ -88,11 +89,15 @@ impl Piece {
88
89
id_generator : Arc < IDGenerator > ,
89
90
storage : Arc < Storage > ,
90
91
backend_factory : Arc < BackendFactory > ,
91
- ) -> Self {
92
- Self {
92
+ ) -> Result < Self > {
93
+ Ok ( Self {
93
94
config : config. clone ( ) ,
94
95
id_generator,
95
96
storage,
97
+ downloader_factory : Arc :: new ( piece_downloader:: DownloaderFactory :: new (
98
+ config. upload . server . protocol . as_str ( ) ,
99
+ config. clone ( ) ,
100
+ ) ?) ,
96
101
backend_factory,
97
102
download_rate_limiter : Arc :: new (
98
103
RateLimiter :: builder ( )
@@ -116,7 +121,7 @@ impl Piece {
116
121
. interval ( Duration :: from_secs ( 1 ) )
117
122
. build ( ) ,
118
123
) ,
119
- }
124
+ } )
120
125
}
121
126
122
127
/// id generates a new piece id.
@@ -429,70 +434,32 @@ impl Piece {
429
434
430
435
Error :: InvalidPeer ( parent. id . clone ( ) )
431
436
} ) ?;
432
- let dfdaemon_upload_client = DfdaemonUploadClient :: new (
433
- self . config . clone ( ) ,
434
- format ! ( "http://{}:{}" , host. ip, host. port) ,
435
- )
436
- . await
437
- . map_err ( |err| {
438
- error ! (
439
- "create dfdaemon upload client from {}:{} failed: {}" ,
440
- host. ip, host. port, err
441
- ) ;
442
- if let Some ( err) = self . storage . download_piece_failed ( piece_id) . err ( ) {
443
- error ! ( "set piece metadata failed: {}" , err)
444
- } ;
445
-
446
- err
447
- } ) ?;
448
437
449
- // Send the interested pieces request.
450
- let response = dfdaemon_upload_client
438
+ let ( content, offset, digest) = self
439
+ . downloader_factory
440
+ . build ( )
451
441
. download_piece (
452
- DownloadPieceRequest {
453
- host_id : host_id. to_string ( ) ,
454
- task_id : task_id. to_string ( ) ,
455
- piece_number : number,
456
- } ,
457
- self . config . download . piece_timeout ,
442
+ format ! ( "{}:{}" , host. ip, host. port) . as_str ( ) ,
443
+ number,
444
+ host_id,
445
+ task_id,
458
446
)
459
447
. await
460
- . map_err ( |err| {
448
+ . inspect_err ( |err| {
461
449
error ! ( "download piece failed: {}" , err) ;
462
450
if let Some ( err) = self . storage . download_piece_failed ( piece_id) . err ( ) {
463
451
error ! ( "set piece metadata failed: {}" , err)
464
452
} ;
465
-
466
- err
467
453
} ) ?;
468
454
469
- let piece = response. piece . ok_or_else ( || {
470
- error ! ( "piece is empty" ) ;
471
- if let Some ( err) = self . storage . download_piece_failed ( piece_id) . err ( ) {
472
- error ! ( "set piece metadata failed: {}" , err)
473
- } ;
474
-
475
- Error :: InvalidParameter
476
- } ) ?;
477
-
478
- // Get the piece content.
479
- let content = piece. content . ok_or_else ( || {
480
- error ! ( "piece content is empty" ) ;
481
- if let Some ( err) = self . storage . download_piece_failed ( piece_id) . err ( ) {
482
- error ! ( "set piece metadata failed: {}" , err)
483
- } ;
484
-
485
- Error :: InvalidParameter
486
- } ) ?;
487
-
488
455
// Record the finish of downloading piece.
489
456
match self
490
457
. storage
491
458
. download_piece_from_remote_peer_finished (
492
459
piece_id,
493
460
task_id,
494
- piece . offset ,
495
- piece . digest . as_str ( ) ,
461
+ offset,
462
+ digest. as_str ( ) ,
496
463
parent. id . as_str ( ) ,
497
464
& mut content. as_slice ( ) ,
498
465
)
@@ -715,7 +682,8 @@ mod tests {
715
682
id_generator. clone ( ) ,
716
683
storage. clone ( ) ,
717
684
backend_factory. clone ( ) ,
718
- ) ;
685
+ )
686
+ . unwrap ( ) ;
719
687
720
688
let test_cases = vec ! [
721
689
( 1000 , 1 , None , 1 , vec![ 0 ] , 0 , 1 ) ,
0 commit comments