afs: Avoid panics in afs_InvalidateAllSegments 77/13677/3
authorAndrew Deason <adeason@sinenomine.net>
Mon, 8 Jul 2019 19:49:23 +0000 (14:49 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Fri, 13 Sep 2019 13:47:53 +0000 (09:47 -0400)
commit3be5880d1d2a0aef6600047ed43d602949cd5f4d
tree2769f89308816d670358074b43b790e1c163d956
parent1c4e94da2a8fce9d79006ad6d6673d3d7de117d3
afs: Avoid panics in afs_InvalidateAllSegments

Currently, afs_InvalidateAllSegments panics when afs_GetValidDSlot
fails. We panic in these cases because afs_InvalidateAllSegments
cannot simply return an error to its callers; we must invalidate all
segments for the given vcache, or we risk serving incorrect data to
userspace as explained in the comments.

Instead of panicing, though, we could simply sleep and retry the
operation until it succeeds. Implement this, retrying every 10
seconds, and logging a message every hour that we're stuck (in case
we're stuck for a long time).

When we retry the operation, do so in a background request, to avoid a
somewhat common situation on Linux where we always get I/O errors from
the cache when the calling process has a SIGKILL pending. Create a new
background op for this, BOP_INVALIDATE_SEGMENTS.

With this, the relevant vcache will be effectively unusable for the
entire time we're stuck in this situation (avc->lock will be
write-locked), but this is at least better than panicing the whole
machine.

Change-Id: Icdc58a94f0cd5857903836d94e5cf7814ce7e088
Reviewed-on: https://gerrit.openafs.org/13677
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
src/afs/afs.h
src/afs/afs_daemons.c
src/afs/afs_prototypes.h
src/afs/afs_segments.c