summaryrefslogtreecommitdiffstats
path: root/source3/printing/nt_printing.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2014-02-12 10:13:19 -0800
committerAndreas Schneider <asn@cryptomilk.org>2014-02-18 17:48:30 +0100
commitcd655715b8ee0a4e681d67b3996f71017b941401 (patch)
treeb07d7af7674b6432c06a9b1854c90f25007d9bfd /source3/printing/nt_printing.c
parente2b0d25b70e9a349f804311570b236e4404e8a9e (diff)
downloadsamba-cd655715b8ee0a4e681d67b3996f71017b941401.tar.gz
samba-cd655715b8ee0a4e681d67b3996f71017b941401.tar.xz
samba-cd655715b8ee0a4e681d67b3996f71017b941401.zip
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@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org> Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org> Autobuild-Date(master): Tue Feb 18 17:48:30 CET 2014 on sn-devel-104
Diffstat (limited to 'source3/printing/nt_printing.c')
-rw-r--r--source3/printing/nt_printing.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 376dcfafa8..6a5f2d744a 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