From: David Disseldorp Date: Wed, 23 Jul 2014 12:42:00 +0000 (+0200) Subject: smbd: only reprocess printer_list.tdb if it changed X-Git-Tag: samba-4.0.22~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a2a342bdf2888138fce1abb7cad8657832d94a4;p=thirdparty%2Fsamba.git 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 Signed-off-by: David Disseldorp Reviewed-by: Andreas Schneider (cherry picked from commit a2182e03a061de6c1f111ce083cb5f668fe75e4e) --- diff --git a/source3/smbd/server_reload.c b/source3/smbd/server_reload.c index 1d6f9c2911f..6b36e6844c9 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_print_ok(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);