Don't call stat(2) on nsswitch.conf(5) every time nsdispatch(3)

and dependent functions (eg getpwname(3)) get called. This can
improve performance of binaries that perform a lot of name
lookups, such as gssd(8). It also matches documented behaviour
of Linux and Solaris.

The old code is left in place, should anyone need it, guarded
by #ifdef NS_REREAD_CONF.

Reviewed by:	imp, bcr
MFC after:	2 weeks
Relnotes:	yes
Sponsored by:	DARPA, AFRL
Differential Revision:	https://reviews.freebsd.org/D17934
This commit is contained in:
Edward Tomasz Napierala 2018-11-10 23:07:46 +00:00
parent 236e308af1
commit 8d113f4aec
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=340339
2 changed files with 18 additions and 1 deletions

View File

@ -335,6 +335,7 @@ static int
nss_configure(void)
{
static time_t confmod;
static int already_initialized = 0;
struct stat statbuf;
int result, isthreaded;
const char *path;
@ -352,6 +353,16 @@ nss_configure(void)
if (path == NULL)
#endif
path = _PATH_NS_CONF;
#ifndef NS_REREAD_CONF
/*
* Define NS_REREAD_CONF to have nsswitch notice changes
* to nsswitch.conf(5) during runtime. This involves calling
* stat(2) every time, which can result in performance hit.
*/
if (already_initialized)
return (0);
already_initialized = 1;
#endif /* NS_REREAD_CONF */
if (stat(path, &statbuf) != 0)
return (0);
if (statbuf.st_mtime <= confmod)

View File

@ -33,7 +33,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd June 6, 2016
.Dd November 10, 2018
.Dt NSSWITCH.CONF 5
.Os
.Sh NAME
@ -340,6 +340,12 @@ sets a policy of "if the user is notfound in nis, do not try files."
This treats nis as the authoritative source of information, except
when the server is down.
.Sh NOTES
The
.Nm
file is parsed by each program only once.
Subsequent changes will not be applied until the program
is restarted.
.Pp
If system got compiled with
.Va WITHOUT_NIS
you have to remove