aboutsummaryrefslogtreecommitdiff
path: root/src/core/aio.c
Commit message (Collapse)AuthorAge
* Thundering herd kills performance.Garrett D'Amore2017-08-10
| | | | | | | | | | | | | | A little benchmarking showed that we were encountering far too many wakeups, leading to severe performance degradation; we had a bunch of threads all sleeping on the same condition variable (taskqs) and this woke them all up, resulting in heavy mutex contention. Since we only need one of the threads to wake, and we don't care which one, let's just wake only one. This reduced RTT latency from about 240 us down to about 30 s. (1/8 of the former cost.) There's still a bunch of tuning to do; performance remains worse than we would like.
* Don't clear the AIO provider data in finish.Garrett D'Amore2017-08-07
| | | | | | The finish routine can race against an asynchronous cancellation, so we must not clear the data pointer, or we can wind up with a NULL pointer dereference.
* Subsystem initialize is idempotent; simplify cleanup.Garrett D'Amore2017-08-07
|
* Refactor AIO logic to close numerous races and reduce complexity.Garrett D'Amore2017-08-04
| | | | | | | | | This passes valgrind 100% clean for both helgrind and deep leak checks. This represents a complete rethink of how the AIOs work, and much simpler synchronization; the provider API is a bit simpler to boot, as a number of failure modes have been simply eliminated. While here a few other minor bugs were squashed.
* Eliminate the separate AIO wake callback, making nni_aio_waitGarrett D'Amore2017-07-21
| | | | block for any AIO completion.
* Simpler taskq API.Garrett D'Amore2017-07-21
| | | | | | | The queue is bound at initialization time of the task, and we call entries just tasks, so we don't have to pass around a taskq pointer across all the calls. Further, nni_task_dispatch is now guaranteed to succeed.
* Yet more race condition fixes.Garrett D'Amore2017-07-20
| | | | | | | | | We need to remember that protocol stops can run synchronously, and therefore we need to wait for the aio to complete. Further, we need to break apart shutting down aio activity from deallocation, as we need to shut down *all* async activity before deallocating *anything*. Noticed that we had a pipe race in the surveyor pattern too.
* Always run the AIO completion logic.Garrett D'Amore2017-07-19
| | | | | | | | We have seen some yet another weird situation where we had an orphaned pipe, which was caused by not completing the callback. If we are going to run nni_aio_fini, we should still run the callback (albeit with a return value of NNG_ECANCELED or somesuch) to be sure that we can't orphan stuff.
* Fixes most of the raaces in posix; but at least one remains outstanding.Garrett D'Amore2017-07-18
| | | | | | Apparently there are circumstances when a pipedesc may get orphaned form the pollq. This triggers an assertion failure when it occurs. I am still trying to understand how this can occur. Stay tuned.
* Sometimes providers don't clear the prov data details. (Backoff).Garrett D'Amore2017-07-18
|
* Fix close-related leak of pipes.Garrett D'Amore2017-07-18
| | | | | | | | | | | We have seen leaks of pipes causing test failures (e.g. the Windows IPC test) due to EADDRINUSE. This was caused by a case where we failed to pass the pipe up because the AIO had already been canceled, and we didn't realize that we had oprhaned the pipe. The fix is to add a return value to nni_aio_finish, and verify that we did finish properly, or if we did not then we must free the pipe ourself. (The zero return from nni_aio_finish indicates that it accepts ownership of resources passed via the aio.)
* AIO timeouts work correctly now, using their own timer logic.Garrett D'Amore2017-07-16
| | | | | | | | We closed a few subtle races in the AIO subsystem as well, and now we were able to eliminate the separate timer handling the MQ code. There appear to be some opportunities to further enhance the code for MQs as well -- eventually probably the only access to MQs will be with AIOs.
* Race conditions removed... TCP tests work well know.Garrett D'Amore2017-07-15
|
* Give up on uncrustify; switch to clang-format.Garrett D'Amore2017-07-10
|
* Fixes for async resolver, plus a test suite for it.Garrett D'Amore2017-07-06
|
* Improved routines for list management.Garrett D'Amore2017-07-04
|
* inproc transport uses aio for connect/accept.Garrett D'Amore2017-07-03
|
* Pass cancel of IPC and TCP all the way down to POSIX pipedescs.Garrett D'Amore2017-06-29
|
* Refactor stop again, closing numerous races (thanks valgrind!)Garrett D'Amore2017-06-28
|
* Fix taskq_cancel race.Garrett D'Amore2017-06-08
|
* Start of close related race fixes. Scalability test.Garrett D'Amore2017-03-10
|
* Pipeline protocol now entirely callback driven.Garrett D'Amore2017-03-04
|
* Timer implementation. Operations can timeout now?Garrett D'Amore2017-03-03
|
* Start of msgq aio.Garrett D'Amore2017-03-01
|
* Rename ioev to aio. Eliminate generic cancel handling (not needed).Garrett D'Amore2017-02-23
We will still need some kind of specific handling of cancellation for msg queues, but it will be simpler to just implement that for the queues, and not worry about cancellation in the general case around poll etc. (The low level poll and I/O routines will get notified by their underlying transport pipes/descriptors closing.)