diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-10-18 15:16:22 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-10-18 15:16:22 +0000 |
commit | 67479a700e3bd2e52980c00ac35c888589ac0a36 (patch) | |
tree | 2a13dea0fbd27ba19d0b19d5849699128d495806 /nscd/nscd_stat.c | |
parent | 6cde0c6047769a661b8cf7e4f93842914a4bb54f (diff) | |
download | glibc-67479a700e3bd2e52980c00ac35c888589ac0a36.zip glibc-67479a700e3bd2e52980c00ac35c888589ac0a36.tar.gz glibc-67479a700e3bd2e52980c00ac35c888589ac0a36.tar.bz2 |
Update.
1998-10-18 Ulrich Drepper <drepper@cygnus.com>
* resolv/nss_dns/dns-host.c: Add missing errnop parameter to the
NSS functions.
* resolv/nss_dns/dns-network.c: Likewise.
* grp/Makefile: Don't search for linuxhtreads in add-ons, use
have-thread-library to determine whether threads are available.
* pwd/Makefile: Remove wrong comment.
* inet/Makefile: Define CFLAGS-gethstbyad_r.c, CFLAGS-gethstbynm_r.c,
and CFLAGS-gethstbynm2_r.c to -DUSE_NSCD=1.
* locale/C-messages.c: Define default strings for YESTR and NOSTR.
* nss/Versions: Add __nss_hosts_lookup.
* nss/getXXbyYY.c: Remove unneeded assignment.
* nss/getXXbyYY_r.c: Include nscd/nscd_proto.h only if needed.
Almost complete rewrite of the NSCD to make it smaller, faster,
add more functionnality and make it easier to extend.
* nscd/Makfile (routines): Add nscd_gethst_r.
(nscd-modules): Add hstcache, gethstbyad_r, gethstbynm2_r, and cache.
* nscd/cache.c: New file.
* nscd/gethstbyad_r.c: New file.
* nscd/gethstbynm2_r.c: New file.
* nscd/hstcache.c: New file.
* nscd/nscd_gethst_r.c: New file.
* nscd/connections.c: Rewritten. Don't start new thread for every
new connection. Use a fixed set of threads which handle all
connections and also the cache cleanup.
* nscd/grpcache.c: Rewritten to use generic cache handling functions
in cache.c.
* nscd/nscd.c: Recognize new parameter nthreads. Adjust initialization
for rewrite. Remove handle_requests function.
* nscd/nscd.h (NSCD_VERSION): Bump to 2.
Define new data structure for the new unified cache and the host
database entries.
* nscd/nscd_conf.c: Rewrite parsing partly to allow adding of more
databases easily. Recognize check-files and threads definitions.
* nscd/nscd.conf: Add definition of enable-cache and check-files to
passwd and group definitions. Add new set of definitions for hosts.
* nscd/nscd_getgr_r.c: Rewrite for new protocol.
* nscd/nscd_getpw_r.c: Likewise.
* nscd/nscd_proto.h: Add prototype for host database functions.
* nscd/nscd_stat.c: Rewrite to simplify printing of information
for many databases.
* nscd/dbg_log.c: Remove unnecessary variable initializations.
Global variable debug_flag is renamed to dbg_level.
* nscd/dbg_log.h: Declare set_logfile.
Diffstat (limited to 'nscd/nscd_stat.c')
-rw-r--r-- | nscd/nscd_stat.c | 181 |
1 files changed, 135 insertions, 46 deletions
diff --git a/nscd/nscd_stat.c b/nscd/nscd_stat.c index d818288..f9d21ae 100644 --- a/nscd/nscd_stat.c +++ b/nscd/nscd_stat.c @@ -17,71 +17,160 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <errno.h> +#include <error.h> +#include <langinfo.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <unistd.h> -#include <sys/types.h> + #include "nscd.h" +#include "dbg_log.h" + +/* We use this to make sure the receiver is the same. */ +static const char compilation[21] = __DATE__ " " __TIME__; + +/* Statistic data for one database. */ +struct dbstat +{ + int enabled; + int check_file; + size_t module; + + unsigned long int postimeout; + unsigned long int negtimeout; + + unsigned long int poshit; + unsigned long int neghit; + unsigned long int posmiss; + unsigned long int negmiss; +}; + +/* Record for transmitting statistics. */ +struct statdata +{ + char version[sizeof (compilation)]; + int debug_level; + int ndbs; + struct dbstat dbs[lastdb]; +}; + void -print_stat (void) +send_stats (int fd, struct database dbs[lastdb]) { - int sock = __nscd_open_socket (); - request_header req; - stat_response_header resp; - ssize_t nbytes; + struct statdata data; + int cnt; + + memcpy (data.version, compilation, sizeof (compilation)); + data.debug_level = debug_level; + data.ndbs = lastdb; + + for (cnt = 0; cnt < lastdb; ++cnt) + { + data.dbs[cnt].enabled = dbs[cnt].enabled; + data.dbs[cnt].check_file = dbs[cnt].check_file; + data.dbs[cnt].module = dbs[cnt].module; + data.dbs[cnt].postimeout = dbs[cnt].postimeout; + data.dbs[cnt].negtimeout = dbs[cnt].negtimeout; + data.dbs[cnt].poshit = dbs[cnt].poshit; + data.dbs[cnt].neghit = dbs[cnt].neghit; + data.dbs[cnt].posmiss = dbs[cnt].posmiss; + data.dbs[cnt].negmiss = dbs[cnt].negmiss; + } - if (sock == -1) + if (TEMP_FAILURE_RETRY (write (fd, &data, sizeof (data))) != sizeof (data)) { - fputs (_("nscd not running!\n"), stdout); - exit (EXIT_FAILURE); + char buf[256]; + dbg_log (_("cannot write statistics: %s"), + strerror_r (errno, buf, sizeof (buf))); } +} + + +int +receive_print_stats (void) +{ + struct statdata data; + request_header req; + ssize_t nbytes; + int fd; + int i; + /* Open a socket to the running nscd. */ + fd = nscd_open_socket (); + if (fd == -1) + error (EXIT_FAILURE, 0, _("nscd not running!\n")); + + /* Send the request. */ req.version = NSCD_VERSION; req.type = GETSTAT; req.key_len = 0; - nbytes = write (sock, &req, sizeof (request_header)); + nbytes = TEMP_FAILURE_RETRY (write (fd, &req, sizeof (request_header))); if (nbytes != sizeof (request_header)) { - perror (_("write incomplete")); - close (sock); - exit (EXIT_FAILURE); + int err = errno; + close (fd); + error (EXIT_FAILURE, err, _("write incomplete")); } - nbytes = read (sock, &resp, sizeof (stat_response_header)); - if (nbytes != sizeof (stat_response_header)) + /* Read as much data as we expect. */ + if (TEMP_FAILURE_RETRY (read (fd, &data, sizeof (data))) != sizeof (data) + || (memcmp (data.version, compilation, sizeof (compilation)) != 0 + /* Yes, this is an assignment! */ + && errno == EINVAL)) { - perror (_("read incomplete")); - close (sock); - exit (EXIT_FAILURE); + /* Not the right version. */ + int err = errno; + close (fd); + error (EXIT_FAILURE, err, _("cannot read statistics data")); } - close (sock); - - printf (_("nscd configuration:\n\n")); - printf (_("%12d server debug level\n\n"), resp.debug_level); - - printf (_("passwd cache:\n\n")); - printf (_("%12s cache is enabled\n"), resp.pw_enabled ? _("Yes") : _("No")); - printf (_("%12ld cache hits on positive entries\n"), resp.pw_poshit); - printf (_("%12ld cache hits on negative entries\n"), resp.pw_neghit); - printf (_("%12ld cache misses on positive entries\n"), resp.pw_posmiss); - printf (_("%12ld cache misses on negative entries\n"), resp.pw_negmiss); - printf (_("%12ld suggested size\n"), resp.pw_size); - printf (_("%12ld seconds time to live for positive entries\n"), - resp.pw_posttl); - printf (_("%12ld seconds time to live for negative entries\n\n"), - resp.pw_negttl); - - printf (_("group cache:\n\n")); - printf (_("%12s cache is enabled\n"), resp.gr_enabled ? _("Yes") : _("No")); - printf (_("%12ld cache hits on positive entries\n"), resp.gr_poshit); - printf (_("%12ld cache hits on negative entries\n"), resp.gr_neghit); - printf (_("%12ld cache misses on positive entries\n"), resp.gr_posmiss); - printf (_("%12ld cache misses on negative entries\n"), resp.gr_negmiss); - printf (_("%12ld suggested size\n"), resp.gr_size); - printf (_("%12ld seconds time to live for positive entries\n"), - resp.gr_posttl); - printf (_("%12ld seconds time to live for negative entries\n"), - resp.gr_negttl); + printf (_("nscd configuration:\n\n%15d server debug level\n"), + data.debug_level); + + for (i = 0; i < lastdb; ++i) + { + unsigned long int hit = data.dbs[i].poshit + data.dbs[i].neghit; + unsigned long int all = hit + data.dbs[i].posmiss + data.dbs[i].negmiss; + const char *enabled = nl_langinfo (data.dbs[i].enabled ? YESSTR : NOSTR); + const char *check_file = nl_langinfo (data.dbs[i].check_file + ? YESSTR : NOSTR); + + if (enabled[0] == '\0') + /* The locale does not provide this information so we have to + translate it ourself. Since we should avoid short translation + terms we artifically increase the length. */ + enabled = data.dbs[i].enabled ? _(" yes") : _(" no"); + if (check_file[0] == '\0') + check_file = data.dbs[i].check_file ? _(" yes") : _(" no"); + + if (all == 0) + /* If nothing happened so far report a 0% hit rate. */ + all = 1; + + printf (_("\n%s cache:\n\n" + "%15s cache is enabled\n" + "%15Zd suggested size\n" + "%15ld seconds time to live for positive entries\n" + "%15ld seconds time to live for negative entries\n" + "%15ld cache hits on positive entries\n" + "%15ld cache hits on negative entries\n" + "%15ld cache misses on positive entries\n" + "%15ld cache misses on negative entries\n" + "%15ld%% cache hit rate\n" + "%15s check /etc/%s for changes\n"), + dbnames[i], enabled, + data.dbs[i].module, + data.dbs[i].postimeout, data.dbs[i].negtimeout, + data.dbs[i].poshit, data.dbs[i].neghit, + data.dbs[i].posmiss, data.dbs[i].negmiss, + (100 * hit) / all, + check_file, dbnames[i]); + } + + close (fd); + + exit (0); } |