nscd: bump GC cycle during cache pruning (bug 26130)

While nscd prunes a cache it becomes inconsistent temporarily, which is
visible to clients if that cache is shared.  Bump the GC cycle counter so
that the clients notice the modification window.

Uniformly use atomic_fetch_add to modify the GC cycle counter.
This commit is contained in:
Andreas Schwab 2020-06-17 16:05:13 +02:00
parent 94cd37ebb2
commit 5e74e6f858
2 changed files with 11 additions and 2 deletions

View File

@ -452,6 +452,11 @@ prune_cache (struct database_dyn *table, time_t now, int fd)
pthread_rwlock_wrlock (&table->lock); pthread_rwlock_wrlock (&table->lock);
} }
/* Now we start modifying the data. Make sure all readers of the
data are aware of this and temporarily don't use the data. */
atomic_fetch_add_relaxed (&table->head->gc_cycle, 1);
assert ((table->head->gc_cycle & 1) == 1);
while (first <= last) while (first <= last)
{ {
if (mark[first]) if (mark[first])
@ -492,6 +497,10 @@ prune_cache (struct database_dyn *table, time_t now, int fd)
++first; ++first;
} }
/* Now we are done modifying the data. */
atomic_fetch_add_relaxed (&table->head->gc_cycle, 1);
assert ((table->head->gc_cycle & 1) == 0);
/* It's all done. */ /* It's all done. */
pthread_rwlock_unlock (&table->lock); pthread_rwlock_unlock (&table->lock);

View File

@ -264,7 +264,7 @@ gc (struct database_dyn *db)
/* Now we start modifying the data. Make sure all readers of the /* Now we start modifying the data. Make sure all readers of the
data are aware of this and temporarily don't use the data. */ data are aware of this and temporarily don't use the data. */
++db->head->gc_cycle; atomic_fetch_add_relaxed (&db->head->gc_cycle, 1);
assert ((db->head->gc_cycle & 1) == 1); assert ((db->head->gc_cycle & 1) == 1);
@ -490,7 +490,7 @@ gc (struct database_dyn *db)
/* Now we are done modifying the data. */ /* Now we are done modifying the data. */
++db->head->gc_cycle; atomic_fetch_add_relaxed (&db->head->gc_cycle, 1);
assert ((db->head->gc_cycle & 1) == 0); assert ((db->head->gc_cycle & 1) == 0);
/* We are done. */ /* We are done. */