>From that trace log, it looks like this is the same error as in
https://github.com/grpc/grpc-node/issues/2625. It would be helpful to
consolidate further discussions of this error in that issue.

You do need a 'status' event handler if you want to always see trailers,
and it looks like you do want that in your code.

On Thu, Jan 4, 2024 at 9:33 AM Kyaw Thit Lwin <kyaw.thitlwin...@gmail.com>
wrote:

> Hi,
>     first of all, thank you so much for your response and sorry for the
> late reply.
>
>     The below are the logs from client and server regarding to the
> original error, 13 INTERNAL: Received RST_STREAM with code 2 triggered by
> internal client error: Session closed with error code 2.
>
> *Client*
> D 2024-01-04T15:33:21.496Z | v1.9.13 965056 | subchannel_call | [4139]
> sending data chunk of length 22
> D 2024-01-04T15:33:21.496Z | v1.9.13 965056 | load_balancing_call | [4138]
> write() called with message of length 22
> D 2024-01-04T15:33:21.496Z | v1.9.13 965056 | subchannel_call | [4139]
> write() called with message of length 22
> D 2024-01-04T15:33:21.496Z | v1.9.13 965056 | subchannel_call | [4139]
> sending data chunk of length 22
> D 2024-01-04T15:33:21.496Z | v1.9.13 965056 | load_balancing_call | [4138]
> halfClose called
> D 2024-01-04T15:33:21.496Z | v1.9.13 965056 | subchannel_call | [4139]
> end() called
> D 2024-01-04T15:33:21.496Z | v1.9.13 965056 | subchannel_call | [4139]
> calling end() on HTTP/2 stream
> D 2024-01-04T15:33:21.497Z | v1.9.13 965056 | transport | (3)
> 127.0.0.1:50052 connection closed by GOAWAY with code 2 and data undefined
> D 2024-01-04T15:33:21.497Z | v1.9.13 965056 | subchannel | (2)
> 127.0.0.1:50052 READY -> IDLE
> D 2024-01-04T15:33:21.497Z | v1.9.13 965056 | subchannel_refcount | (2)
> 127.0.0.1:50052 refcount 2 -> 1
> D 2024-01-04T15:33:21.497Z | v1.9.13 965056 | pick_first | READY -> IDLE
> D 2024-01-04T15:33:21.497Z | v1.9.13 965056 | resolving_load_balancer |
> dns:localhost:50052 READY -> IDLE
> D 2024-01-04T15:33:21.497Z | v1.9.13 965056 | connectivity_state | (1)
> dns:localhost:50052 READY -> IDLE
> D 2024-01-04T15:33:21.497Z | v1.9.13 965056 | dns_resolver | resolution
> update delayed by "min time between resolutions" rate limit
> D 2024-01-04T15:33:21.497Z | v1.9.13 965056 | resolving_load_balancer |
> dns:localhost:50052 IDLE -> CONNECTING
> D 2024-01-04T15:33:21.497Z | v1.9.13 965056 | connectivity_state | (1)
> dns:localhost:50052 IDLE -> CONNECTING
> D 2024-01-04T15:33:21.498Z | v1.9.13 965056 | subchannel_call | [4139]
> Node error event: message=Session closed with error code 2
> code=ERR_HTTP2_SESSION_ERROR errno=Unknown system error undefined
> syscall=undefined
> D 2024-01-04T15:33:21.498Z | v1.9.13 965056 | subchannel_call | [4139]
> HTTP/2 stream closed with code 2
> D 2024-01-04T15:33:21.498Z | v1.9.13 965056 | subchannel_call | [4139]
> ended with status: code=13 details="Received RST_STREAM with code 2
> triggered by internal client error: Session closed with error code 2"
> D 2024-01-04T15:33:21.498Z | v1.9.13 965056 | load_balancing_call | [4138]
> Received status
> D 2024-01-04T15:33:21.498Z | v1.9.13 965056 | load_balancing_call | [4138]
> ended with status: code=13 details="Received RST_STREAM with code 2
> triggered by internal client error: Session closed with error code 2"
> D 2024-01-04T15:33:21.498Z | v1.9.13 965056 | retrying_call | [4137]
> Received status from child [4138]
> D 2024-01-04T15:33:21.498Z | v1.9.13 965056 | retrying_call | [4137]
> state=TRANSPARENT_ONLY handling status with progress PROCESSED from child
> [4138] in state ACTIVE
> D 2024-01-04T15:33:21.498Z | v1.9.13 965056 | retrying_call | [4137] ended
> with status: code=13 details="Received RST_STREAM with code 2 triggered by
> internal client error: Session closed with error code 2"
> D 2024-01-04T15:33:21.498Z | v1.9.13 965056 | resolving_call | [4136]
> Received status
> D 2024-01-04T15:33:21.498Z | v1.9.13 965056 | resolving_call | [4136]
> ended with status: code=13 details="Received RST_STREAM with code 2
> triggered by internal client error: Session closed with error code 2"
> Received error Error: 13 INTERNAL: Received RST_STREAM with code 2
> triggered by internal client error: Session closed with error code 2
> timestamp expected but doesn't exist in trailer
>
>
> *Server*D 2024-01-04T15:33:21.495Z | v1.9.13 964523 | server_call |
> Received message of length 17
> Received request {"message":"hello metatdata"}
> D 2024-01-04T15:33:21.495Z | v1.9.13 964523 | server_call | Received
> message of length 17
> Received request {"message":"hello metatdata"}
> D 2024-01-04T15:33:21.495Z | v1.9.13 964523 | server_call | Received
> message of length 17
> Received request {"message":"hello metatdata"}
> D 2024-01-04T15:33:21.495Z | v1.9.13 964523 | server_call | Received end
> of stream
> Call end!
> D 2024-01-04T15:33:21.495Z | v1.9.13 964523 | server_call | Request to
> method /grpc.examples.echo.Echo/ClientStreamingEcho ended with status code:
> OK details: OK
> D 2024-01-04T15:33:21.495Z | v1.9.13 964523 | server_call | Request to
> method /grpc.examples.echo.Echo/ClientStreamingEcho stream closed with
> rstCode 0
> D 2024-01-04T15:33:21.496Z | v1.9.13 964523 | server | (1) Received call
> to method /grpc.examples.echo.Echo/ClientStreamingEcho at address null
> D 2024-01-04T15:33:21.496Z | v1.9.13 964523 | server_call | Request to
> /grpc.examples.echo.Echo/ClientStreamingEcho received headers
> {"timestamp":["2024-01-04T15:33:21.496Z"],"grpc-accept-encoding":["identity,deflate,gzip"],"accept-encoding":["identity"],"user-agent":["grpc-node-js/1.9.13"],"content-type":["application/grpc"],"te":["trailers"]}
> Timestamp from metadata:
>  0. 2024-01-04T15:33:21.496Z
> D 2024-01-04T15:33:21.496Z | v1.9.13 964523 | server_call | Received
> message of length 17
> Received request {"message":"hello metatdata"}
> D 2024-01-04T15:33:21.497Z | v1.9.13 964523 | server_call | Request to
> method /grpc.examples.echo.Echo/ClientStreamingEcho stream closed with
> rstCode 7
>
> And from your reply, *On the client side, you do need to pass a function
> for the callback parameter, but it doesn't need to do anything*, *it
> means that I don't necessarily need to listen to `status` event on the
> client side, right?*
>
> Thank you so much.
> On Thursday, January 4, 2024 at 5:52:50 AM UTC+8 Michael Lumish wrote:
>
>> You do need to call the callback on the server to end the call. If I am
>> understanding correctly that those trace logs are from the test where you
>> removed that call. In that case they will not be helpful. It would be
>> helpful to have the logs that show the original error you were experiencing.
>>
>> On the client side, you do need to pass a function for the callback
>> parameter, but it doesn't need to do anything.
>>
>> On Tue, Jan 2, 2024 at 10:47 PM Kyaw Thit Lwin <kyaw.thi...@gmail.com>
>> wrote:
>>
>>> Hi guys, I have some confusions about grpc-js client streaming. Sorry
>>> for the long question.
>>>
>>>     I have encountered multiple errors, 13 INTERNAL: Received
>>> RST_STREAM with code 2 triggered by internal client error: Session closed
>>> with error code 2 during the load testing. May I know what could
>>> trigger this error?
>>>
>>>     I have the following grpc server and client implementation,
>>> referencing from 
>>> *https://github.com/grpc/grpc-node/blob/master/examples/metadata/server.js
>>> <https://github.com/grpc/grpc-node/blob/master/examples/metadata/server.js>*.
>>>
>>> *Client*
>>> function clientStreamingWithMetadata(client, message) {
>>> return new Promise((resolve, reject) => {
>>> const requestMetadata = new grpc.Metadata();
>>> requestMetadata.set('timestamp', new Date().toISOString());
>>> const call = client.clientStreamingEcho(requestMetadata, (error, value)
>>> => {
>>> if (error) {
>>> console.log(`Received error ${error}`);
>>> return;
>>> }
>>> });
>>> call.on('status', status => {
>>> const timestamps = status.metadata.get('timestamp');
>>> if (timestamps.length == 0) {
>>> console.error("timestamp expected but doesn't exist in trailer");
>>> }
>>> resolve();
>>> });
>>> for (let i = 0; i < STREAMING_COUNT; i++) {
>>> call.write({message});
>>> }
>>> call.end();
>>> });
>>> }
>>>
>>>
>>> *Server*
>>> function clientStreamingEcho(call, callback) {
>>> const incomingTimestamps = call.metadata.get('timestamp');
>>> if (incomingTimestamps.length > 0) {
>>> console.log('Timestamp from metadata:');
>>> for (const [index, value] of incomingTimestamps.entries()) {
>>> console.log(` ${index}. ${value}`);
>>> }
>>> }
>>>
>>> let lastReceivedMessage = '';
>>> call.on('data', value => {
>>> console.log(`Received request ${JSON.stringify(value)}`);
>>> lastReceivedMessage = value.message;
>>> });
>>> call.on('end', () => {
>>> console.log("Call end!")
>>> const outgoingTrailers = new grpc.Metadata();
>>> outgoingTrailers.set('timestamp', new Date().toISOString());
>>> callback(null, {message: lastReceivedMessage}, outgoingTrailers);
>>> });
>>> }
>>>
>>> May I also know that do I really need to listen back to the server
>>> callback on stream end initiated by client side?
>>>
>>> I tried running the code by removing the server callback on stream end
>>> event and remove the call.on('status') listener on the client side.
>>> Then the client stream doesn't seem to be ended even after call.end() and
>>> keep pinging the server. These are the logs from server and client.
>>>
>>> *Client*
>>> D 2024-01-03T04:11:09.279Z | v1.9.13 354656 | subchannel_call | [3]
>>> write() called with message of length 32
>>> D 2024-01-03T04:11:09.279Z | v1.9.13 354656 | subchannel_call | [3]
>>> sending data chunk of length 32
>>> D 2024-01-03T04:11:09.279Z | v1.9.13 354656 | load_balancing_call | [2]
>>> halfClose called
>>> D 2024-01-03T04:11:09.279Z | v1.9.13 354656 | subchannel_call | [3]
>>> end() called
>>> D 2024-01-03T04:11:09.279Z | v1.9.13 354656 | subchannel_call | [3]
>>> calling end() on HTTP/2 stream
>>> D 2024-01-03T04:11:10.277Z | v1.9.13 354656 | keepalive | (3)
>>> 127.0.0.1:50052 Sending ping with timeout 20000ms
>>> D 2024-01-03T04:11:10.277Z | v1.9.13 354656 | keepalive | (3)
>>> 127.0.0.1:50052 Received ping response
>>> D 2024-01-03T04:11:10.277Z | v1.9.13 354656 | keepalive | (3)
>>> 127.0.0.1:50052 Starting keepalive timer for 1000ms
>>> D 2024-01-03T04:11:11.278Z | v1.9.13 354656 | keepalive | (3)
>>> 127.0.0.1:50052 Sending ping with timeout 20000ms
>>> D 2024-01-03T04:11:11.278Z | v1.9.13 354656 | keepalive | (3)
>>> 127.0.0.1:50052 Received ping response
>>> D 2024-01-03T04:11:11.278Z | v1.9.13 354656 | keepalive | (3)
>>> 127.0.0.1:50052 Starting keepalive timer for 1000ms
>>> D 2024-01-03T04:11:12.279Z | v1.9.13 354656 | keepalive | (3)
>>> 127.0.0.1:50052 Sending ping with timeout 20000ms
>>> D 2024-01-03T04:11:12.279Z | v1.9.13 354656 | keepalive | (3)
>>> 127.0.0.1:50052 Received ping response
>>> D 2024-01-03T04:11:12.279Z | v1.9.13 354656 | keepalive | (3)
>>> 127.0.0.1:50052 Starting keepalive timer for 1000ms
>>> D 2024-01-03T04:11:13.281Z | v1.9.13 354656 | keepalive | (3)
>>> 127.0.0.1:50052 Sending ping with timeout 20000ms
>>>
>>> *Server*
>>> D 2024-01-03T04:11:09.278Z | v1.9.13 352893 | server_call | Received
>>> message of length 27
>>> Received request {"message":"this is examples/metadata"}
>>> D 2024-01-03T04:11:09.279Z | v1.9.13 352893 | server_call | Received
>>> message of length 27
>>> Received request {"message":"this is examples/metadata"}
>>> D 2024-01-03T04:11:09.279Z | v1.9.13 352893 | server_call | Received
>>> message of length 27
>>> Received request {"message":"this is examples/metadata"}
>>> D 2024-01-03T04:11:09.279Z | v1.9.13 352893 | server_call | Received end
>>> of stream
>>> Call end!
>>> D 2024-01-03T04:11:26.004Z | v1.9.13 352893 | server_call | Request to
>>> method /grpc.examples.echo.Echo/ClientStreamingEcho stream closed with
>>> rstCode 8
>>>
>>> Thank you so much and appreciated any explanation.
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "grpc.io" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to grpc-io+u...@googlegroups.com.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/grpc-io/9b6662fe-d368-45de-a454-a0273f0c1c09n%40googlegroups.com
>>> <https://groups.google.com/d/msgid/grpc-io/9b6662fe-d368-45de-a454-a0273f0c1c09n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>> --
> You received this message because you are subscribed to the Google Groups "
> grpc.io" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to grpc-io+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/grpc-io/a802e930-8ffa-4c1c-a24b-2f2f81e8d353n%40googlegroups.com
> <https://groups.google.com/d/msgid/grpc-io/a802e930-8ffa-4c1c-a24b-2f2f81e8d353n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to grpc-io+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/CAPK2-4ffWGRpyZMym6b%3DQkFeNTs9tEnKmBqcmX%2BVq6ruoU5rog%40mail.gmail.com.

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to