diff options
author | Simo Sorce <ssorce@redhat.com> | 2010-05-14 15:49:29 -0400 |
---|---|---|
committer | Andreas Schneider <asn@samba.org> | 2010-09-15 12:53:40 +0200 |
commit | 25a2d94974c7befd13f90e52b61e297c31ae52e9 (patch) | |
tree | 8f3d136d20a85b5da954295e75e03e91dde71a03 | |
parent | 7022554915a0dc7522151eb2a9a21317372471b9 (diff) | |
download | samba-25a2d94974c7befd13f90e52b61e297c31ae52e9.tar.gz samba-25a2d94974c7befd13f90e52b61e297c31ae52e9.tar.xz samba-25a2d94974c7befd13f90e52b61e297c31ae52e9.zip |
s3-printing: Add method to skip refresh if just happned.
This way if multiple process try to refresh at the same time we don't do it
over and over again.
Signed-off-by: Andreas Schneider <asn@cynapses.org>
-rw-r--r-- | source3/printing/pcap.c | 6 | ||||
-rw-r--r-- | source3/printing/printer_list.c | 26 | ||||
-rw-r--r-- | source3/printing/printer_list.h | 2 |
3 files changed, 34 insertions, 0 deletions
diff --git a/source3/printing/pcap.c b/source3/printing/pcap.c index 2e544b7cdc3..3bc8e9e4e29 100644 --- a/source3/printing/pcap.c +++ b/source3/printing/pcap.c @@ -121,6 +121,12 @@ void pcap_cache_reload(struct tevent_context *ev, return; } + if (!printer_list_need_refresh()) { + /* has been just refeshed, skip */ + DEBUG(5, ("Refresh just happend, skipping.\n")); + return; + } + status = printer_list_mark_reload(); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("Failed to mark printer list for reload!\n")); diff --git a/source3/printing/printer_list.c b/source3/printing/printer_list.c index 123749cf46f..6392755cf5a 100644 --- a/source3/printing/printer_list.c +++ b/source3/printing/printer_list.c @@ -215,6 +215,32 @@ done: return status; } +bool printer_list_need_refresh(void) +{ + NTSTATUS status; + time_t now = time(NULL); + time_t last_refresh; + + status = printer_list_get_last_refresh(&last_refresh); + if (!NT_STATUS_IS_OK(status)) { + return true; + } + + if (now > last_refresh) { + /* if refresh occurred last than 1 seconds ago, + * then we probably don't need to refresh */ + if ((now - last_refresh) < 1) { + return false; + } + } else { + /* last_refresh newer than now, wow, someone just updated the + * cache under our nose, do not do again. */ + return false; + } + + return true; +} + NTSTATUS printer_list_mark_reload(void) { struct db_context *db; diff --git a/source3/printing/printer_list.h b/source3/printing/printer_list.h index 5772fbaaa33..a5e7993ed09 100644 --- a/source3/printing/printer_list.h +++ b/source3/printing/printer_list.h @@ -39,4 +39,6 @@ NTSTATUS printer_list_clean_old(void); NTSTATUS printer_list_run_fn(void (*fn)(const char *, const char *, void *), void *private_data); +bool printer_list_need_refresh(void); + #endif /* _PRINTER_LIST_H_ */ |