about summary refs log tree commit diff
path: root/nscd/pwdcache.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2011-02-05 20:07:27 -0500
committerUlrich Drepper <drepper@gmail.com>2011-02-05 20:07:27 -0500
commita4c7ea7bb8eed9a53c4c50a3b9b9ab324beb1419 (patch)
tree564c0b74f4820c2c77376901c480e33544046b62 /nscd/pwdcache.c
parenta0bf67cca2b7de3a745ab5cf0f9d6e74078d57af (diff)
downloadglibc-a4c7ea7bb8eed9a53c4c50a3b9b9ab324beb1419.tar.gz
glibc-a4c7ea7bb8eed9a53c4c50a3b9b9ab324beb1419.tar.xz
glibc-a4c7ea7bb8eed9a53c4c50a3b9b9ab324beb1419.zip
Schedule nscd cache pruning more accurately fromr re-added values.
Diffstat (limited to 'nscd/pwdcache.c')
-rw-r--r--nscd/pwdcache.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c
index 75f2221e88..47b80520f9 100644
--- a/nscd/pwdcache.c
+++ b/nscd/pwdcache.c
@@ -1,5 +1,5 @@
 /* Cache handling for passwd lookup.
-   Copyright (C) 1998-2008, 2009 Free Software Foundation, Inc.
+   Copyright (C) 1998-2008, 2009, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -77,7 +77,7 @@ static const pw_response_header notfound =
 };
 
 
-static void
+static time_t
 cache_addpw (struct database_dyn *db, int fd, request_header *req,
 	     const void *key, struct passwd *pwd, uid_t owner,
 	     struct hashentry *const he, struct datahead *dh, int errval)
@@ -97,6 +97,7 @@ cache_addpw (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 (pwd == NULL)
     {
       if (he != NULL && errval == EAGAIN)
@@ -108,6 +109,9 @@ cache_addpw (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
@@ -132,7 +136,7 @@ cache_addpw (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, &notfound, total);
@@ -212,7 +216,7 @@ cache_addpw (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;
@@ -293,8 +297,8 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
 	      assert ((char *) dataset - (char *) db->head
 		      + total
 		      <= (sizeof (struct database_pers_head)
-                          + db->head->module * sizeof (ref_t)
-                          + db->head->data_size));
+			  + db->head->module * sizeof (ref_t)
+			  + db->head->data_size));
 	      written = sendfileall (fd, db->wr_fd,
 				     (char *) &dataset->resp
 				     - (char *) db->head, dataset->head.recsize );
@@ -374,6 +378,8 @@ cache_addpw (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;
 }
 
 
@@ -395,7 +401,7 @@ lookup (int type, union keytype key, struct passwd *resultbufp, char *buffer,
 }
 
 
-static void
+static time_t
 addpwbyX (struct database_dyn *db, int fd, request_header *req,
 	  union keytype key, const char *keystr, uid_t c_uid,
 	  struct hashentry *he, struct datahead *dh)
@@ -452,10 +458,13 @@ addpwbyX (struct database_dyn *db, int fd, request_header *req,
     }
 
   /* Add the entry to the cache.  */
-  cache_addpw (db, fd, req, keystr, pwd, c_uid, he, dh, errval);
+  time_t timeout = cache_addpw (db, fd, req, keystr, pwd, c_uid, he, dh,
+				errval);
 
   if (use_malloc)
     free (buffer);
+
+  return timeout;
 }
 
 
@@ -469,7 +478,7 @@ addpwbyname (struct database_dyn *db, int fd, request_header *req,
 }
 
 
-void
+time_t
 readdpwbyname (struct database_dyn *db, struct hashentry *he,
 	       struct datahead *dh)
 {
@@ -480,7 +489,7 @@ readdpwbyname (struct database_dyn *db, struct hashentry *he,
     };
   union keytype u = { .v = db->data + he->key };
 
-  addpwbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh);
+  return addpwbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh);
 }
 
 
@@ -494,7 +503,7 @@ addpwbyuid (struct database_dyn *db, int fd, request_header *req,
   if (*(char *) key == '\0' || *ep != '\0')  /* invalid numeric uid */
     {
       if (debug_level > 0)
-        dbg_log (_("Invalid numeric uid \"%s\"!"), (char *) key);
+	dbg_log (_("Invalid numeric uid \"%s\"!"), (char *) key);
 
       errno = EINVAL;
       return;
@@ -506,7 +515,7 @@ addpwbyuid (struct database_dyn *db, int fd, request_header *req,
 }
 
 
-void
+time_t
 readdpwbyuid (struct database_dyn *db, struct hashentry *he,
 	      struct datahead *dh)
 {
@@ -523,5 +532,5 @@ readdpwbyuid (struct database_dyn *db, struct hashentry *he,
     };
   union keytype u = { .u = uid };
 
-  addpwbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh);
+  return addpwbyX (db, -1, &req, u, db->data + he->key, he->owner, he, dh);
 }