summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Disseldorp <ddiss@samba.org>2014-07-23 14:42:00 +0200
committerAndreas Schneider <asn@cryptomilk.org>2014-08-08 14:10:39 +0200
commita2182e03a061de6c1f111ce083cb5f668fe75e4e (patch)
tree78f3e088a16bf443ba0b39c96f9dbe7dc1d3dcfb
parent30ce835670a6aeca6fb960ea7c4fe1b982bdd5b0 (diff)
downloadsamba-a2182e03a061de6c1f111ce083cb5f668fe75e4e.tar.gz
samba-a2182e03a061de6c1f111ce083cb5f668fe75e4e.tar.xz
samba-a2182e03a061de6c1f111ce083cb5f668fe75e4e.zip
smbd: only reprocess printer_list.tdb if it changed
The per-client smbd printer share inventory is currently updated from printer_list.tdb when a client enumerates printers, via EnumPrinters or NetShareEnum. printer_list.tdb is populated by the background print process, based on the latest printcap values retrieved from the printing backend (e.g. CUPS) at regular intervals. This change ensures that per-client smbd processes don't reparse printer_list.tdb if it hasn't been updated since the last enumeration. Bug: https://bugzilla.samba.org/show_bug.cgi?id=10652 Suggested-by: Volker Lendecke <vl@samba.org> Signed-off-by: David Disseldorp <ddiss@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org>
-rw-r--r--source3/smbd/server_reload.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/source3/smbd/server_reload.c b/source3/smbd/server_reload.c
index 627ad8ba22..1477f00c96 100644
--- a/source3/smbd/server_reload.c
+++ b/source3/smbd/server_reload.c
@@ -31,6 +31,13 @@
#include "messages.h"
#include "lib/param/loadparm.h"
+/*
+ * The persistent pcap cache is populated by the background print process. Per
+ * client smbds should only reload their printer share inventories if this
+ * information has changed. Use reload_last_pcap_time to detect this.
+ */
+static time_t reload_last_pcap_time = 0;
+
static bool snum_is_shared_printer(int snum)
{
return (lp_browseable(snum) && lp_snum_ok(snum) && lp_printable(snum));
@@ -61,6 +68,20 @@ void delete_and_reload_printers(struct tevent_context *ev,
const char *pname;
const char *sname;
NTSTATUS status;
+ bool ok;
+ time_t pcap_last_update;
+
+ ok = pcap_cache_loaded(&pcap_last_update);
+ if (!ok) {
+ DEBUG(1, ("pcap cache not loaded\n"));
+ return;
+ }
+
+ if (reload_last_pcap_time == pcap_last_update) {
+ DEBUG(5, ("skipping printer reload, already up to date.\n"));
+ return;
+ }
+ reload_last_pcap_time = pcap_last_update;
/* Get pcap printers updated */
load_printers(ev, msg_ctx);