]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:printing: Do not clear the printer-list.tdb
authorAndreas Schneider <asn@samba.org>
Wed, 22 Jun 2022 16:56:26 +0000 (18:56 +0200)
committerJeremy Allison <jra@samba.org>
Thu, 30 Jun 2022 22:08:39 +0000 (22:08 +0000)
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

source3/printing/printer_list.c
source3/printing/printer_list.h
source3/printing/printing.c

index 4efcc2e2dd868c8581945b59df1931a7e12619e7..8ff75dc6bdd17c9491063d0f39034cb24ba7834d 100644 (file)
 #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,
index f30b3150671fcc6e72dd9af60e0c735ca3d97c81..c687048fc3b9ebe0f53e6d0a95c0ee953a1d3d5e 100644 (file)
@@ -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.
index 82903359fc3b1ab1f073f1aab7b5d8083f269f86..dbe5a20e3822e7b0abae48bad3e317543e1028f6 100644 (file)
@@ -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;