On Thu, 2010-02-25 at 13:35 +0000, Steve Langasek wrote:
> statd is "start on (started portmap or mount TYPE=nfs)"
> portmap is "start on (local-filesystems and net-device-up IFACE=lo)"
I'm not terribly conversant on the state language of upstart yet, but
does the above say that statd will be started after portmap has been
started *or* an NFS mount is required and portmap will be started after
local-filesystems has been completed and interface "lo" is up?
> and the statd job tries to start portmap if it's not already running.
Yeah.
> So the only possible race conditions I see here are if
> - mount TYPE=nfs is emitted before all the local filesystems are mounted
Indeed! And I believe this is in fact the race I am running into.
> - mount TYPE=nfs is emitted before lo is configured, and this causes portmap to fail
Nope. I have debugged enough to know this is not the case.
> - /var is on a network filesystem *other* than NFS (if it's on NFS, then this can't really be solved, you just get a deadlock if you try)
Nope. /var is local.
> Can you post your fstab, so I can better understand which of these cases
> applies?
Sure:
# /etc/fstab: static file system information.
#
# file system mount point type options dump pass
/dev/rootvol/ubuntu_root / ext3 defaults 0 0
UUID=9d79e085-9980-444d-b58b-e0a49b5c2edb /boot ext3 rw,nosuid,nodev 0 2
I think you will agree that it's the first race condition.
I'm not sure exactly what "local-filesystems" signal is signalling but
assuming it really does mean "local" (i.e. directly attached block
devices) is there any reason the boolean operator in the condition for
starting statd is not "and" rather than "or"? That would ensure
that /var is mounted and portmapper is running before a statd start is
attempted. Doesn't statd require portmapper anyway?
On Thu, 2010-02-25 at 13:35 +0000, Steve Langasek wrote:
> statd is "start on (started portmap or mount TYPE=nfs)"
> portmap is "start on (local-filesystems and net-device-up IFACE=lo)"
I'm not terribly conversant on the state language of upstart yet, but
does the above say that statd will be started after portmap has been
started *or* an NFS mount is required and portmap will be started after
local-filesystems has been completed and interface "lo" is up?
> and the statd job tries to start portmap if it's not already running.
Yeah.
> So the only possible race conditions I see here are if
> - mount TYPE=nfs is emitted before all the local filesystems are mounted
Indeed! And I believe this is in fact the race I am running into.
> - mount TYPE=nfs is emitted before lo is configured, and this causes portmap to fail
Nope. I have debugged enough to know this is not the case.
> - /var is on a network filesystem *other* than NFS (if it's on NFS, then this can't really be solved, you just get a deadlock if you try)
Nope. /var is local.
> Can you post your fstab, so I can better understand which of these cases
> applies?
Sure:
# /etc/fstab: static file system information. ubuntu_ root / ext3 defaults 0 0 9980-444d- b58b-e0a49b5c2e db /boot ext3 rw,nosuid,nodev 0 2
#
# file system mount point type options dump pass
/dev/rootvol/
UUID=9d79e085-
/dev/rootvol/swap none swap sw 0 0
proc /proc proc defaults 0 0
sys /sys sysfs defaults 0 0
/dev/fd0 /mnt/floppy auto noauto, rw,sync, user,exec 0 0 ubuntu_ var /var ext3 rw,nosuid,nodev 0 2 apt_archives /var/cache/ apt/archives ext3 rw,nosuid,nodev 0 2 ubuntu_ usr /usr ext3 rw,nodev 0 2 dev,suid, rw,bg,rsize= 8192,wsize= 8192 1 1 mnt/mp3/ library /var/lib/ mythtv/ music nfs rw,noexec, nodev,nosuid, bg,rsize= 8192,wsize= 8192 1 1 nosuid, bg,rsize= 8192,wsize= 8192 1 1
/dev/cdrom /mnt/cdrom auto noauto,ro,user,exec 0 0
/dev/rootvol/
/dev/rootvol/
/dev/rootvol/
/dev/rootvol/home /home ext3 rw,nosuid,nodev 0 2
/dev/datavol/video /video xfs rw,nosuid,nodev 0 2
pc:/home/brian /autohome/brian nfs auto,exec,
linux:/
linux:/usr/src /usr/src nfs rw,nodev,
I think you will agree that it's the first race condition.
I'm not sure exactly what "local-filesystems" signal is signalling but
assuming it really does mean "local" (i.e. directly attached block
devices) is there any reason the boolean operator in the condition for
starting statd is not "and" rather than "or"? That would ensure
that /var is mounted and portmapper is running before a statd start is
attempted. Doesn't statd require portmapper anyway?