[SCM] Samba Shared Repository - branch v3-6-test updated

Jeremy Allison jra at samba.org
Fri Oct 1 16:03:25 MDT 2010


The branch, v3-6-test has been updated
       via  469de19 s3:events: Call all ready fd event handlers on each iteration of the main loop
       via  c1cde72 s3:smbd: Increase unsupported IOCTL debug message to 2
      from  e1fce06 Change to using TDB_INCOMPATIBLE_HASH (the jenkins hash) on all TDB_CLEAR_IF_FIRST tdb's. For tdb's like gencache where we open without CLEAR_IF_FIRST and then with CLEAR_IF_FIRST if corrupt this is still safe to use as if opening an existing tdb the new hash will be ignored - it's only used on creating a new tdb not opening an old one.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test


- Log -----------------------------------------------------------------
commit 469de193d5b0c2aa5d94eaee3b8abc8ef696b51e
Author: Steven Danneman <steven.danneman at isilon.com>
Date:   Mon Sep 13 19:15:23 2010 -0700

    s3:events: Call all ready fd event handlers on each iteration of the main loop
    
    Previously, only one fd handler was being called per main message loop
    in all smbd child processes.
    
    In the case where multiple fds are available for reading the fd
    corresponding to the event closest to the beginning of the event list
    would be run.  Obviously this is arbitrary and could cause unfairness.
    
    Usually, the first event fd is the network socket, meaning heavy load
    of client requests can starve out other fd events such as oplock
    or notify upcalls from the kernel.
    
    In this patch, I have changed the behavior of run_events() to unset
    any fd that it has already called a handler function, as well
    as decrement the number of fds that were returned from select().
    This allows the caller of run_events() to iterate it, until all
    available fds have been handled.
    
    I then changed the main loop in smbd child processes to iterate
    run_events().  This way, all available fds are handled on each wake
    of select, while still checking for timed or signalled events between
    each handler function call.  I also added an explicit check for
    EINTR from select(), which previously was masked by the fact that
    run_events() would handle any signal event before the return code
    was checked.
    
    This required a signature change to run_events() but all other callers
    should have no change in their behavior.  I also fixed a bug in
    run_events() where it could be called with a selrtn value of -1,
    doing unecessary looping through the fd_event list when no fds were
    available.
    
    Also, remove the temporary echo handler hack, as all fds should be
    treated fairly now.

commit c1cde72155772326e9069ef9260b97ffcb243a02
Author: Steven Danneman <steven.danneman at isilon.com>
Date:   Fri Oct 1 12:01:16 2010 -0700

    s3:smbd: Increase unsupported IOCTL debug message to 2
    
    Even printing once per connection, level 0 was too spammy with
    Windows clients frequently sending FSCTL_GET_OBJECT_ID which
    is unsupported.
    (cherry picked from commit 100843ac239688a3c328f834b7a9f90478e2e8f9)

-----------------------------------------------------------------------

Summary of changes:
 source3/include/event.h          |    2 +-
 source3/lib/events.c             |   22 +++++++++++++------
 source3/nmbd/nmbd_packets.c      |    6 ++--
 source3/smbd/nttrans.c           |    6 +++-
 source3/smbd/process.c           |   41 +++++++++++++++++--------------------
 source3/winbindd/winbindd_dual.c |    6 ++--
 6 files changed, 45 insertions(+), 38 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/event.h b/source3/include/event.h
index 493bc15..6b41b1d 100644
--- a/source3/include/event.h
+++ b/source3/include/event.h
@@ -31,7 +31,7 @@ bool event_add_to_select_args(struct event_context *event_ctx,
 			      fd_set *read_fds, fd_set *write_fds,
 			      struct timeval *timeout, int *maxfd);
 bool run_events(struct event_context *event_ctx,
-		int selrtn, fd_set *read_fds, fd_set *write_fds);
+		int *selrtn, fd_set *read_fds, fd_set *write_fds);
 struct timeval *get_timed_events_timeout(struct event_context *event_ctx,
 					 struct timeval *to_ret);
 void dump_event_list(struct event_context *event_ctx);
