mirror of
https://github.com/samba-team/samba.git
synced 2025-01-22 22:04:08 +03:00
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> (cherry picked from commit 9080cd30d517cb50954e440bb4475c2eeb678906)
This commit is contained in:
parent
becccbae32
commit
cce25171f7
@ -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,
|
||||
|
@ -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.
|
||||
|
@ -61,10 +61,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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user