The Samba-Bugzilla – Attachment 5942 Details for
Bug 7656
Scalability problem with hundreds of printers
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for 3.5
0001-s3-Cache-results-of-finding-printer-names.patch (text/plain), 2.61 KB, created by
Volker Lendecke
on 2010-08-27 09:35:47 UTC
(
hide
)
Description:
Patch for 3.5
Filename:
MIME Type:
Creator:
Volker Lendecke
Created:
2010-08-27 09:35:47 UTC
Size:
2.61 KB
patch
obsolete
>From a6d904d20e0157f2b5ddf364874d0e03abb6ade6 Mon Sep 17 00:00:00 2001 >From: Volker Lendecke <vl@samba.org> >Date: Fri, 27 Aug 2010 14:44:16 +0200 >Subject: [PATCH] s3: Cache results of finding printer names > >With hundreds of printers or on a slow machine, this can become expensive. > >Problem reported and patch sponsored by DESY, Hamburg (www.desy.de) >--- > source3/rpc_server/srv_spoolss_nt.c | 39 +++++++++++++++++++++++++++++++++++ > 1 files changed, 39 insertions(+), 0 deletions(-) > >diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c >index 4b5385b..2a113e4 100644 >--- a/source3/rpc_server/srv_spoolss_nt.c >+++ b/source3/rpc_server/srv_spoolss_nt.c >@@ -432,6 +432,14 @@ static bool set_printer_hnd_name(Printer_entry *Printer, const char *handlename) > NT_PRINTER_INFO_LEVEL *printer = NULL; > WERROR result; > >+ /* >+ * Hopefully nobody names his printers like this. Maybe \ or , >+ * are illegal in printer names even? >+ */ >+ const char printer_not_found[] = "Printer \\, !@#$%^&*( not found"; >+ char *cache_key; >+ char *tmp; >+ > DEBUG(4,("Setting printer name=%s (len=%lu)\n", handlename, > (unsigned long)strlen(handlename))); > >@@ -474,6 +482,27 @@ static bool set_printer_hnd_name(Printer_entry *Printer, const char *handlename) > found = true; > } > >+ /* >+ * With hundreds of printers, the "for" loop iterating all >+ * shares can be quite expensive, as it is done on every >+ * OpenPrinter. The loop maps "aprinter" to "sname", the >+ * result of which we cache in gencache. >+ */ >+ >+ cache_key = talloc_asprintf(talloc_tos(), "PRINTERNAME/%s", >+ aprinter); >+ if ((cache_key != NULL) && gencache_get(cache_key, &tmp, NULL)) { >+ >+ found = (strcmp(tmp, printer_not_found) != 0); >+ if (!found) { >+ DEBUG(4, ("Printer %s not found\n", aprinter)); >+ SAFE_FREE(tmp); >+ return false; >+ } >+ fstrcpy(sname, tmp); >+ SAFE_FREE(tmp); >+ } >+ > /* Search all sharenames first as this is easier than pulling > the printer_info_2 off of disk. Don't use find_service() since > that calls out to map_username() */ >@@ -539,10 +568,20 @@ static bool set_printer_hnd_name(Printer_entry *Printer, const char *handlename) > free_a_printer( &printer, 2); > > if ( !found ) { >+ if (cache_key != NULL) { >+ gencache_set(cache_key, printer_not_found, >+ time(NULL)+300); >+ TALLOC_FREE(cache_key); >+ } > DEBUGADD(4,("Printer not found\n")); > return false; > } > >+ if (cache_key != NULL) { >+ gencache_set(cache_key, sname, time(NULL)+300); >+ TALLOC_FREE(cache_key); >+ } >+ > DEBUGADD(4,("set_printer_hnd_name: Printer found: %s -> %s\n", aprinter, sname)); > > fstrcpy(Printer->sharename, sname); >-- >1.5.6.5 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 7656
:
5941
| 5942 |
5949
|
6239
|
6240