[ 
https://issues.apache.org/jira/browse/ARROW-14014?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

manudebouc updated ARROW-14014:
-------------------------------
    Description: 
When using FlightClient.startPut combined with an AsyncPutListener, we are 
sometimes blocked for ever on FlightClient.ClientStreamListener.getResult() 
because we do not receive error notification.

Due to intermediate proxy we sometime receive 502 or 504 errors and invalid 
{{':status'}} header in trailers that cannot be parsed by 
{{StatusUtils.parseTrailers in SetStreamObserver.onError(Throwable t) 
generating an }}IllegalArgumentException that prevent our listener 
notification, blocking for ever.

{{SEVERE: Exception while executing runnable 
io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed@de593f34
 java.lang.IllegalArgumentException: Invalid character ':' in key name ':status'
 at com.google.common.base.Preconditions.checkArgument(Preconditions.java:275)
 at io.grpc.Metadata$Key.validateName(Metadata.java:742)
 at io.grpc.Metadata$Key.<init>(Metadata.java:750)
 at io.grpc.Metadata$Key.<init>(Metadata.java:668)
 at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:959)
 at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:954)
 at io.grpc.Metadata$Key.of(Metadata.java:705)
 at io.grpc.Metadata$Key.of(Metadata.java:701)
 at org.apache.arrow.flight.grpc.StatusUtils.parseTrailers(StatusUtils.java:164)
 at 
org.apache.arrow.flight.grpc.StatusUtils.fromGrpcStatusAndTrailers(StatusUtils.java:128)
 at 
org.apache.arrow.flight.grpc.StatusUtils.fromGrpcRuntimeException(StatusUtils.java:152)
 at org.apache.arrow.flight.grpc.StatusUtils.fromThrowable(StatusUtils.java:176)
 at 
org.apache.arrow.flight.FlightClient$SetStreamObserver.onError(FlightClient.java:440)
 at 
io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:478)
 at 
io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
 at 
io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
 at 
io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
 at 
org.apache.arrow.flight.grpc.ClientInterceptorAdapter$FlightClientCallListener.onClose(ClientInterceptorAdapter.java:117)
 at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:553)
 at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:68)
 at 
io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:739)
 at 
io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:718)
 at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
 at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
 at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
 at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 at java.lang.Thread.run(Thread.java:823) }}

  was:
When using FlightClient.startPut combined with an AsyncPutListener, we are 
sometimes blocked for ever on FlightClient.ClientStreamListener.getResult() 
because we do not receive error notification.

Due to intermediate proxy we sometime receive 502 or 504 errors and invalid 
{{':status'}} header in trailers that cannot be parsed by 
{{StatusUtils.parseTrailers in SetStreamObserver.onError(Throwable t) 
generating an}}{\{ IllegalArgumentException}}\{{ that prevent our listener 
notification, blocking for ever.}}

{{SEVERE: Exception while executing runnable 
io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed@de593f34
 java.lang.IllegalArgumentException: Invalid character ':' in key name ':status'
 at com.google.common.base.Preconditions.checkArgument(Preconditions.java:275)
 at io.grpc.Metadata$Key.validateName(Metadata.java:742)
 at io.grpc.Metadata$Key.<init>(Metadata.java:750)
 at io.grpc.Metadata$Key.<init>(Metadata.java:668)
 at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:959)
 at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:954)
 at io.grpc.Metadata$Key.of(Metadata.java:705)
 at io.grpc.Metadata$Key.of(Metadata.java:701)
 at org.apache.arrow.flight.grpc.StatusUtils.parseTrailers(StatusUtils.java:164)
 at 
org.apache.arrow.flight.grpc.StatusUtils.fromGrpcStatusAndTrailers(StatusUtils.java:128)
 at 
org.apache.arrow.flight.grpc.StatusUtils.fromGrpcRuntimeException(StatusUtils.java:152)
 at org.apache.arrow.flight.grpc.StatusUtils.fromThrowable(StatusUtils.java:176)
 at 
org.apache.arrow.flight.FlightClient$SetStreamObserver.onError(FlightClient.java:440)
 at 
io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:478)
 at 
io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
 at 
io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
 at 
io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
 at 
org.apache.arrow.flight.grpc.ClientInterceptorAdapter$FlightClientCallListener.onClose(ClientInterceptorAdapter.java:117)
 at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:553)
 at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:68)
 at 
io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:739)
 at 
io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:718)
 at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
 at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
 at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
 at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 at java.lang.Thread.run(Thread.java:823) }}


> FlightClient.ClientStreamListener not notified on error when parsing invalid 
> trailers
> -------------------------------------------------------------------------------------
>
>                 Key: ARROW-14014
>                 URL: https://issues.apache.org/jira/browse/ARROW-14014
>             Project: Apache Arrow
>          Issue Type: Bug
>          Components: Java
>    Affects Versions: 5.0.0
>            Reporter: manudebouc
>            Priority: Major
>
> When using FlightClient.startPut combined with an AsyncPutListener, we are 
> sometimes blocked for ever on FlightClient.ClientStreamListener.getResult() 
> because we do not receive error notification.
> Due to intermediate proxy we sometime receive 502 or 504 errors and invalid 
> {{':status'}} header in trailers that cannot be parsed by 
> {{StatusUtils.parseTrailers in SetStreamObserver.onError(Throwable t) 
> generating an }}IllegalArgumentException that prevent our listener 
> notification, blocking for ever.
> {{SEVERE: Exception while executing runnable 
> io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed@de593f34
>  java.lang.IllegalArgumentException: Invalid character ':' in key name 
> ':status'
>  at com.google.common.base.Preconditions.checkArgument(Preconditions.java:275)
>  at io.grpc.Metadata$Key.validateName(Metadata.java:742)
>  at io.grpc.Metadata$Key.<init>(Metadata.java:750)
>  at io.grpc.Metadata$Key.<init>(Metadata.java:668)
>  at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:959)
>  at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:954)
>  at io.grpc.Metadata$Key.of(Metadata.java:705)
>  at io.grpc.Metadata$Key.of(Metadata.java:701)
>  at 
> org.apache.arrow.flight.grpc.StatusUtils.parseTrailers(StatusUtils.java:164)
>  at 
> org.apache.arrow.flight.grpc.StatusUtils.fromGrpcStatusAndTrailers(StatusUtils.java:128)
>  at 
> org.apache.arrow.flight.grpc.StatusUtils.fromGrpcRuntimeException(StatusUtils.java:152)
>  at 
> org.apache.arrow.flight.grpc.StatusUtils.fromThrowable(StatusUtils.java:176)
>  at 
> org.apache.arrow.flight.FlightClient$SetStreamObserver.onError(FlightClient.java:440)
>  at 
> io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:478)
>  at 
> io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
>  at 
> io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
>  at 
> io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
>  at 
> org.apache.arrow.flight.grpc.ClientInterceptorAdapter$FlightClientCallListener.onClose(ClientInterceptorAdapter.java:117)
>  at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:553)
>  at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:68)
>  at 
> io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:739)
>  at 
> io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:718)
>  at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
>  at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
>  at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>  at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>  at java.lang.Thread.run(Thread.java:823) }}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to