On Tue, 2006-09-19 at 14:54 +0200, Alexander Larsson wrote:
> > s/TRUE/FALSE/, I think. (gnome_vfs_uri_is_local() used to say that NFS
> > filesystems were local, now it says they're not.) Are you suggesting
> > that this behavior is going to go away? It's useful in places as a
> > heuristic, even if it's not 100% reliable. (Although obviously it's only
> > useful if it's guaranteed to not hang.)
> 
> Oh, yeah FALSE. I'm not really suggesting anything in particular here.
> Just describing a problem. Its true that there are cases where you want
> to know whethe a file is network mounted or not, but almost all cases
> that were using gnome_vfs_uri_is_local() meant it to check for a
> file:/// uri. The fact that it changed behaviour meant a lot of places
> suddenly broke on NFS shares, and were made a lot slower (since it
> suddenly is a call that does i/o). I've personally changed a lot of code
> to do a g_str_has_prefix("file://") in lots of places.

Both Nautilus and the file chooser seem to use is_local() for just two
things:

1. "If I strip the method prefix, can I feed the filename to POSIX
calls?".  This problem goes nicely away when we switch to FUSE.

2. "Will a stat() or open() be slow on this file?".  This works
reasonably well.  The only problem is that file-method.c implements it
as a blacklist of known-to-be-remote file systems, *not* as a whitelist
of known-to-be-local ones.  So occasionally we get bug reports like "I
have a foofs mount which is slow", where foofs is an obscure network
file system like Novell's novfs.

A bigger problem is that is_local() blocks very badly if you run it on a
file which is on a stale NFS mount, because it stat()s the file directly
to get at its st_dev and such.  I *think* this could be better
implemented by stat()ing each component from the root down to the actual
file, and stopping whenever we get to a directory which is a nonlocal
mount.  [Of course, stat()ing recursively sucks, but what can you do.]

This problem about blocking on stale mounts shows up in the file
chooser.  We do is_local() on each bookmark to see whether to show it or
not, depending on whether the file chooser is configured to show
local-only files.  If you have an NFS bookmark and the mount is stale,
it hangs.

Also, the calling code could be smarter about not running is_local() for
every single file... maybe we can assume that if a directory is local,
then every file under it is also local (but not subdirectories, which
may be mounts).

  Federico

_______________________________________________
gnome-vfs-list mailing list
gnome-vfs-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gnome-vfs-list

Reply via email to