diff options
author | Andreas Schneider <asn@samba.org> | 2022-06-22 18:56:26 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2022-06-30 22:08:39 +0000 |
commit | 9080cd30d517cb50954e440bb4475c2eeb678906 (patch) | |
tree | 0589e253aaab8a166225fdf8c79d179904379b3f | |
parent | 5903657bd9bd3b4f96b3ddf4748846465b617edf (diff) | |
download | samba-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.c | 41 | ||||
-rw-r--r-- | source3/printing/printer_list.h | 2 | ||||
-rw-r--r-- | source3/printing/printing.c | 4 |
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; |