@@ -206,8 +206,7 @@ where
206
206
) {
207
207
let logger = self . logger_factory . subgraph_logger ( & id) ;
208
208
209
- // Blocking due to store interactions. Won't be blocking after #905.
210
- match graph:: spawn_blocking ( Self :: start_subgraph_inner (
209
+ match Self :: start_subgraph_inner (
211
210
logger. clone ( ) ,
212
211
self . instances . clone ( ) ,
213
212
self . host_builder . clone ( ) ,
@@ -219,10 +218,8 @@ where
219
218
manifest,
220
219
self . metrics_registry . cheap_clone ( ) ,
221
220
self . link_resolver . cheap_clone ( ) ,
222
- ) )
221
+ )
223
222
. await
224
- . map_err ( Error :: from)
225
- . and_then ( |e| e)
226
223
{
227
224
Ok ( ( ) ) => self . manager_metrics . subgraph_count . inc ( ) ,
228
225
Err ( err) => error ! (
@@ -355,7 +352,21 @@ where
355
352
& network,
356
353
& required_capabilities, e) ) ?. clone ( ) ;
357
354
358
- store. start_subgraph_deployment ( & logger, & manifest. id ) ?;
355
+ {
356
+ let store = store. clone ( ) ;
357
+ let logger = logger. clone ( ) ;
358
+ let id = manifest. id . clone ( ) ;
359
+
360
+ // `start_subgraph_deployment` is blocking.
361
+ tokio:: task:: spawn_blocking ( move || {
362
+ store
363
+ . start_subgraph_deployment ( & logger, & id)
364
+ . map_err ( Error :: from)
365
+ } )
366
+ . await
367
+ . map_err ( Error :: from)
368
+ . and_then ( |x| x) ?;
369
+ }
359
370
360
371
// Clone the deployment ID for later
361
372
let deployment_id = manifest. id . clone ( ) ;
@@ -414,7 +425,7 @@ where
414
425
templates,
415
426
} ,
416
427
state : IndexingState {
417
- logger,
428
+ logger : logger . cheap_clone ( ) ,
418
429
instance,
419
430
instances,
420
431
log_filter,
@@ -435,17 +446,22 @@ where
435
446
// forward; this is easier than updating the existing block stream.
436
447
//
437
448
// This task has many calls to the store, so mark it as `blocking`.
438
- graph:: spawn_blocking ( async move {
439
- let res = run_subgraph ( ctx) . await ;
449
+ graph:: spawn_thread ( deployment_id. to_string ( ) , move || {
450
+ if let Err ( e) = graph:: block_on ( run_subgraph ( ctx) ) {
451
+ error ! (
452
+ & logger,
453
+ "Subgraph instance failed to run: {}" ,
454
+ format!( "{:#}" , e)
455
+ ) ;
456
+ }
440
457
subgraph_metrics_unregister. unregister ( registry) ;
441
- res
442
458
} ) ;
443
459
444
460
Ok ( ( ) )
445
461
}
446
462
}
447
463
448
- async fn run_subgraph < B , T , S , C > ( mut ctx : IndexingContext < B , T , S , C > ) -> Result < ( ) , ( ) >
464
+ async fn run_subgraph < B , T , S , C > ( mut ctx : IndexingContext < B , T , S , C > ) -> Result < ( ) , Error >
449
465
where
450
466
B : BlockStreamBuilder ,
451
467
T : RuntimeHostBuilder ,
@@ -609,10 +625,7 @@ where
609
625
if first_run {
610
626
first_run = false ;
611
627
612
- ctx. inputs
613
- . store
614
- . unfail ( & ctx. inputs . deployment_id )
615
- . map_err ( |_| ( ) ) ?;
628
+ ctx. inputs . store . unfail ( & ctx. inputs . deployment_id ) ?;
616
629
}
617
630
618
631
if needs_restart {
@@ -633,18 +646,13 @@ where
633
646
"Subgraph block stream shut down cleanly" ;
634
647
"id" => id_for_err. to_string( ) ,
635
648
) ;
636
- return Err ( ( ) ) ;
649
+ return Ok ( ( ) ) ;
637
650
}
638
651
639
652
// Handle unexpected stream errors by marking the subgraph as failed.
640
653
Err ( e) => {
641
654
let message = format ! ( "{:#}" , e) . replace ( "\n " , "\t " ) ;
642
- error ! (
643
- & logger,
644
- "Subgraph instance failed to run: {}" , message;
645
- "id" => id_for_err. to_string( ) ,
646
- "code" => LogCode :: SubgraphSyncingFailure
647
- ) ;
655
+ let err = anyhow ! ( "{}, code: {}" , message, LogCode :: SubgraphSyncingFailure ) ;
648
656
649
657
let error = SubgraphError {
650
658
subgraph_id : id_for_err. clone ( ) ,
@@ -654,15 +662,12 @@ where
654
662
deterministic : e. is_deterministic ( ) ,
655
663
} ;
656
664
657
- if let Err ( e) = store_for_err. fail_subgraph ( id_for_err. clone ( ) , error) . await {
658
- error ! (
659
- & logger,
660
- "Failed to set subgraph status to Failed: {}" , e;
661
- "id" => id_for_err. to_string( ) ,
662
- "code" => LogCode :: SubgraphSyncingFailureNotRecorded
663
- ) ;
664
- }
665
- return Err ( ( ) ) ;
665
+ store_for_err
666
+ . fail_subgraph ( id_for_err. clone ( ) , error)
667
+ . await
668
+ . context ( "Failed to set subgraph status to `failed`" ) ?;
669
+
670
+ return Err ( err) ;
666
671
}
667
672
}
668
673
}
@@ -774,7 +779,7 @@ where
774
779
Err ( MappingError :: PossibleReorg ( e) ) => {
775
780
info ! ( ctx. state. logger,
776
781
"Possible reorg detected, retrying" ;
777
- "error" => format!( "{:? }" , e. to_string ( ) ) ,
782
+ "error" => format!( "{:# }" , e) ,
778
783
"id" => ctx. inputs. deployment_id. to_string( ) ,
779
784
) ;
780
785
0 commit comments