@@ -27,6 +27,7 @@ use data_model::{
27
27
use executor_api_pb:: {
28
28
executor_api_server:: ExecutorApi ,
29
29
AllowedFunction ,
30
+ DataPayloadEncoding ,
30
31
DesiredExecutorState ,
31
32
ExecutorState ,
32
33
ExecutorStatus ,
@@ -361,9 +362,9 @@ impl ExecutorApi for ExecutorAPIService {
361
362
. ok_or ( Status :: invalid_argument ( "compute_fn is required" ) ) ?;
362
363
let invocation_id = request
363
364
. get_ref ( )
364
- . invocation_id
365
+ . graph_invocation_id
365
366
. clone ( )
366
- . ok_or ( Status :: invalid_argument ( "invocation_id is required" ) ) ?;
367
+ . ok_or ( Status :: invalid_argument ( "graph_invocation_id is required" ) ) ?;
367
368
let task = self
368
369
. indexify_state
369
370
. reader ( )
@@ -375,22 +376,10 @@ impl ExecutorApi for ExecutorAPIService {
375
376
& task_id,
376
377
)
377
378
. map_err ( |e| Status :: internal ( e. to_string ( ) ) ) ?;
378
- let output_encoding = request
379
- . get_ref ( )
380
- . output_encoding
381
- . ok_or ( Status :: invalid_argument ( "output_encoding is required" ) ) ?;
382
379
if task. is_none ( ) {
383
380
warn ! ( "Task not found for task_id: {}" , task_id) ;
384
381
return Ok ( Response :: new ( ReportTaskOutcomeResponse { } ) ) ;
385
382
}
386
- let encoding = OutputEncoding :: try_from ( output_encoding)
387
- . map_err ( |e| Status :: invalid_argument ( e. to_string ( ) ) ) ?;
388
- let encoding_str = match encoding {
389
- OutputEncoding :: Json => "application/json" ,
390
- OutputEncoding :: Pickle => "application/octet-stream" ,
391
- OutputEncoding :: Binary => "application/octet-stream" ,
392
- OutputEncoding :: Unknown => "unknown" ,
393
- } ;
394
383
let mut task = task. unwrap ( ) ;
395
384
match task_outcome {
396
385
executor_api_pb:: TaskOutcome :: Success => {
@@ -410,7 +399,8 @@ impl ExecutorApi for ExecutorAPIService {
410
399
for output in request. get_ref ( ) . fn_outputs . clone ( ) {
411
400
let path = output
412
401
. path
413
- . ok_or ( Status :: invalid_argument ( "path is required" ) ) ?;
402
+ . or ( output. uri )
403
+ . ok_or ( Status :: invalid_argument ( "path or uri is required" ) ) ?;
414
404
let size = output
415
405
. size
416
406
. ok_or ( Status :: invalid_argument ( "size is required" ) ) ?;
@@ -422,6 +412,39 @@ impl ExecutorApi for ExecutorAPIService {
422
412
size,
423
413
sha256_hash,
424
414
} ;
415
+ let encoding_str = match output. encoding {
416
+ Some ( value) => {
417
+ let output_encoding = DataPayloadEncoding :: try_from ( value)
418
+ . map_err ( |e| Status :: invalid_argument ( e. to_string ( ) ) ) ?;
419
+ match output_encoding {
420
+ DataPayloadEncoding :: Utf8Json => Ok ( "application/json" ) ,
421
+ DataPayloadEncoding :: BinaryPickle => Ok ( "application/octet-stream" ) ,
422
+ DataPayloadEncoding :: Utf8Text => Ok ( "text/plain" ) ,
423
+ DataPayloadEncoding :: Unknown => {
424
+ Err ( Status :: invalid_argument ( "unknown data payload encoding" ) )
425
+ }
426
+ }
427
+ }
428
+ // Fallback to the deprecated request encoding if not set
429
+ None => match request. get_ref ( ) . output_encoding {
430
+ Some ( value) => {
431
+ let output_encoding = OutputEncoding :: try_from ( value)
432
+ . map_err ( |e| Status :: invalid_argument ( e. to_string ( ) ) ) ?;
433
+ match output_encoding {
434
+ OutputEncoding :: Json => Ok ( "application/json" ) ,
435
+ OutputEncoding :: Pickle => Ok ( "application/octet-stream" ) ,
436
+ OutputEncoding :: Binary => Ok ( "application/octet-stream" ) ,
437
+ OutputEncoding :: Unknown => {
438
+ Err ( Status :: invalid_argument ( "unknown request output encoding" ) )
439
+ }
440
+ }
441
+ }
442
+ None => Err ( Status :: invalid_argument (
443
+ "data payload encoding or request output encoding is required" ,
444
+ ) ) ,
445
+ } ,
446
+ } ?;
447
+
425
448
let node_output = NodeOutputBuilder :: default ( )
426
449
. namespace ( namespace. to_string ( ) )
427
450
. compute_graph_name ( compute_graph. to_string ( ) )
@@ -481,18 +504,20 @@ fn prepare_data_payload(
481
504
if msg. is_none ( ) {
482
505
return None ;
483
506
}
484
- if msg. as_ref ( ) . unwrap ( ) . path . as_ref ( ) . is_none ( ) {
507
+ let msg = msg. unwrap ( ) ;
508
+ if msg. uri . is_none ( ) && msg. path . is_none ( ) {
485
509
return None ;
486
510
}
487
- if msg. as_ref ( ) . unwrap ( ) . size . as_ref ( ) . is_none ( ) {
511
+ if msg. size . as_ref ( ) . is_none ( ) {
488
512
return None ;
489
513
}
490
- if msg. as_ref ( ) . unwrap ( ) . sha256_hash . as_ref ( ) . is_none ( ) {
514
+ if msg. sha256_hash . as_ref ( ) . is_none ( ) {
491
515
return None ;
492
516
}
493
- let msg = msg . unwrap ( ) ;
517
+
494
518
Some ( data_model:: DataPayload {
495
- path : msg. path . unwrap ( ) ,
519
+ // Fallback to deprecated path if uri is not set.
520
+ path : msg. uri . or ( msg. path ) . unwrap ( ) ,
496
521
size : msg. size . unwrap ( ) ,
497
522
sha256_hash : msg. sha256_hash . unwrap ( ) ,
498
523
} )
0 commit comments