==> Regarding Re: [autofs] stat of /users/no-such-user takes 15 seconds; Brian
Long <[EMAIL PROTECTED]> adds:
brilong> On Wed, 2005-11-30 at 15:32 -0500, Jeff Moyer wrote:
>> ==> Regarding Re: [autofs] stat of /users/no-such-user takes 15 seconds;
>> Ian Kent <[EMAIL PROTECTED]> adds:
>>
raven> On Tue, 29 Nov 2005, Jeff Moyer wrote:
>> >> ==> Regarding Re: [autofs] stat of /users/no-such-user takes 15
>> seconds; >> Ian Kent <[EMAIL PROTECTED]> adds:
>> >>
raven> On Tue, 22 Nov 2005, Jeff Moyer wrote:
>> >> >> ==> Regarding Re: [autofs] stat of /users/no-such-user takes 15 >>
>> seconds; Ian Kent <[EMAIL PROTECTED]> adds:
>> >> >>
>> >>
raven> Could you review this patch please Jeff.
>> >> After reviewing this further, I did find a problem. See below.
>>
raven> All good points and the test is wrong. I'll update the patch and
raven> post another.
>>
raven> That just leaves the re-read for the other cases which may be
raven> causing a long delay. I'm not sure this slows the lookup unless
raven> sending the signal is causing starvation of cpu cycles some
raven> how. Perhaps the change from cache_add to cache_update will help
raven> more than I think.
>> Ian,
>>
>> The patch I'm attaching is the one against the RHEL autofs package.
>> This is what I have come up with, and it is WRONG. =) It causes a
>> regression in the case where there are multiple keys of the same name in
>> a map; the patched automounter will always use the last key instead of
>> the first. Remember dealing with this back in February? Fun.
>>
>> I'll keep poking at it, I just wanted to make you aware of the problem.
brilong> Does this affect the autofs-4.1.3-166 RPMs I'm testing? :)
Yes. And here is the patch, which I forgot to attach to my last message.
In case this is at all unclear, the attached patch is bad. Don't deploy.
;) To clarify even further, I tested the file maps case.
-Jeff
--- autofs-4.1.3/modules/lookup_file.c.orig 2005-11-29 13:44:12.000000000
-0500
+++ autofs-4.1.3/modules/lookup_file.c 2005-11-29 14:31:10.000000000 -0500
@@ -248,7 +248,7 @@ static int read_map(const char *root, ti
while(1) {
entry = read_one(f, key, mapent);
if (entry)
- cache_add(root, key, mapent, age);
+ cache_update(root, key, mapent, age);
if (feof(f))
break;
@@ -380,7 +380,7 @@ int lookup_mount(const char *root, const
char key[KEY_MAX_LEN + 1];
int key_len;
char mapent[MAPENT_MAX_LEN + 1];
- struct mapent_cache *me;
+ struct mapent_cache *me, *exists;
time_t now = time(NULL);
time_t t_last_read;
int ret;
@@ -403,13 +403,15 @@ int lookup_mount(const char *root, const
/* only if it has been modified */
if (st.st_mtime > ctxt->mtime) {
+ exists = cache_lookup(key);
+
ret = lookup_one(root, key, key_len, ctxt);
- if (!ret)
+ if (ret == CHE_FAIL)
return 1;
debug("ret = %d", ret);
- if (ret == CHE_MISSING) {
+ if (ret == CHE_MISSING && exists) {
if (!cache_delete(root, key, CHE_RMPATH))
rmdir_path(key);
--- autofs-4.1.3/modules/lookup_yp.c.orig 2005-11-29 14:31:14.000000000
-0500
+++ autofs-4.1.3/modules/lookup_yp.c 2005-11-29 14:33:41.000000000 -0500
@@ -110,7 +110,7 @@ int yp_all_callback(int status, char *yp
strncpy(mapent, val, vallen);
*(mapent + vallen) = '\0';
- cache_add(root, key, mapent, age);
+ cache_update(root, key, mapent, age);
return 0;
}
@@ -224,7 +224,7 @@ int lookup_mount(const char *root, const
int key_len;
char *mapent;
int mapent_len;
- struct mapent_cache *me;
+ struct mapent_cache *me, *exists;
int ret;
time_t now = time(NULL);
time_t t_last_read;
@@ -240,11 +240,14 @@ int lookup_mount(const char *root, const
if (key_len > KEY_MAX_LEN)
return 1;
- /* check map and if change is detected re-read map */
- ret = lookup_one(root, key, key_len, ctxt);
+ /*
+ * check map and if change is detected re-read map
+ */
- debug("ret = %d", ret);
+ /* First check to see if this entry exists in the cache */
+ exists = cache_lookup(key);
+ ret = lookup_one(root, key, key_len, ctxt);
if (!ret)
return 1;
@@ -261,7 +264,7 @@ int lookup_mount(const char *root, const
/* Have parent update its map */
if (t_last_read > ap.exp_runfreq)
kill(getppid(), SIGHUP);
- } else if (ret == CHE_MISSING) {
+ } else if (ret == CHE_MISSING && exists) {
if (!cache_delete(root, key, 0)) {
rmdir_if_mount_fails = 1;
}
--- autofs-4.1.3/modules/lookup_ldap.c.orig 2005-11-29 14:35:02.000000000
-0500
+++ autofs-4.1.3/modules/lookup_ldap.c 2005-11-29 16:02:56.000000000 -0500
@@ -460,10 +460,8 @@ static int lookup_one(const char *root,
}
if (!me) {
- cache_delete(root, qKey, 0);
-
for (i = 0; values[i]; i++) {
- rv = cache_add(root, qKey, values[i], age);
+ rv = cache_update(root, qKey, values[i], age);
if (!rv)
return 0;
}
@@ -594,7 +592,7 @@ int lookup_mount(const char *root, const
int key_len;
char mapent[MAPENT_MAX_LEN + 1];
char *mapname;
- struct mapent_cache *me;
+ struct mapent_cache *me, *exists;
time_t now = time(NULL);
time_t t_last_read;
@@ -606,6 +604,8 @@ int lookup_mount(const char *root, const
if (key_len > KEY_MAX_LEN)
return 1;
+ exists = cache_lookup(key);
+
ret = lookup_one(root, key, "nisObject", "cn", "nisMapEntry", ctxt);
ret2 = lookup_one(root, key,
"automount", "cn", "automountInformation", ctxt);
@@ -620,7 +620,7 @@ int lookup_mount(const char *root, const
me = cache_lookup_first();
t_last_read = now - me->age;
- if (ret == CHE_MISSING && ret2 == CHE_MISSING && ret3 == CHE_MISSING) {
+ if (ret == ret2 == ret3 == CHE_MISSING && exists) {
if (!cache_delete(root, key, CHE_RMPATH))
rmdir_path(key);
_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs