[PATCH] nscd: bump GC cycle during cache pruning (bug 26130)
Florian Weimer
fweimer@redhat.com
Mon Jun 29 08:27:09 GMT 2020
* Andreas Schwab:
> 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.
> ---
> nscd/cache.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/nscd/cache.c b/nscd/cache.c
> index 94163d9ce3..2ceac94c23 100644
> --- a/nscd/cache.c
> +++ b/nscd/cache.c
> @@ -453,6 +453,11 @@ prune_cache (struct database_dyn *table, time_t now, int fd)
> 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. */
> + ++table->head->gc_cycle;
> + assert ((table->head->gc_cycle & 1) == 1);
> +
> while (first <= last)
> {
> if (mark[first])
> @@ -493,6 +498,10 @@ prune_cache (struct database_dyn *table, time_t now, int fd)
> ++first;
> }
>
> + /* Now we are done modifying the data. */
> + ++table->head->gc_cycle;
> + assert ((table->head->gc_cycle & 1) == 0);
> +
> /* It's all done. */
> pthread_rwlock_unlock (&table->lock);
I think this needs barriers after and before the increments.
Thanks,
Florian
More information about the Libc-alpha
mailing list