diff --git a/source3/lib/events.c b/source3/lib/events.c
index 21a13b6..20056a3 100644
--- a/source3/lib/events.c
+++ b/source3/lib/events.c
@@ -66,7 +66,7 @@ bool event_add_to_select_args(struct tevent_context *ev,
 }
 
 bool run_events(struct tevent_context *ev,
-		int selrtn, fd_set *read_fds, fd_set *write_fds)
+		int *selrtn, fd_set *read_fds, fd_set *write_fds)
 {
 	struct tevent_fd *fde;
 	struct timeval now;
@@ -111,7 +111,7 @@ bool run_events(struct tevent_context *ev,
 		return true;
 	}
 
-	if (selrtn == 0) {
+	if (*selrtn <= 0) {
 		/*
 		 * No fd ready
 		 */
@@ -121,8 +121,16 @@ bool run_events(struct tevent_context *ev,
 	for (fde = ev->fd_events; fde; fde = fde->next) {
 		uint16 flags = 0;
 
-		if (FD_ISSET(fde->fd, read_fds)) flags |= EVENT_FD_READ;
-		if (FD_ISSET(fde->fd, write_fds)) flags |= EVENT_FD_WRITE;
+		if (FD_ISSET(fde->fd, read_fds)) {
+			flags |= EVENT_FD_READ;
+			FD_CLR(fde->fd, read_fds);
+			(*selrtn)--;
+		}
+		if (FD_ISSET(fde->fd, write_fds)) {
+			flags |= EVENT_FD_WRITE;
+			FD_CLR(fde->fd, write_fds);
+			(*selrtn)--;
+		}
 
 		if (flags & fde->flags) {
 			fde->handler(ev, fde, flags, fde->private_data);
@@ -161,7 +169,7 @@ static int s3_event_loop_once(struct tevent_context *ev, const char *location)
 	struct timeval now, to;
 	fd_set r_fds, w_fds;
 	int maxfd = 0;
-	int ret;
+	int ret = 0;
 
 	FD_ZERO(&r_fds);
 	FD_ZERO(&w_fds);
@@ -169,7 +177,7 @@ static int s3_event_loop_once(struct tevent_context *ev, const char *location)
 	to.tv_sec = 9999;	/* Max timeout */
 	to.tv_usec = 0;
 
-	if (run_events(ev, 0, NULL, NULL)) {
+	if (run_events(ev, &ret, NULL, NULL)) {
 		return 0;
 	}
 
@@ -188,7 +196,7 @@ static int s3_event_loop_once(struct tevent_context *ev, const char *location)
 		return -1;
 	}
 
-	run_events(ev, ret, &r_fds, &w_fds);
+	run_events(ev, &ret, &r_fds, &w_fds);
 	return 0;
 }
 
diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c
index 2dd218a..0709742 100644
--- a/source3/nmbd/nmbd_packets.c
+++ b/source3/nmbd/nmbd_packets.c
@@ -1839,7 +1839,7 @@ bool listen_for_packets(bool run_election)
 
 	fd_set r_fds;
 	fd_set w_fds;
-	int selrtn;
+	int selrtn = 0;
 	struct timeval timeout;
 #ifndef SYNC_DNS
 	int dns_fd;
@@ -1866,7 +1866,7 @@ bool listen_for_packets(bool run_election)
 #endif
 
 	/* Process a signal and timer events now... */
-	if (run_events(nmbd_event_context(), 0, NULL, NULL)) {
+	if (run_events(nmbd_event_context(), &selrtn, NULL, NULL)) {
 		return False;
 	}
 
@@ -1888,7 +1888,7 @@ bool listen_for_packets(bool run_election)
 
 	selrtn = sys_select(maxfd+1,&r_fds,&w_fds,NULL,&timeout);
 
-	if (run_events(nmbd_event_context(), selrtn, &r_fds, &w_fds)) {
+	if (run_events(nmbd_event_context(), &selrtn, &r_fds, &w_fds)) {
 		return False;
 	}
 
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index c95784e..765def3 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -2348,9 +2348,11 @@ static void call_nt_transact_ioctl(connection_struct *conn,
 		return;
 	}
 	default:
+		/* Only print this once... */
 		if (!logged_ioctl_message) {
-			logged_ioctl_message = true; /* Only print this once... */
-			DEBUG(0,("call_nt_transact_ioctl(0x%x): Currently not implemented.\n",
+			logged_ioctl_message = true;
+			DEBUG(2,("call_nt_transact_ioctl(0x%x): "
+				 "Currently not implemented.\n",
 				 function));
 		}
 	}
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index 3eb957e..6ceb515 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -932,7 +932,7 @@ void smbd_setup_sig_hup_handler(void)
 static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *conn)
 {
 	fd_set r_fds, w_fds;
-	int selrtn;
+	int selrtn = 0;
 	struct timeval to;
 	int maxfd = 0;
 
@@ -960,7 +960,7 @@ static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *
 	}
 
 	/* Process a signal and timed events now... */
-	if (run_events(smbd_event_context(), 0, NULL, NULL)) {
+	if (run_events(smbd_event_context(), &selrtn, NULL, NULL)) {
 		return NT_STATUS_RETRY;
 	}
 
@@ -977,26 +977,23 @@ static NTSTATUS smbd_server_connection_loop_once(struct smbd_server_connection *
 
 	/* Check if error */
 	if (selrtn == -1) {
-		/* something is wrong. Maybe the socket is dead? */
-		return map_nt_error_from_unix(errno);
+		if (errno == EINTR)
+			return NT_STATUS_RETRY;
+		else
+			/* Maybe the socket is dead? */
+			return map_nt_error_from_unix(errno);
 	}
 
-        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;
-	}
+	/* Process events until all available fds have been handled.
+	 * This allows for fair round-robin handling of all available fds
+	 * on each select() wakeup, while still maintaining responsiveness
+	 * by re-checking for signal and timed events between the handling
+	 * of each ready fd. */
+	do {
+		run_events(smbd_event_context(), &selrtn, &r_fds, &w_fds);
+	} while (selrtn > 0);
 
-	/* Did we timeout ? */
+	/* Processed all fds or timed out */
 	if (selrtn == 0) {
 		return NT_STATUS_RETRY;
 	}
diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c
index a6cc64a..05f0706 100644
--- a/source3/winbindd/winbindd_dual.c
+++ b/source3/winbindd/winbindd_dual.c
@@ -1373,7 +1373,7 @@ static bool fork_domain_child(struct winbindd_child *child)
 
 	while (1) {
 
-		int ret;
+		int ret = 0;
 		fd_set r_fds;
 		fd_set w_fds;
 		int maxfd;
@@ -1385,7 +1385,7 @@ static bool fork_domain_child(struct winbindd_child *child)
 		int iov_count;
 		NTSTATUS status;
 
-		if (run_events(winbind_event_context(), 0, NULL, NULL)) {
+		if (run_events(winbind_event_context(), &ret, NULL, NULL)) {
 			TALLOC_FREE(frame);
 			continue;
 		}
@@ -1423,7 +1423,7 @@ static bool fork_domain_child(struct winbindd_child *child)
 
 		ret = sys_select(maxfd + 1, &r_fds, &w_fds, NULL, tp);
 
-		if (run_events(winbind_event_context(), ret, &r_fds, &w_fds)) {
+		if (run_events(winbind_event_context(), &ret, &r_fds, &w_fds)) {
 			/* We got a signal - continue. */
 			TALLOC_FREE(frame);
 			continue;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list