From f308cc1616b1eb504368fbd7a8aac76333869e3c Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 12 Oct 2005 11:04:01 +0000 Subject: r10920: in case of a accept() failure just failing and trying again is no good, as it is probably a resource constraint, so if we just try again we will spin (as the incoming socket will still be readable). Using a sleep(1) solves this by throtting smbd until the resource constraint goes away. if the resource constraint doesn't go away, then at least smbd won't be spinning chewing cpu (This used to be commit 7a5a9da477186b5e4fdb34ec64cc97915de4fd8e) --- source4/smbd/process_single.c | 8 ++++++++ source4/smbd/process_standard.c | 3 +++ source4/smbd/process_thread.c | 6 ++++++ 3 files changed, 17 insertions(+) (limited to 'source4/smbd') diff --git a/source4/smbd/process_single.c b/source4/smbd/process_single.c index 56b074a629..8c9dd2f7fa 100644 --- a/source4/smbd/process_single.c +++ b/source4/smbd/process_single.c @@ -26,6 +26,7 @@ #include "lib/events/events.h" #include "dlinklist.h" #include "smb_server/smb_server.h" +#include "system/filesys.h" /* @@ -51,6 +52,13 @@ static void single_accept_connection(struct event_context *ev, status = socket_accept(sock, &sock2); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("accept_connection_single: accept: %s\n", nt_errstr(status))); + /* this looks strange, but is correct. We need to + throttle things until the system clears enough + resources to handle this new socket. If we don't + then we will spin filling the log and causing more + problems. We don't panic as this is probably a + temporary resource constraint */ + sleep(1); return; } diff --git a/source4/smbd/process_standard.c b/source4/smbd/process_standard.c index 014bd34afd..bbc0aa4c7e 100644 --- a/source4/smbd/process_standard.c +++ b/source4/smbd/process_standard.c @@ -56,6 +56,9 @@ static void standard_accept_connection(struct event_context *ev, if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("standard_accept_connection: accept: %s\n", nt_errstr(status))); + /* this looks strange, but is correct. We need to throttle things until + the system clears enough resources to handle this new socket */ + sleep(1); return; } diff --git a/source4/smbd/process_thread.c b/source4/smbd/process_thread.c index 692cd06724..e5ed74e939 100644 --- a/source4/smbd/process_thread.c +++ b/source4/smbd/process_thread.c @@ -89,6 +89,12 @@ static void thread_accept_connection(struct event_context *ev, status = socket_accept(sock, &state->sock); if (!NT_STATUS_IS_OK(status)) { talloc_free(ev2); + /* We need to throttle things until the system clears + enough resources to handle this new socket. If we + don't then we will spin filling the log and causing + more problems. We don't panic as this is probably a + temporary resource constraint */ + sleep(1); return; } -- cgit