diff options
author | Ulrich Drepper <drepper@gmail.com> | 2011-02-05 20:07:27 -0500 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2011-02-05 20:07:27 -0500 |
commit | a4c7ea7bb8eed9a53c4c50a3b9b9ab324beb1419 (patch) | |
tree | 564c0b74f4820c2c77376901c480e33544046b62 /nscd/servicescache.c | |
parent | a0bf67cca2b7de3a745ab5cf0f9d6e74078d57af (diff) | |
download | glibc-a4c7ea7bb8eed9a53c4c50a3b9b9ab324beb1419.tar.gz |
Schedule nscd cache pruning more accurately fromr re-added values.
Diffstat (limited to 'nscd/servicescache.c')
-rw-r--r-- | nscd/servicescache.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/nscd/servicescache.c b/nscd/servicescache.c index dc98d3005a..2dd1cc5675 100644 --- a/nscd/servicescache.c +++ b/nscd/servicescache.c @@ -1,5 +1,5 @@ /* Cache handling for services lookup. - Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 2007, 2008, 2009, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@drepper.com>, 2007. @@ -61,7 +61,7 @@ static const serv_response_header notfound = }; -static void +static time_t cache_addserv (struct database_dyn *db, int fd, request_header *req, const void *key, struct servent *serv, uid_t owner, struct hashentry *const he, struct datahead *dh, int errval) @@ -81,6 +81,7 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req, assert (offsetof (struct dataset, resp) == offsetof (struct datahead, data)); + time_t timeout = MAX_TIMEOUT_VALUE; if (serv == NULL) { if (he != NULL && errval == EAGAIN) @@ -92,6 +93,9 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req, /* Do not reset the value if we never not reload the record. */ dh->nreloads = reload_count - 1; + /* Reload with the same time-to-live value. */ + timeout = dh->timeout = t + db->postimeout; + written = total = 0; } else @@ -115,7 +119,7 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req, dataset->head.usable = true; /* Compute the timeout time. */ - dataset->head.timeout = t + db->negtimeout; + timeout = dataset->head.timeout = t + db->negtimeout; /* This is the reply. */ memcpy (&dataset->resp, ¬found, total); @@ -203,7 +207,7 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req, dataset->head.usable = true; /* Compute the timeout time. */ - dataset->head.timeout = t + db->postimeout; + timeout = dataset->head.timeout = t + db->postimeout; dataset->resp.version = NSCD_VERSION; dataset->resp.found = 1; @@ -328,6 +332,8 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req, dbg_log (_("short write in %s: %s"), __FUNCTION__, strerror_r (errno, buf, sizeof (buf))); } + + return timeout; } @@ -354,7 +360,7 @@ lookup (int type, char *key, struct servent *resultbufp, char *buffer, } -static void +static time_t addservbyX (struct database_dyn *db, int fd, request_header *req, char *key, uid_t uid, struct hashentry *he, struct datahead *dh) { @@ -409,10 +415,12 @@ addservbyX (struct database_dyn *db, int fd, request_header *req, buffer = (char *) extend_alloca (buffer, buflen, 2 * buflen); } - cache_addserv (db, fd, req, key, serv, uid, he, dh, errval); + time_t timeout = cache_addserv (db, fd, req, key, serv, uid, he, dh, errval); if (use_malloc) free (buffer); + + return timeout; } @@ -424,7 +432,7 @@ addservbyname (struct database_dyn *db, int fd, request_header *req, } -void +time_t readdservbyname (struct database_dyn *db, struct hashentry *he, struct datahead *dh) { @@ -434,7 +442,7 @@ readdservbyname (struct database_dyn *db, struct hashentry *he, .key_len = he->len }; - addservbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); + return addservbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); } @@ -446,7 +454,7 @@ addservbyport (struct database_dyn *db, int fd, request_header *req, } -void +time_t readdservbyport (struct database_dyn *db, struct hashentry *he, struct datahead *dh) { @@ -456,5 +464,5 @@ readdservbyport (struct database_dyn *db, struct hashentry *he, .key_len = he->len }; - addservbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); + return addservbyX (db, -1, &req, db->data + he->key, he->owner, he, dh); } |