@@ -21,35 +21,71 @@ impl TaskResponder {
21
21
compute_message : & DriaMessage ,
22
22
channel : ResponseChannel < Vec < u8 > > ,
23
23
) -> Result < ( TaskWorkerInput , TaskWorkerMetadata ) > {
24
+ // parse this in two-steps so that if something goes wrong we know the task id
24
25
let task = compute_message
25
- . parse_payload :: < TaskRequestPayload < TaskBody > > ( )
26
- . wrap_err ( "could not parse task payload" ) ?;
26
+ . parse_payload :: < TaskRequestPayload < serde_json:: Value > > ( )
27
+ . wrap_err ( "could not parse task request payload" ) ?;
28
+ let task_body = match serde_json:: from_value :: < TaskBody > ( task. input )
29
+ . wrap_err ( "could not parse task body" )
30
+ {
31
+ Ok ( task_body) => task_body,
32
+ Err ( err) => {
33
+ let err_string = format ! ( "{:#}" , err) ;
34
+ log:: error!(
35
+ "Task {}/{} failed due to parsing error: {}" ,
36
+ task. file_id,
37
+ task. task_id,
38
+ err_string
39
+ ) ;
40
+
41
+ // prepare error payload
42
+ let error_payload = TaskResponsePayload {
43
+ result : None ,
44
+ error : Some ( err_string) ,
45
+ row_id : task. row_id ,
46
+ file_id : task. file_id ,
47
+ task_id : task. task_id ,
48
+ model : Default :: default ( ) ,
49
+ stats : TaskStats :: new ( ) ,
50
+ } ;
51
+
52
+ let error_payload_str = serde_json:: to_string ( & error_payload)
53
+ . wrap_err ( "could not serialize payload" ) ?;
54
+
55
+ // respond through the channel to notify about the parsing error
56
+ let response = node. new_message ( error_payload_str, TASK_RESULT_TOPIC ) ;
57
+ node. p2p . respond ( response. into ( ) , channel) . await ?;
58
+
59
+ return Err ( err) ;
60
+ }
61
+ } ;
62
+
27
63
let stats = TaskStats :: new ( ) . record_received_at ( ) ;
28
64
log:: info!(
29
65
"Handling {} {} with model {}" ,
30
66
"task" . yellow( ) ,
31
67
task. row_id,
32
- task . input . model. to_string( ) . yellow( )
68
+ task_body . model. to_string( ) . yellow( )
33
69
) ;
34
70
35
71
// check if the model is available in this node, if so
36
72
// it will return an executor that can run this model
37
73
let executor = node
38
74
. config
39
75
. executors
40
- . get_executor ( & task . input . model )
76
+ . get_executor ( & task_body . model )
41
77
. await
42
78
. wrap_err ( "could not get an executor" ) ?;
43
79
44
80
let task_metadata = TaskWorkerMetadata {
45
81
task_id : task. task_id ,
46
82
file_id : task. file_id ,
47
- model_name : task . input . model . to_string ( ) ,
83
+ model_name : task_body . model . to_string ( ) ,
48
84
channel,
49
85
} ;
50
86
let task_input = TaskWorkerInput {
51
87
executor,
52
- task : task . input ,
88
+ task : task_body ,
53
89
row_id : task. row_id ,
54
90
stats,
55
91
} ;
0 commit comments