-
Notifications
You must be signed in to change notification settings - Fork 22
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
Fix treatment of async exceptions #138
Fix treatment of async exceptions #138
Conversation
I checked all uses of
I also checked onTimeout `E.catch` ignoreAll The intention here is I think to ignore exceptions thrown by the timeout handler itself, so it's indeed correct to not catch async exceptions here. Left this one unchanged also. |
After discussing with @khibino some days ago, I began to think that asynchronous exceptions are a bad pattern in Haskell network programming. |
I think the test failure we're seeing is unrelated to this PR. I can produce it on my machine on
(then timeout). It happens only very rarely, but it does happen. I'm also seeing these show up from time to time, on
|
6114db7
to
23685aa
Compare
Have rebased on latest |
Asynchronous are indeed notoriously difficult to deal with. Removing them from This feels like quite a large design departure (though a compat shim could be provided that just spawns an additional thread, waitings on the |
Threads should check STM in the beginning of each loop. import Control.Concurrent
import Control.Concurrent.STM
import System.Posix.Types
checkReadAvailable :: Socket -> IO (STM (), IO ())
checkReadAvailable s = withFdSocket s $ \fd -> threadWaitReadSTM $ Fd fd Timeout can be implemented with SystemTimerManager. |
Yes, a polling setup like you describe is possible. |
Yes. @khibino and I actually use it in |
Thanks. I will ping you! |
Yup, will do! |
23685aa
to
22d1fc1
Compare
In kazu-yamamoto#92 we added an exception handler that was meant to catch _all_ exceptions (sync and async). This got changed in kazu-yamamoto#114 (specifically, kazu-yamamoto@52a9619): when we moved from `Control.Exception` to `UnliftIO.Exception`, we got a different behaviour for `catch` and friends (see well-typed/grapesy#193 (comment)) for a full list. This commit fixes some unintended consequences of this change.
22d1fc1
to
e753c9f
Compare
@kazu-yamamoto I have rebased (and also ran |
Ok, the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Merged. |
Thanks @kazu-yamamoto ! |
# ChangeLog for http2 ## 5.3.9 * Using `ThreadManager` of `time-manager`. ## 5.3.8 * `forkManagedTimeout` ensures that only one asynchronous exception is thrown. Fixing the thread leak via `Weak ThreadId` and `modifyTVar'`. [#156](kazu-yamamoto/http2#156) ## 5.3.7 * Using `withHandle` of time-manager. * Getting `Handle` for each thread. * Providing allocSimpleConfig' to enable customizing WAI tiemout manager. * Monitor option (-m) for h2c-client and h2c-server. ## 5.3.6 * Making `runIO` friendly with the new synchronism mechanism. [#152](kazu-yamamoto/http2#152) * Re-throwing asynchronous exceptions to prevent thread leak. * Simplifying the synchronism mechanism between workers and the sender. [#148](kazu-yamamoto/http2#148) ## 5.3.5 * Using `http-semantics` v0.3. * Deprecating `numberOfWorkers`. * Removing `unliftio`. * Avoid `undefined` in client. [#146](kazu-yamamoto/http2#146) ## 5.3.4 * Support stream cancellation [#142](kazu-yamamoto/http2#142) ## 5.3.3 * Enclosing IPv6 literal authority with square brackets. [#143](kazu-yamamoto/http2#143) ## 5.3.2 * Avoid unnecessary empty data frames at end of stream [#140](kazu-yamamoto/http2#140) * Removing unnecessary API from ServerIO ## 5.3.1 * Fix treatment of async exceptions [#138](kazu-yamamoto/http2#138) * Avoid race condition [#137](kazu-yamamoto/http2#137) ## 5.3.0 * New server architecture: spawning worker on demand instead of the worker pool. This reduce huge numbers of threads for streaming into only 2. No API changes but workers do not terminate quicly. Rather workers collaborate with the sender after queuing a response and finish after all response data are sent. * All threads are labeled with `labelThread`. You can see them by `listThreas` if necessary. ## 5.2.6 * Recover rxflow on closing. [#126](kazu-yamamoto/http2#126) * Fixing ClientSpec for stream errors. * Allowing negative window. (h2spec http2/6.9.2) * Update for latest http-semantics [#122](kazu-yamamoto/http2#124) ## 5.2.5 * Setting peer initial window size properly. [#123](kazu-yamamoto/http2#123) ## 5.2.4 * Update for latest http-semantics [#122](kazu-yamamoto/http2#122) * Measuring performance concurrently for h2c-client ## 5.2.3 * Update for latest http-semantics [#120](kazu-yamamoto/http2#120) * Enable containers 0.7 (ghc 9.10) [#117](kazu-yamamoto/http2#117) ## 5.2.2 * Mark final chunk as final [#116](kazu-yamamoto/http2#116)
In #92 we added an exception handler that was meant to catch all exceptions (sync and async). This got changed in #114 (specifically, 52a9619): when we moved from
Control.Exception
toUnliftIO.Exception
, we got a different behaviour forcatch
and friends (see well-typed/grapesy#193 (comment)) for a full list. This commit fixes some unintended consequences of this change.I tried to do an exhaustive check of all uses of these functions in
http2
, I'll post a full report separately.