Re: how to cleanly shutdown NFS without risk of hanging.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Monday September 7, trond.myklebust@xxxxxxxxxx wrote:
> On Mon, 2009-09-07 at 14:11 +1000, Neil Brown wrote:
> > Hi Trond et al
> > 
> > The problem is this:
> >  If I run 'shutdown' while there are mounted NFS filesystems
> >   from servers that are accessible and working, then I want
> >   any last minute changes to be flushed through to the server(s).
> >  If I run 'shutdown' while there are mounted NFS filesystems
> >   but the servers are not accessible, whether because they are dead,
> >   or because I pulled my network cable, or I've walked out of range
> >   of my Wifi access point, then I don't want 'shutdown' to hang
> >   indefinitely, but I want to it complete in a reasonable time.
> > 
> > I don't think meeting both of those goals is currently possible with
> > Linux NFS.
> > 
> > I've been trying to think how to solve it and the only solution that
> > seems at all robust is to somehow switch NFS mounts to 'soft' as part
> > of the shutdown process.  That way things will get flushed if
> > possible, but won't cause umount or sync to hang indefinitely -
> > exactly what I want.
> > 
> > I can see two ways to achieve this.
> > One is to allow "-o remount" to change the soft/hard flag.
> > I think it would be easy enough to change ->cl_softrtry, but
> > setting RPC_TASK_SOFT on each task would be awkward.
> > Maybe we could change RPC_IS_SOFT() to something like:
> >   (((t)->tk_flags & RPC_TASK_SOFT) || (t)->tk_client->cl_softrtry)
> > ??
> > 
> > The other approach with be to introduce some global flag (a sysctl
> > or module parameter??) which forces all tasks to be 'soft'.
> > 
> > The latter would be easier to plug in to the shutdown sequence and
> > would equally apply to filesystems that have already been
> > lazy-unmounted (you cannot remount those filesystems).
> > 
> > The former seems more in keeping with the way things are usually done,
> > but is a little more complex for the shutdown scripts and doesn't help
> > if someone lazy-unmounted a filesystem.
> > 
> > Of course we could do both.
> > 
> > Do you have any thoughts about this before I try implementing
> > something?
> 
> I think that the ability to remount to 'soft', and possibly also to
> change the timeout parameters could be very helpful even in a
> non-shutdown situation.
> 
> The former should be very easy: it wouldn't take much effort to set the
> RPC_TASK_SOFT flag by looping over the 'rpc_client->cl_tasks' list (see
> rpc_killall_tasks()).
> If you want to do this for all RPC clients, then we can do that too.
> That's just a question of looping over the 'all_clients' list and
> applying the above recipe to each rpc_client.
> 
> Changing the timeout parameters on existing tasks might not be possible,
> but we could at least allow the user to change the default timeout on
> the rpc_client...
> 
> Cheers
>   Trond

Thanks.
I had a go at adding support for changing soft, hard, timeo, and
retrans for which I will post patches shortly.

However it doesn't really solve my problem after all.
If the server isn't responding, then both 'mount' and 'mount.nfs' will
try to stat the mountpoint, and mount.nfs will try to talk to the
server to check protocol parameters.
These can be fixed, but then the kernel in do_remount_sb() calls
fsync_super() which will block if the server is down and there is any
dirty data.  I guess that might be fixable too, but it gets ugly.

It might be best to try using "umount -f" which is a lot more useful
now that TASK_KILLABLE exists (I think that is what has made the
difference).

If I:

   mkill -TERM /mount/point
   if umount /mount/point
   then : success
   else
        mkill -KILL /mount/point
        if umount /mount/point
        then : success
        else umount -f /mount/point
        fi
   fi

(mkill is a program is opensuse which kills all processes accessing
 the filesystem without touching the filesystem itself.  It just reads
 /proc/mounts and various symlinks from /proc/[0-9]*/ to find the
 right processes to kill).

Then I think I'll get what I want.  My only concern is that some dirty
data might be left in the page cache after a process is killed.
Is that possible?

I've tried the above and it mostly works, though once I had to
make one more umount attempt.

Maybe I need to put it all in a loop and check if umount
fails due to the filesystem being busy, or due to it not being
mounted...

I wonder if this would be something that should be included in
umount.nfs.  It might be appropriate for umount to kill processes
though. I wonder if it would be ok to add a '-k' flag????

 umount -f -k /mount/point

repeatedly kills processed and tries "umount -f" until it works,
or it has tried hard enough???

I might just do it in a script for now.

Thanks,
NeilBrown



for attempt in 1 2 3
do
   mkill -TERM $mountpoint
   if umount $mountpoint || test $? -ne 16
   then break
   else
        mkill -KILL $mountpoint
        if umount $mountpoint || test $? -ne 16
        then break
        else umount -f $mountpoint
        fi
   fi
done
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux