Download raw body.
patch: regress: Work around glitchy clocks in vmm guests
Hey Steven, are you still planning to work on this issue?
If not, that's OK. I will try to handle it. I just don't want
to stomp on a problem area you would like to work on.
Cheers,
Stefan
On Sun, Sep 29, 2019 at 11:53:18AM +0200, Stefan Sperling wrote:
> On Sun, Sep 29, 2019 at 12:33:13AM +0200, Steven McDonald wrote:
> > Some tests fail intermittently in vmm because the clock does not
> > advance between steps, resulting in files that should have a newer
> > mtime than the repo metadata but don't. Example failure:
> >
> > test_status_shows_local_mods_after_update --- /tmp/got-test-status_shows_local_mods_after_update-duAj87aL/stdout.expected Sun Sep 29 00:18:36 2019
> > +++ /tmp/got-test-status_shows_local_mods_after_update-duAj87aL/stdout Sun Sep 29 00:18:36 2019
> > @@ -1 +0,0 @@
> > -M numbers
> > test failed; leaving test data in /tmp/got-test-status_shows_local_mods_after_update-duAj87aL
> >
> > Comparing the mtime on the 'numbers' file with that in .got/file-index
> > shows that the timestamps are identical, which is why got does not
> > treat this file as modified.
> >
> > This intermittent behaviour can be observed outside the context of got
> > (here, x is a small program that just calls stat(2) on foo and displays
> > the mtime):
> >
> > $ echo a >foo; ./x; echo b >foo; ./x
> > 1569708831.911759175
> > 1569708831.931539267
> > $ echo a >foo; ./x; echo b >foo; ./x
> > 1569708832.741842903
> > 1569708832.741842903
> >
> > This is unlikely to be a problem in real-world usage because humans
> > aren't as fast as these regression tests, so I think working around it
> > in the tests is sufficient.
> >
> > The below diff makes this work consistently; sleeping for a nanosecond
> > is sufficient because we just need the clock to advance by any amount
> > at all.
> >
> > Better suggestions/OKs?
>
> Subversion handles this race in C code by sleeping for a short amount
> of time to ensure that files modified after it exits have a different
> time stamp from the one which was recorded in meta data.
>
> Docs: https://svn.apache.org/viewvc/subversion/tags/1.10.6/subversion/include/svn_io.h?revision=1821224&view=markup#l580
>
> Implementation: https://svn.apache.org/viewvc/subversion/tags/1.10.6/subversion/libsvn_subr/io.c?revision=1865520&view=markup#l1321
>
> Note that SVN has to worry about filesystems without sub-second timestamp
> resolution, e.g. VFAT which has a modified timestamp resolution of 2 seconds.
> We can probably assume nanosecond timestamps on OpenBSD? Note the comments
> in SVN's code regarding Linux ext3/4, though. Apparently 10ms would be safe?
>
> SVN disables sleep for timestamps in its regress test suite so that tests can
> be run on VFAT in a reasonable amount of time. This means SVN's tests have to
> always change the size of modified files to avoid the timestamp race, which
> test authors (myself included) occasionally forget to do...
>
> Writing reliable tests should be an easy thing to do, and your suggested
> approach does not make it any easier. Also consider that the scope of this
> problem is wider than our regress tests. Anyone writing shell scripts with
> got will eventually hit this issue and would end up debugging it the hard way.
>
> There's already a test which ensures that file size is changed to work around
> spurious test failures, see below. I did this as a quick fix but should have
> written a proper fix instead. This hack could be removed if a better solution
> were implemented in C.
>
> A good place to sleep might be at the bottom of worktree.c:sync_fileindex().
> Do you want to try this?
>
> FWIW, the problem fixed below was seen on bare iron, not in a VM.
>
> -----------------------------------------------
> commit 6c6b73bb412843c96a7dca913c41a91827d9018c
> from: Stefan Sperling <stsp@stsp.name>
> date: Sat Aug 10 15:24:59 2019 UTC
>
> fix race condition in test_revert_patch_one_change
>
> diff ede14c87a98ea1c97ce15353442b532ac77a8770 9acaee36224e921ff553189e5a437768de635992
> blob - d66beb7f0760252ff97e00a9b4415b40cf50049b
> blob + 170bc3b29f399c15ed51b80c19922e0d5c6ba58b
> --- regress/cmdline/revert.sh
> +++ regress/cmdline/revert.sh
> @@ -809,7 +809,10 @@ function test_revert_patch_one_change {
> return 1
> fi
>
> - sed -i -e 's/^2$/a/' $testroot/wt/numbers
> + # Ensure file size is changed. Avoids race condition causing test
> + # failures where 'got revert' does not see changes to revert if
> + # timestamps and size in stat info remain unchanged.
> + sed -i -e 's/^2$/aa/' $testroot/wt/numbers
>
> # revert change with -p
> printf "y\n" > $testroot/patchscript
> @@ -826,7 +829,7 @@ function test_revert_patch_one_change {
> @@ -1,5 +1,5 @@
> 1
> -2
> -+a
> ++aa
> 3
> 4
> 5
> @@ -834,6 +837,13 @@ function test_revert_patch_one_change {
> M numbers (change 1 of 1)
> revert this change? [y/n/q] y
> EOF
> + ret="$?"
> + if [ "$ret" != "0" ]; then
> + echo "got revert command failed unexpectedly" >&2
> + test_done "$testroot" "1"
> + return 1
> + fi
> +
> cmp -s $testroot/stdout.expected $testroot/stdout
> ret="$?"
> if [ "$ret" != "0" ]; then
>
>
patch: regress: Work around glitchy clocks in vmm guests