summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2022-06-22 18:56:26 +0200
committerJeremy Allison <jra@samba.org>2022-06-30 22:08:39 +0000
commit9080cd30d517cb50954e440bb4475c2eeb678906 (patch)
tree0589e253aaab8a166225fdf8c79d179904379b3f
parent5903657bd9bd3b4f96b3ddf4748846465b617edf (diff)
downloadsamba-9080cd30d517cb50954e440bb4475c2eeb678906.tar.gz
s3:printing: Do not clear the printer-list.tdb
With the new dcerpc architecture we need to keep printer-list.tdb around. A spoolss dcerpc call will start rpc-spoolssd which will then start the background queue process. However in order to enum the printers we need have a printer-list.tdb. Depending on the number of printers this task can take several seconds. It is unlinkly that the printer-list will change all the time, so we might provide outdated data till it gets refreshed, but this is better than providing no printer list at all. If there are a lot of printers, the idle_seconds for the rpc-spoolssd should be increased so that the background task can finish. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15082 Signed-off-by: Andreas Schneider <asn@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Thu Jun 30 22:08:39 UTC 2022 on sn-devel-184
-rw-r--r--source3/printing/printer_list.c41
-rw-r--r--source3/printing/printer_list.h2
-rw-r--r--source3/printing/printing.c4
3 files changed, 15 insertions, 32 deletions
diff --git a/source3/printing/printer_list.c b/source3/printing/printer_list.c
index 4efcc2e2dd8..8ff75dc6bdd 100644
--- a/source3/printing/printer_list.c
+++ b/source3/printing/printer_list.c
@@ -30,13 +30,14 @@
#define PL_DATA_FORMAT "ddPPP"
#define PL_TSTAMP_FORMAT "dd"
+static struct db_context *printerlist_db;
+
static struct db_context *get_printer_list_db(void)
{
- static struct db_context *db;
char *db_path;
- if (db != NULL) {
- return db;
+ if (printerlist_db != NULL) {
+ return printerlist_db;
}
db_path = lock_path(talloc_tos(), "printer_list.tdb");
@@ -44,31 +45,19 @@ static struct db_context *get_printer_list_db(void)
return NULL;
}
- db = db_open(NULL, db_path, 0,
- TDB_DEFAULT|TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH,
- O_RDWR|O_CREAT, 0644, DBWRAP_LOCK_ORDER_1,
- DBWRAP_FLAG_NONE);
+ printerlist_db = db_open(NULL,
+ db_path,
+ 0,
+ TDB_DEFAULT|TDB_INCOMPATIBLE_HASH,
+ O_RDWR|O_CREAT,
+ 0644,
+ DBWRAP_LOCK_ORDER_1,
+ DBWRAP_FLAG_NONE);
TALLOC_FREE(db_path);
- return db;
-}
-
-bool printer_list_parent_init(void)
-{
- struct db_context *db;
-
- /*
- * Open the tdb in the parent process (smbd) so that our
- * CLEAR_IF_FIRST optimization in tdb_reopen_all can properly
- * work.
- */
-
- db = get_printer_list_db();
- if (db == NULL) {
- DEBUG(1, ("could not open Printer List Database: %s\n",
- strerror(errno)));
- return false;
+ if (printerlist_db == NULL) {
+ DBG_ERR("Failed to open printer_list.tdb\n");
}
- return true;
+ return printerlist_db;
}
NTSTATUS printer_list_get_printer(TALLOC_CTX *mem_ctx,
diff --git a/source3/printing/printer_list.h b/source3/printing/printer_list.h
index f30b3150671..c687048fc3b 100644
--- a/source3/printing/printer_list.h
+++ b/source3/printing/printer_list.h
@@ -20,8 +20,6 @@
#ifndef _PRINTER_LIST_H_
#define _PRINTER_LIST_H_
-bool printer_list_parent_init(void);
-
/**
* @brief Get the comment and the last refresh time from the printer list
* database.
diff --git a/source3/printing/printing.c b/source3/printing/printing.c
index 82903359fc3..dbe5a20e382 100644
--- a/source3/printing/printing.c
+++ b/source3/printing/printing.c
@@ -62,10 +62,6 @@ bool print_backend_init(struct messaging_context *msg_ctx)
bool ok;
char *print_cache_path;
- if (!printer_list_parent_init()) {
- return false;
- }
-
print_cache_path = cache_path(talloc_tos(), "printing");
if (print_cache_path == NULL) {
return false;