asfimport opened a new issue, #325:
URL: https://github.com/apache/arrow-java/issues/325

   Reported on the mailing list.
   ```
   
   I had been doing it that way, but I found that If I was sending something
   along the lines of:
   
   ErrorFlightMetadata errorFlightMetadata = new ErrorFlightMetadata();
   errorFlightMetadata.insert("my_custom_key", "hello");
   listener.error(CallStatus.INTERNAL
       .withDescription("Testing description")
       .withCause(new RuntimeException("My cause"))
       .withMetadata(errorFlightMetadata)
       .toRuntimeException());
   
   
   I would only receive the description back by the time it was throwing a
   Python error:
   
   FlightInternalError: gRPC returned internal error, with message:
   Testing description. Client context: IOError: Server never sent a data
   message. Detail: Internal. gRPC client debug context:
   {"created":"@1597858462.086707300","description":"Error received from
   peer 
ipv6:[::1]:12233","file":"src/core/lib/surface/call.cc","file_line":1056,"grpc_message":"Testing
   description","grpc_status":13}
   
   (catching the exception and checking FlightInternalError.extra_info returns
   nothing as well)
   
   However if I manually create a grpc status exception like so:
   
   private static Metadata.Key<byte[]> arrowStatusDetail =
       Metadata.Key.of("x-arrow-status-detail-bin",
   Metadata.BINARY_BYTE_MARSHALLER);
   private static Metadata.Key<byte[]> grpcStatusDetail =
       Metadata.Key.of("grpc-status-details-bin", 
Metadata.BINARY_BYTE_MARSHALLER);
   private static Metadata.Key<String> statusCode =
       Metadata.Key.of("x-arrow-status", Metadata.ASCII_STRING_MARSHALLER);
   private static Metadata.Key<byte[]> message =
       Metadata.Key.of("x-arrow-status-message-bin",
   Metadata.BINARY_BYTE_MARSHALLER);
   
   Metadata metadata = new Metadata();
   metadata.put(arrowStatusDetail, "my_internal_details".getBytes());
   metadata.put(grpcStatusDetail, "this_is_in_extra_info".getBytes());
   metadata.put(statusCode, "1");
   metadata.put(message, "my_internal_message".getBytes());
   return new StatusRuntimeException(Status.INTERNAL, metadata);
   StatusUtils.toGrpcStatus doesn't copy the metadata from the CallStatus into 
the gRPC status it constructs. 
   Then I receive this back on the Python side:
   
   FlightInternalError: my_internal_message. Detail: my_internal_details.
   Client context: IOError: Server never sent a data message. Detail:
   Internal. gRPC client debug context:
   {"created":"@1597859023.244971700","description":"Error received from
   peer 
ipv6:[::1]:12233","file":"src/core/lib/surface/call.cc","file_line":1056,"grpc_message":"","grpc_status":13}
   
   and FlightInternalError.extra_info contains the bytes for
   "this_is_in_extra_info"  - I can pretty much put whatever I need in there
   to add richer metadata and utilize it on the client.
   
   It feels a bit awkward / maybe incorrect to dive into the C++ code to
   hijack those metadata keys just to transport extra metadata from Java ->
   C++. If the above approach with CallStatus is incorrect for bringing extra
   data to the client then let me know.
   
   ```
   StatusUtils.toGrpcStatus doesn't copy the metadata from the CallStatus into 
the gRPC status it constructs; I think that's the issue.
   
   **Reporter**: [David Li](https://issues.apache.org/jira/browse/ARROW-9802) / 
@lidavidm
   
   <sub>**Note**: *This issue was originally created as 
[ARROW-9802](https://issues.apache.org/jira/browse/ARROW-9802). Please see the 
[migration documentation](https://github.com/apache/arrow/issues/14542) for 
further details.*</sub>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@arrow.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to