Comments (9)
BTW, I was able to refactor an existing test to consistently trigger this race: master...request_dispatch_race
from tarpc.
Thanks for raising this issue! I'll try to take a closer look this week, but also, feel free to send a PR for review.
from tarpc.
Could I see your code where the problem occurs? I'm curious how the RequestDispatch is being polled. When it hits an error, is it dropped?
from tarpc.
Can you see if this branch fixes the problem for you? https://github.com/tikue/tarpc/tree/request_dispatch_race
from tarpc.
Can you see if this branch fixes the problem for you? https://github.com/tikue/tarpc/tree/request_dispatch_race
Thanks a lot for implementing it @tikue! I tried it out and, unfortunately, this still results in the same problem. But your code LGTM in general. So I suspect that this may be due to the use of ready!
here, which may be returned due to spurious failures and I think returns something else compared to the desired return Poll::Ready(Err(e));
. Also note that the PR I created consistently doesn't have this problem.
from tarpc.
Hm, but the ready!
macro only returns Poll::Pending
if the underlying future being polled also returns Pending
. The dispatch future should continue to be polled after that, right? If it's a spurious failure, than the mpsc receiver should have already arranged for a wakeup.
The problem with polling in a loop even when pending is returned is that it blocks in a nonblocking function. For example, a sender may have reserved a permit and then subsequently went to sleep for an hour. We don't want to block a Tokio thread for an hour waiting for the client to wake up, as there could be other async tasks that need to run in the meantime.
from tarpc.
Oh, true, you're right - the code should work just fine like that!
Also, I just noticed something strange in my tests. Although you changed the propagated error a little, my tests worked. But now when I try to reproduce my tests, I need to adjust the expected error message. Maybe I or cargo did something wrong, let me test it again.
from tarpc.
So the test has been running repeatedly for more than 20min now and no errors so far. Sorry for causing confusion earlier and thanks again for implementing the fix @tikue !
from tarpc.
That's great news, thanks for confirming! Yeah, I changed the client errors a little since more types of channel errors are propagated now. I might still revisit them a bit. (benefits of being perpetually pre-1.0...)
from tarpc.
Related Issues (20)
- Cross Platform Procedure Call HOT 2
- [FEATURE REQUEST] Stream responses HOT 4
- QUESTION: how to get tcp server features for custom transport? HOT 1
- Consider making tracing optional HOT 8
- Bubble up server side transport errors to the client HOT 5
- Design problem, how to call other structs method ?
- Server-side span with client’s span as parent HOT 3
- Recommended way for connection pooling? HOT 4
- Support for Async Fn in Trait? HOT 3
- Generic type parameters HOT 4
- Adding client ID to identify clients (and retrieve specific context)? HOT 2
- Associated data with client
- Future returned by `Serve::serve()` is not `Send` HOT 11
- Add a way to derive Clone for the generated Request and Response types HOT 5
- Rkyv support?
- Json support and automatic documentation generation HOT 2
- Feature: cli support for translating defined placeholder to generate proto from codebase directly
- tarpc make crash when c++ Destructor execute
- Distributed tracing with TextMapPropagator
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from tarpc.