mirror of
https://github.com/samba-team/samba.git
synced 2025-03-27 22:50:26 +03:00
ctdb-io: Do not use sys_write to write to client sockets
When sending messages to clients, ctdb checks for EAGAIN error code and schedules next write in the subsequent event loop. Using sys_write in these places causes ctdb to loop hard till a client is able to read from the socket. With real time scheduling, ctdb daemon spins consuming 100% of CPU trying to write to the client sockets. This can be quite harmful when running under VMs or machines with single CPU. This regression was introduced when all read/write calls were replaced to use sys_read/sys_write wrappers (c1558adeaa980fb4bd6177d36250ec8262e9b9fe). The existing code backs off in case of EAGAIN failures and waits for an event loop to process the write again. This should give ctdb clients a chance to get scheduled and to process the ctdb socket. Signed-off-by: Amitay Isaacs <amitay@gmail.com> Reviewed-by: Martin Schwenke <martin@meltin.net> Autobuild-User(master): Martin Schwenke <martins@samba.org> Autobuild-Date(master): Tue Feb 24 12:29:30 CET 2015 on sn-devel-104
This commit is contained in:
parent
84d4270c8e
commit
04a061e4d1
@ -232,9 +232,9 @@ static void queue_io_write(struct ctdb_queue *queue)
|
||||
struct ctdb_queue_pkt *pkt = queue->out_queue;
|
||||
ssize_t n;
|
||||
if (queue->ctdb->flags & CTDB_FLAG_TORTURE) {
|
||||
n = sys_write(queue->fd, pkt->data, 1);
|
||||
n = write(queue->fd, pkt->data, 1);
|
||||
} else {
|
||||
n = sys_write(queue->fd, pkt->data, pkt->length);
|
||||
n = write(queue->fd, pkt->data, pkt->length);
|
||||
}
|
||||
|
||||
if (n == -1 && errno != EAGAIN && errno != EWOULDBLOCK) {
|
||||
@ -310,7 +310,7 @@ int ctdb_queue_send(struct ctdb_queue *queue, uint8_t *data, uint32_t length)
|
||||
queue overhead. This relies on non-blocking sockets */
|
||||
if (queue->out_queue == NULL && queue->fd != -1 &&
|
||||
!(queue->ctdb->flags & CTDB_FLAG_TORTURE)) {
|
||||
ssize_t n = sys_write(queue->fd, data, length2);
|
||||
ssize_t n = write(queue->fd, data, length2);
|
||||
if (n == -1 && errno != EAGAIN && errno != EWOULDBLOCK) {
|
||||
talloc_free(queue->fde);
|
||||
queue->fde = NULL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user