summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <ssorce@redhat.com>2010-05-14 15:49:29 -0400
committerAndreas Schneider <asn@samba.org>2010-09-15 12:53:40 +0200
commit25a2d94974c7befd13f90e52b61e297c31ae52e9 (patch)
tree8f3d136d20a85b5da954295e75e03e91dde71a03
parent7022554915a0dc7522151eb2a9a21317372471b9 (diff)
downloadsamba-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.c6
-rw-r--r--source3/printing/printer_list.c26
-rw-r--r--source3/printing/printer_list.h2
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_ */