runsvdir is missing service dir changes
Denys Vlasenko
vda.linux at googlemail.com
Mon Dec 6 00:27:13 UTC 2010
On Thursday 02 December 2010 23:59, Eric Lammerts wrote:
>
> Hi,
> I've seen runsvdir missing updates to the service directory. What I do
> is create a /service/.whatever directory, populate it, and then
> rename it to /service/whatever.
>
> I can trigger the problem with this script:
>
> #!/bin/sh
> # wait until time increments
> t=`date +%s`
> while [ `date +%s` == $t ]; do :; done
> mkdir /service/.tmp
> echo -e '#!/bin/sh\nsleep 666' >/service/.tmp/run
> chmod +x /service/.tmp/run
> sleep 0.75
> mv /service/.tmp /service/tmp
>
> If runsvdir happens to scan the service directory during the sleep, it
> records the mtime of the dir in the last_mtime variable. The
> subsequent mv doesn't change the directory mtime, because it's still
> within the same second.
>
> There used to be a sleep to prevent this situation, but it was removed
> by Denis when he ripped out the tai stuff, in
> http://git.busybox.net/busybox/commit/?id=45946f8b513d9c292613ac08c3ddf4a89b915752
>
> I suggest something like this (using time(NULL), since "now" is a
> monotonic time).
>
> diff --git a/runit/runsvdir.c b/runit/runsvdir.c
> index e77eeff..f3ea785 100644
> --- a/runit/runsvdir.c
> +++ b/runit/runsvdir.c
> @@ -312,8 +312,11 @@ int runsvdir_main(int argc UNUSED_PARAM, char **argv)
> last_mtime = s.st_mtime;
> last_dev = s.st_dev;
> last_ino = s.st_ino;
> - //if (now <= mtime)
> - // sleep(1);
> + /* if the svdir changed this very second, wait until the
> + * next second, because we won't be able to detect more
> + * changes within this second */
> + while(time(NULL) == last_mtime)
> + usleep(100000);
> need_rescan = do_rescan();
> while (fchdir(curdir) == -1) {
> warn2_cannot("change directory, pausing", "");
Applied, thanks!
--
vda
More information about the busybox
mailing list