swift/test/unit
Samuel Merritt dc8da5bb19 Use "poll" or "selects" Eventlet hub for all Swift daemons.
Previously, Swift's WSGI servers, the object replicator, and the
object reconstructor were setting Eventlet's hub to either "poll" or
"selects", depending on availability. Other daemons were letting
Eventlet use its default hub, which is "epoll".

In any daemons that fork, we really don't want to use epoll. Epoll
instances end up shared between the parent and all children, and you
get some awful messes when file descriptors are shared.

Here's an example where two processes are trying to wait on the same
file descriptor using the same epoll instance, and everything goes
wrong:

[proc A] epoll_ctl(6, EPOLL_CTL_ADD, 3, ...) = 0

[proc B] epoll_ctl(6, EPOLL_CTL_ADD, 3, ...) = -1 EEXIST (File exists)
[proc B] epoll_wait(6, ...) = 1
[proc B] epoll_ctl(6, EPOLL_CTL_DEL, 3, ...) = 0

[proc A] epoll_wait(6, ...)

This primarily affects the container updater and object updater since
they fork. I've decided to change the hub for all Swift daemons so
that we don't add multiprocessing support to some other daemon someday
and suffer through this same bug again.

This problem was made more apparent by commit 6d16079, which made our
logging mutex use file descriptors. However, it could have struck on
any shared file descriptor on which a read or write returned EAGAIN.

Change-Id: Ic2c1178ac918c88b0b901e581eb4fab3b2666cfe
Closes-Bug: 1722951
2017-10-12 10:45:12 -07:00
..
account Always require device dir for containers 2017-09-01 10:32:12 -07:00
cli Fix swift-ring-builder set_weight with >1 device 2017-10-06 12:53:59 +02:00
common Use "poll" or "selects" Eventlet hub for all Swift daemons. 2017-10-12 10:45:12 -07:00
container Merge "Always require device dir for containers" 2017-09-15 06:51:40 +00:00
obj Preserve X-Static-Large-Object from .data file after POST 2017-09-26 15:14:57 -04:00
proxy test account autocreate listing format 2017-10-09 13:56:26 -07:00
test_locale monkeypatch thread for keystoneclient 2015-11-03 16:36:19 +01:00
__init__.py Always require device dir for containers 2017-09-01 10:32:12 -07:00
helpers.py Move listing formatting out to proxy middleware 2017-09-15 06:38:26 +00:00