@@ -133,7 +133,7 @@ impl ParallelExecutor {
133133
134134 let style = ProgressStyle :: default_bar ( )
135135 . template ( "{prefix:.bold} {spinner:.cyan} {msg}" )
136- . unwrap ( )
136+ . map_err ( |e| anyhow :: anyhow! ( "Failed to create progress bar template: {}" , e ) ) ?
137137 . tick_chars ( "⣾⣽⣻⢿⡿⣟⣯⣷ " ) ;
138138
139139 let tasks: Vec < _ > = self
@@ -166,7 +166,20 @@ impl ParallelExecutor {
166166 pb. enable_steady_tick ( std:: time:: Duration :: from_millis ( PROGRESS_BAR_TICK_RATE_MS ) ) ;
167167
168168 tokio:: spawn ( async move {
169- let _permit = semaphore. acquire ( ) . await . unwrap ( ) ;
169+ let _permit = match semaphore. acquire ( ) . await {
170+ Ok ( permit) => permit,
171+ Err ( e) => {
172+ pb. finish_with_message ( format ! (
173+ "{} {}" ,
174+ "●" . red( ) ,
175+ "Semaphore closed" . red( )
176+ ) ) ;
177+ return ExecutionResult {
178+ node,
179+ result : Err ( anyhow:: anyhow!( "Semaphore acquisition failed: {}" , e) ) ,
180+ } ;
181+ }
182+ } ;
170183
171184 pb. set_message ( format ! ( "{}" , "Executing..." . blue( ) ) ) ;
172185
@@ -240,7 +253,9 @@ impl ParallelExecutor {
240253
241254 let style = ProgressStyle :: default_bar ( )
242255 . template ( "{prefix:.bold} {spinner:.cyan} {msg}" )
243- . unwrap ( )
256+ . map_err ( |e| {
257+ anyhow:: anyhow!( "Failed to create progress bar template for upload: {}" , e)
258+ } ) ?
244259 . tick_chars ( "⣾⣽⣻⢿⡿⣟⣯⣷ " ) ;
245260
246261 let tasks: Vec < _ > = self
@@ -272,7 +287,20 @@ impl ParallelExecutor {
272287 pb. enable_steady_tick ( std:: time:: Duration :: from_millis ( PROGRESS_BAR_TICK_RATE_MS ) ) ;
273288
274289 tokio:: spawn ( async move {
275- let _permit = semaphore. acquire ( ) . await . unwrap ( ) ;
290+ let _permit = match semaphore. acquire ( ) . await {
291+ Ok ( permit) => permit,
292+ Err ( e) => {
293+ pb. finish_with_message ( format ! (
294+ "{} {}" ,
295+ "●" . red( ) ,
296+ "Semaphore closed" . red( )
297+ ) ) ;
298+ return UploadResult {
299+ node,
300+ result : Err ( anyhow:: anyhow!( "Semaphore acquisition failed: {}" , e) ) ,
301+ } ;
302+ }
303+ } ;
276304
277305 pb. set_message ( format ! ( "{}" , "Uploading (SFTP)..." . blue( ) ) ) ;
278306
@@ -337,7 +365,9 @@ impl ParallelExecutor {
337365
338366 let style = ProgressStyle :: default_bar ( )
339367 . template ( "{prefix:.bold} {spinner:.cyan} {msg}" )
340- . unwrap ( )
368+ . map_err ( |e| {
369+ anyhow:: anyhow!( "Failed to create progress bar template for download: {}" , e)
370+ } ) ?
341371 . tick_chars ( "⣾⣽⣻⢿⡿⣟⣯⣷ " ) ;
342372
343373 let tasks: Vec < _ > = self
@@ -369,7 +399,20 @@ impl ParallelExecutor {
369399 pb. enable_steady_tick ( std:: time:: Duration :: from_millis ( PROGRESS_BAR_TICK_RATE_MS ) ) ;
370400
371401 tokio:: spawn ( async move {
372- let _permit = semaphore. acquire ( ) . await . unwrap ( ) ;
402+ let _permit = match semaphore. acquire ( ) . await {
403+ Ok ( permit) => permit,
404+ Err ( e) => {
405+ pb. finish_with_message ( format ! (
406+ "{} {}" ,
407+ "●" . red( ) ,
408+ "Semaphore closed" . red( )
409+ ) ) ;
410+ return DownloadResult {
411+ node,
412+ result : Err ( anyhow:: anyhow!( "Semaphore acquisition failed: {}" , e) ) ,
413+ } ;
414+ }
415+ } ;
373416
374417 pb. set_message ( format ! ( "{}" , "Downloading (SFTP)..." . blue( ) ) ) ;
375418
@@ -439,7 +482,12 @@ impl ParallelExecutor {
439482
440483 let style = ProgressStyle :: default_bar ( )
441484 . template ( "{prefix:.bold} {spinner:.cyan} {msg}" )
442- . unwrap ( )
485+ . map_err ( |e| {
486+ anyhow:: anyhow!(
487+ "Failed to create progress bar template for multi-download: {}" ,
488+ e
489+ )
490+ } ) ?
443491 . tick_chars ( "⣾⣽⣻⢿⡿⣟⣯⣷ " ) ;
444492
445493 let mut all_results = Vec :: new ( ) ;
@@ -471,7 +519,23 @@ impl ParallelExecutor {
471519 ) ) ;
472520
473521 tokio:: spawn ( async move {
474- let _permit = semaphore. acquire ( ) . await . unwrap ( ) ;
522+ let _permit = match semaphore. acquire ( ) . await {
523+ Ok ( permit) => permit,
524+ Err ( e) => {
525+ pb. finish_with_message ( format ! (
526+ "{} {}" ,
527+ "●" . red( ) ,
528+ "Semaphore closed" . red( )
529+ ) ) ;
530+ return DownloadResult {
531+ node,
532+ result : Err ( anyhow:: anyhow!(
533+ "Semaphore acquisition failed: {}" ,
534+ e
535+ ) ) ,
536+ } ;
537+ }
538+ } ;
475539
476540 // Generate unique filename for each node and file
477541 let filename = if let Some ( file_name) = Path :: new ( & remote_path) . file_name ( )
0 commit comments