diff options
| author | David Disseldorp <ddiss@samba.org> | 2014-07-23 14:42:00 +0200 |
|---|---|---|
| committer | Andreas Schneider <asn@cryptomilk.org> | 2014-08-08 14:10:39 +0200 |
| commit | a2182e03a061de6c1f111ce083cb5f668fe75e4e (patch) | |
| tree | 78f3e088a16bf443ba0b39c96f9dbe7dc1d3dcfb | |
| parent | 30ce835670a6aeca6fb960ea7c4fe1b982bdd5b0 (diff) | |
| download | samba-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.c | 21 |
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); |
