]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
(cache_addhst): Don't cache name->record entries if more than one IP
authorUlrich Drepper <drepper@redhat.com>
Fri, 18 Feb 2000 07:31:49 +0000 (07:31 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 18 Feb 2000 07:31:49 +0000 (07:31 +0000)
address is available.

nscd/hstcache.c

index 2ead2d06bcf68e9cc952f86f1b1751dcb2469cf9..702a958631dba33b2626a489f555e1b47a752740 100644 (file)
@@ -214,18 +214,24 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key,
       /* Now get the lock to safely insert the records.  */
       pthread_rwlock_rdlock (&db->lock);
 
-      /* First add all the aliases.  */
-      for (cnt = 0; cnt < h_aliases_cnt; ++cnt)
-       {
-         if (addr_list_type == GETHOSTBYADDR)
-           cache_add (GETHOSTBYNAME, aliases, h_aliases_len[cnt], data, total,
-                      data, 0, t, db, owner);
+      /* First add all the aliases.  If the record contains more than
+         one IP address (used for load balancing etc) don't cache the
+         entry.  This is something the current cache handling cannot
+         handle and it is more than questionable whether it is
+         worthwhile complicating the cache handling just for handling
+         such a special case.  */
+      if (hst->h_addr_list[1] == NULL)
+       for (cnt = 0; cnt < h_aliases_cnt; ++cnt)
+         {
+           if (addr_list_type == GETHOSTBYADDR)
+             cache_add (GETHOSTBYNAME, aliases, h_aliases_len[cnt], data,
+                        total, data, 0, t, db, owner);
 
-         cache_add (GETHOSTBYNAMEv6, aliases, h_aliases_len[cnt], data, total,
-                    data, 0, t, db, owner);
+           cache_add (GETHOSTBYNAMEv6, aliases, h_aliases_len[cnt], data,
+                      total, data, 0, t, db, owner);
 
-         aliases += h_aliases_len[cnt];
-       }
+           aliases += h_aliases_len[cnt];
+         }
 
       /* Next the normal addresses.  */
       for (cnt = 0; cnt < h_addr_list_cnt; ++cnt)
@@ -244,23 +250,28 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key,
            addresses += IN6ADDRSZ;
          }
 
-      /* If necessary add the key for this request.  */
-      if (req->type == GETHOSTBYNAME || req->type == GETHOSTBYNAMEv6)
+      /* Avoid adding names if more than one address is available.  See
+        above for more info.  */
+      if (hst->h_addr_list[1] == NULL)
        {
+         /* If necessary add the key for this request.  */
+         if (req->type == GETHOSTBYNAME || req->type == GETHOSTBYNAMEv6)
+           {
+             if (addr_list_type == GETHOSTBYADDR)
+               cache_add (GETHOSTBYNAME, key_copy, req->key_len, data, total,
+                          data, 0, t, db, owner);
+             cache_add (GETHOSTBYNAMEv6, key_copy, req->key_len, data,
+                        total, data, 0, t, db, owner);
+           }
+
+         /* And finally the name.  We mark this as the last entry.  */
          if (addr_list_type == GETHOSTBYADDR)
-           cache_add (GETHOSTBYNAME, key_copy, req->key_len, data, total,
+           cache_add (GETHOSTBYNAME, data->strdata, h_name_len, data, total,
                       data, 0, t, db, owner);
-         cache_add (GETHOSTBYNAMEv6, key_copy, req->key_len, data,
-                    total, data, 0, t, db, owner);
+         cache_add (GETHOSTBYNAMEv6, data->strdata, h_name_len, data,
+                    total, data, 1, t, db, owner);
        }
 
-      /* And finally the name.  We mark this as the last entry.  */
-      if (addr_list_type == GETHOSTBYADDR)
-       cache_add (GETHOSTBYNAME, data->strdata, h_name_len, data, total, data,
-                  0, t, db, owner);
-      cache_add (GETHOSTBYNAMEv6, data->strdata, h_name_len, data,
-                total, data, 1, t, db, owner);
-
       pthread_rwlock_unlock (&db->lock);
     }