summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2010-06-08 14:33:05 +0200
committerVolker Lendecke <vl@samba.org>2010-06-11 10:58:54 +0200
commitd5cf6482ed0cd9a11448ca04944b2e01200a7c89 (patch)
tree5de7b219194bc76d54c9a55630fd5a0c892f7ef9
parentb61fa4b67686aa5df69c28ca86d8d26aaa3ba9d4 (diff)
downloadsamba-d5cf6482ed0cd9a11448ca04944b2e01200a7c89.tar.gz
samba-d5cf6482ed0cd9a11448ca04944b2e01200a7c89.tar.bz2
samba-d5cf6482ed0cd9a11448ca04944b2e01200a7c89.zip
s3: Fix starving the echo responder
When both the echo responder and the 445 socket want to send stuff to the worker smbd, the select loop is not fair. It always chooses the smaller file descriptor to work on. This can mean that on a busy system the echo responder never gets around to feed its stuff to the parent. This fix chooses the async echo responder socket when both the 445 and the echo responder socket are readable. Yes, it is a very hackish fix which is required *now* I think. The proper fix would be to either assign priorities to fd's in tevent, or the from my point of view better fix would be to make tevent kindof round-robin. Round-robin would mean that whenever a fd has been dealt with, it is taken off the list of interested sockets, and only if no other socket is active, all of the ones waiting are put back. This is a bit like EPOLL_ONESHOT, which I would like to use for this in the epoll case. Although, I need to do some research if maybe epoll already guarantees round-robin, I did not find anything in the docs yet. Volker
-rw-r--r--source3/smbd/process.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index 1baf3538c6..9dc43c4bf3 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -971,6 +971,17 @@ static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *
errno = sav;
}
+ if ((conn->smb1.echo_handler.trusted_fd != -1)
+ && FD_ISSET(smbd_server_fd(), &r_fds)
+ && FD_ISSET(conn->smb1.echo_handler.trusted_fd, &r_fds)) {
+ /*
+ * Prefer to read pending requests from the echo handler. To
+ * quote Jeremy (da70f8ab1): This is a hack of monstrous
+ * proportions...
+ */
+ FD_CLR(smbd_server_fd(), &r_fds);
+ }
+
if (run_events(smbd_event_context(), selrtn, &r_fds, &w_fds)) {
return NT_STATUS_RETRY;
}