nscd: Skip unusable entries in first pass in prune_cache (RHEL-1192)
Resolves: RHEL-1192
This commit is contained in:
parent
8514cc782e
commit
1ff30367b7
83
glibc-RHEL-1192.patch
Normal file
83
glibc-RHEL-1192.patch
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
commit c00b984fcd53f679ca2dafcd1aee2c89836e6e73
|
||||||
|
Author: Florian Weimer <fweimer@redhat.com>
|
||||||
|
Date: Tue Aug 29 08:28:31 2023 +0200
|
||||||
|
|
||||||
|
nscd: Skip unusable entries in first pass in prune_cache (bug 30800)
|
||||||
|
|
||||||
|
Previously, if an entry was marked unusable for any reason, but had
|
||||||
|
not timed out yet, the assert would trigger.
|
||||||
|
|
||||||
|
One way to get into such state is if a data change is detected during
|
||||||
|
re-validation of an entry. This causes the entry to be marked as not
|
||||||
|
usable. If exits nscd soon after that, then the clock jumps
|
||||||
|
backwards, and nscd restarted, the cache re-validation run after
|
||||||
|
startup triggers the removed assert.
|
||||||
|
|
||||||
|
The change is more complicated than just the removal of the assert
|
||||||
|
because entries marked as not usable should be garbage-collected in
|
||||||
|
the second pass. To make this happen, it is necessary to update some
|
||||||
|
book-keeping data.
|
||||||
|
|
||||||
|
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||||
|
|
||||||
|
diff --git a/nscd/cache.c b/nscd/cache.c
|
||||||
|
index efe4214d953edb30..2fd3f78ebb567bbe 100644
|
||||||
|
--- a/nscd/cache.c
|
||||||
|
+++ b/nscd/cache.c
|
||||||
|
@@ -371,8 +371,11 @@ prune_cache (struct database_dyn *table, time_t now, int fd)
|
||||||
|
serv2str[runp->type], str, dh->timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Check whether the entry timed out. */
|
||||||
|
- if (dh->timeout < now)
|
||||||
|
+ /* Check whether the entry timed out. Timed out entries
|
||||||
|
+ will be revalidated. For unusable records, it is still
|
||||||
|
+ necessary to record that the bucket needs to be scanned
|
||||||
|
+ again below. */
|
||||||
|
+ if (dh->timeout < now || !dh->usable)
|
||||||
|
{
|
||||||
|
/* This hash bucket could contain entries which need to
|
||||||
|
be looked at. */
|
||||||
|
@@ -384,7 +387,7 @@ prune_cache (struct database_dyn *table, time_t now, int fd)
|
||||||
|
/* We only have to look at the data of the first entries
|
||||||
|
since the count information is kept in the data part
|
||||||
|
which is shared. */
|
||||||
|
- if (runp->first)
|
||||||
|
+ if (runp->first && dh->usable)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* At this point there are two choices: we reload the
|
||||||
|
@@ -400,9 +403,6 @@ prune_cache (struct database_dyn *table, time_t now, int fd)
|
||||||
|
{
|
||||||
|
/* Remove the value. */
|
||||||
|
dh->usable = false;
|
||||||
|
-
|
||||||
|
- /* We definitely have some garbage entries now. */
|
||||||
|
- any = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@@ -414,18 +414,15 @@ prune_cache (struct database_dyn *table, time_t now, int fd)
|
||||||
|
|
||||||
|
time_t timeout = readdfcts[runp->type] (table, runp, dh);
|
||||||
|
next_timeout = MIN (next_timeout, timeout);
|
||||||
|
-
|
||||||
|
- /* If the entry has been replaced, we might need
|
||||||
|
- cleanup. */
|
||||||
|
- any |= !dh->usable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* If the entry has been replaced, we might need cleanup. */
|
||||||
|
+ any |= !dh->usable;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- {
|
||||||
|
- assert (dh->usable);
|
||||||
|
- next_timeout = MIN (next_timeout, dh->timeout);
|
||||||
|
- }
|
||||||
|
+ /* Entry has not timed out and is usable. */
|
||||||
|
+ next_timeout = MIN (next_timeout, dh->timeout);
|
||||||
|
|
||||||
|
run = runp->next;
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
%define glibcsrcdir glibc-2.28
|
%define glibcsrcdir glibc-2.28
|
||||||
%define glibcversion 2.28
|
%define glibcversion 2.28
|
||||||
%define glibcrelease 238%{?dist}
|
%define glibcrelease 239%{?dist}
|
||||||
# Pre-release tarballs are pulled in from git using a command that is
|
# Pre-release tarballs are pulled in from git using a command that is
|
||||||
# effectively:
|
# effectively:
|
||||||
#
|
#
|
||||||
@ -1055,6 +1055,7 @@ Patch867: glibc-RHEL-2423.patch
|
|||||||
Patch868: glibc-RHEL-3036.patch
|
Patch868: glibc-RHEL-3036.patch
|
||||||
Patch869: glibc-RHEL-3757.patch
|
Patch869: glibc-RHEL-3757.patch
|
||||||
Patch870: glibc-RHEL-2122.patch
|
Patch870: glibc-RHEL-2122.patch
|
||||||
|
Patch871: glibc-RHEL-1192.patch
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# Continued list of core "glibc" package information:
|
# Continued list of core "glibc" package information:
|
||||||
@ -2885,6 +2886,9 @@ fi
|
|||||||
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Oct 20 2023 Florian Weimer <fweimer@redhat.com> - 2.28-239
|
||||||
|
- nscd: Skip unusable entries in first pass in prune_cache (RHEL-1192)
|
||||||
|
|
||||||
* Mon Oct 16 2023 DJ Delorie <dj@redhat.com> - 2.28-238
|
* Mon Oct 16 2023 DJ Delorie <dj@redhat.com> - 2.28-238
|
||||||
- Fix slow tls access after dlopen (RHEL-2122)
|
- Fix slow tls access after dlopen (RHEL-2122)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user