[SCM] Samba Shared Repository - branch master updated

Andreas Schneider asn at samba.org
Tue Feb 18 09:49:04 MST 2014


The branch, master has been updated
       via  cd65571 s3: printing: Fix problem with server taking too long to respond to a MSG_PRINTER_DRVUPGRADE message.
      from  e2b0d25 testprogs: Use system binary if we did not build ldbdel.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit cd655715b8ee0a4e681d67b3996f71017b941401
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Feb 12 10:13:19 2014 -0800

    s3: printing: Fix problem with server taking too long to respond to a MSG_PRINTER_DRVUPGRADE message.
    
    Receiving a MSG_PRINTER_DRVUPGRADE causes
    smbd to iterate over all printers looking
    for ones that uses the driver. This is a very
    expensive operation requiring a read of all
    registry printer parameters.
    
    On a system with a large number of printers,
    this causes the clients to timeout (smbd
    can take longer than 60 seconds to respond).
    
    This patch fixes the problem by forwarding
    the MSG_PRINTER_DRVUPGRADE to the background
    lpq queue updater process and allowing it to
    take care of the updating of the changeid
    in the registry, allowing the smbd connected
    to the client to return to processing requests
    immediately.
    
    https://bugzilla.samba.org/show_bug.cgi?id=9942
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    
    Autobuild-User(master): Andreas Schneider <asn at cryptomilk.org>
    Autobuild-Date(master): Tue Feb 18 17:48:30 CET 2014 on sn-devel-104

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

Summary of changes:
 source3/printing/nt_printing.c              |   29 +++++++++++++++++++++++++-
 source3/printing/queue_process.c            |    6 +++++
 source3/rpc_server/spoolss/srv_spoolss_nt.c |    1 +
 3 files changed, 34 insertions(+), 2 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 376dcfa..6a5f2d7 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -132,6 +132,31 @@ static bool print_driver_directories_init(void)
 }
 
 /****************************************************************************
+ Forward a MSG_PRINTER_DRVUPGRADE message from another smbd to the
+ background lpq updater.
+****************************************************************************/
+
+static void forward_drv_upgrade_printer_msg(struct messaging_context *msg,
+				void *private_data,
+				uint32_t msg_type,
+				struct server_id server_id,
+				DATA_BLOB *data)
+{
+	extern pid_t background_lpq_updater_pid;
+
+	if (background_lpq_updater_pid == -1) {
+		DEBUG(3,("no background lpq queue updater\n"));
+		return;
+	}
+
+	messaging_send_buf(msg,
+			pid_to_procid(background_lpq_updater_pid),
+			MSG_PRINTER_DRVUPGRADE,
+			data->data,
+			data->length);
+}
+
+/****************************************************************************
  Open the NT printing tdbs. Done once before fork().
 ****************************************************************************/
 
@@ -149,10 +174,10 @@ bool nt_printing_init(struct messaging_context *msg_ctx)
 
 	/*
 	 * register callback to handle updating printers as new
-	 * drivers are installed
+	 * drivers are installed. Forwards to background lpq updater.
 	 */
 	messaging_register(msg_ctx, NULL, MSG_PRINTER_DRVUPGRADE,
-			   do_drv_upgrade_printer);
+			forward_drv_upgrade_printer_msg);
 
 	/* of course, none of the message callbacks matter if you don't
 	   tell messages.c that you interested in receiving PRINT_GENERAL
diff --git a/source3/printing/queue_process.c b/source3/printing/queue_process.c
index bc6c33f..aa0d0fb 100644
--- a/source3/printing/queue_process.c
+++ b/source3/printing/queue_process.c
@@ -32,6 +32,7 @@
 #include "smbd/smbd.h"
 #include "rpc_server/rpc_config.h"
 #include "printing/load.h"
+#include "rpc_server/spoolss/srv_spoolss_nt.h"
 
 extern pid_t start_spoolssd(struct tevent_context *ev_ctx,
 			    struct messaging_context *msg_ctx);
@@ -314,6 +315,11 @@ pid_t start_background_queue(struct tevent_context *ev,
 				   bq_smb_conf_updated);
 		messaging_register(msg_ctx, NULL, MSG_PRINTER_UPDATE,
 				   print_queue_receive);
+		/* Remove previous forwarder message set in parent. */
+		messaging_deregister(msg_ctx, MSG_PRINTER_DRVUPGRADE, NULL);
+
+		messaging_register(msg_ctx, NULL, MSG_PRINTER_DRVUPGRADE,
+				   do_drv_upgrade_printer);
 
 		fde = tevent_add_fd(ev, ev, pause_pipe[1], TEVENT_FD_READ,
 				    printing_pause_fd_handler,
diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c
index dc90b77..1305b10 100644
--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
+++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
@@ -1515,6 +1515,7 @@ void srv_spoolss_cleanup(void)
 /**********************************************************************
  callback to receive a MSG_PRINTER_DRVUPGRADE message and interate
  over all printers, upgrading ones as necessary
+ This is now *ONLY* called inside the background lpq updater. JRA.
  **********************************************************************/
 
 void do_drv_upgrade_printer(struct messaging_context *msg,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list