-
Notifications
You must be signed in to change notification settings - Fork 2.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
On context deadline exceeded
, response headers aren't set
#4250
Comments
Hi, thanks for your issue! I'm a little confused about exactly what the bug is here. From what I can gather, this is the chain of events:
Is this correct? Because as far as I'm concerned there is no way for the server to do anything while the handler is sleeping, and the gRPC client is timing out without waiting for a response. What do you think the gateway is doing wrong here? Nothing has been written on the wire for it to translate, and even if it was, I'm not sure it should. Perhaps you could start by explaining what you were trying to do, and we can see if there's some other way to do it? I would recommend simplifying your test repo to just the essentials too (I assume the OTel observability stuff isn't necessary to exhibit the issue). Thanks! |
Hey @johanbrandhorst, thanks for the fast response 🙇♀️ I've trimmed the repo now 😄
It's likely that it's not a bug, more of a misunderstanding on my part on how to achieve my goal.
Yes, sorry, I wasn't clear. My goal is two-fold.
What part of the interceptor pattern is hard to follow? I thought this was the standard way of implementing middlewares? I can't think of an easier way of setting headers 🤔 In any case, my issue is that if you remove the
This is where i'm seeing cracks on my understanding. I thought that by doing runtime.DefaultContextTimeout = 50 * time.Millisecond i was setting a deadline on the server handler, not on the client. Is there a way of setting a deadline on the server? |
Thanks for your explanation. I should have been clearer about what I mean by "client" and "server". In this case, the grpc-gateway is both a server and client. The timeout you configured is on the client side of the grpc-gateway <-> grpc server connection. The client part of the gateway will not wait for the grpc server to respond before terminating the connection. So when you call In any case, if the timeout was on the grpc server side, you might be able to stop processing and send headers, but you wouldn't be able to use a sleep since it pauses the goroutine completely, you'd have to use a select, like so:
I also think, generally, it's going to be hard to intercept timeouts and set headers in the grpc infrastructure. Perhaps you could write a HTTP middleware around the grpc-gateway which can detect certain status codes and set headers appropriately instead? |
🐛 Bug Report
When a request exceeds
runtime.DefaultContextTimeout
, acontext deadline exceeded
error is returned to the client. However, any prior headers that were set viagrpc.SetHeader
aren't returned to the client.To Reproduce
git clone https://github.com/miparnisari/jaegerGoTest && cd jaegerGoTest && git checkout c0189835bf9d8af8b81636916ef2608dbdf871f3
docker-compose up --build
curl http://localhost:8080/01HVHZX1S19BBD8J8CVW535KB0 -v
Expected behavior
Custom header
Grpc-Metadata-Store-Id-Header: 01HVHZX1S19BBD8J8CVW535KB0
is visible in the responseActual Behavior
Your Environment
The text was updated successfully, but these errors were encountered: