git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Test #7 in t9200-git-cvsexportcommit fails
@ 2007-07-22 19:41 Jason Sewall
  2007-07-22 20:21 ` Alex Riesen
  0 siblings, 1 reply; 21+ messages in thread
From: Jason Sewall @ 2007-07-22 19:41 UTC (permalink / raw)
  To: git, Junio C Hamano

This test fails for me on the current head (pulled just now) and where
the test was introduced (e86ad71fe).

All other tests pass.

I know almost nothing about how CVS works internally, so I don't have
any insight as to the cause of this problem - all I can see is that
the contents of CVS/Entries has the 'with spaces' files at 1.1 instead
of the expect 1.2.

I'm happy to provide more information if you can tell me how to get
it. In particular, I'd like to tell you about my version of perl-cvs
(or whatever it's called) but I have no idea how to do that...

Jason

P.S. I don't use this part of git at all, so this is not a priority
for me. I am using Fedora 7, which is definitely a mainstream distro,
so I imagine others might have this problem too.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Test #7 in t9200-git-cvsexportcommit fails
  2007-07-22 19:41 Test #7 in t9200-git-cvsexportcommit fails Jason Sewall
@ 2007-07-22 20:21 ` Alex Riesen
  2007-07-22 20:49   ` Jason Sewall
  0 siblings, 1 reply; 21+ messages in thread
From: Alex Riesen @ 2007-07-22 20:21 UTC (permalink / raw)
  To: Jason Sewall; +Cc: git, Junio C Hamano

Jason Sewall, Sun, Jul 22, 2007 21:41:53 +0200:
> This test fails for me on the current head (pulled just now) and where
> the test was introduced (e86ad71fe).

Aahh, the test where CVS failed to commit sub-second changes...
It never really succeeded.

> P.S. I don't use this part of git at all, so this is not a priority
> for me. I am using Fedora 7, which is definitely a mainstream distro,
> so I imagine others might have this problem too.

Just disable it:

    $ echo "export GIT_SKIP_TESTS = t9200" >>config.mak

It'll never work, cvs does not commit changes made during one second,
as they have the same timestamp.

If you feel interested, try investigating the test by running it with
"-d -v", like this:

    $ cd t
    $ ./t9200-git-cvsexportcommit.sh -d -v -i

You'll have to run it multiple times, probably: the problem is
sometimes timing dependent and changed output conditions may make it
go away for a while. Just continue trying.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Test #7 in t9200-git-cvsexportcommit fails
  2007-07-22 20:21 ` Alex Riesen
@ 2007-07-22 20:49   ` Jason Sewall
  2007-07-22 21:42     ` Alex Riesen
  2007-07-22 22:19     ` Junio C Hamano
  0 siblings, 2 replies; 21+ messages in thread
From: Jason Sewall @ 2007-07-22 20:49 UTC (permalink / raw)
  To: Alex Riesen; +Cc: git, Junio C Hamano

> It'll never work, cvs does not commit changes made during one second,
> as they have the same timestamp.

Why not add a delay in there, like this:

id=$(git rev-list --max-count=1 HEAD) && sleep 2

It makes the test work for me.

Jason

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Test #7 in t9200-git-cvsexportcommit fails
  2007-07-22 20:49   ` Jason Sewall
@ 2007-07-22 21:42     ` Alex Riesen
  2007-07-22 22:19     ` Junio C Hamano
  1 sibling, 0 replies; 21+ messages in thread
From: Alex Riesen @ 2007-07-22 21:42 UTC (permalink / raw)
  To: Jason Sewall; +Cc: git, Junio C Hamano

Jason Sewall, Sun, Jul 22, 2007 22:49:19 +0200:
> >It'll never work, cvs does not commit changes made during one second,
> >as they have the same timestamp.
> 
> Why not add a delay in there, like this:
> 
> id=$(git rev-list --max-count=1 HEAD) && sleep 2
> 
> It makes the test work for me.

It looks just like another reason to disable it. It is not like the
_git_ functionality which is used by git-cvsexportcommit is not
already tested elsewhere.

Note that I do _NOT_ suggest disabling it by default, but a bit of
warning would probably do some good:

diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
index 4efa0c9..e5e9e36 100755
--- a/t/t9200-git-cvsexportcommit.sh
+++ b/t/t9200-git-cvsexportcommit.sh
@@ -6,6 +6,12 @@ test_description='CVS export comit. '
 
 . ./test-lib.sh
 
+echo >&2
+echo >&2 "This test is very timing dependent and may fail."
+echo >&2 "If you don't need git-cvsexportcommit you're better off"
+echo >&2 "disabling it: make test GIT_SKIP_TESTS=t9200"
+echo >&2
+
 cvs >/dev/null 2>&1
 if test $? -ne 1
 then

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: Test #7 in t9200-git-cvsexportcommit fails
  2007-07-22 20:49   ` Jason Sewall
  2007-07-22 21:42     ` Alex Riesen
@ 2007-07-22 22:19     ` Junio C Hamano
  2007-07-23  3:59       ` [PATCH] Add a 1-second sleep to git-cvsexportcommit test Jason Sewall
  1 sibling, 1 reply; 21+ messages in thread
From: Junio C Hamano @ 2007-07-22 22:19 UTC (permalink / raw)
  To: Jason Sewall; +Cc: Alex Riesen, git, Junio C Hamano

"Jason Sewall" <jasonsewall@gmail.com> writes:

>> It'll never work, cvs does not commit changes made during one second,
>> as they have the same timestamp.

Heh, racy CVS?

> Why not add a delay in there, like this:
>
> id=$(git rev-list --max-count=1 HEAD) && sleep 2
>
> It makes the test work for me.

Sounds like an acceptable workaround.  Care to send in a tested
signed patch?

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-22 22:19     ` Junio C Hamano
@ 2007-07-23  3:59       ` Jason Sewall
  2007-07-23  4:32         ` Junio C Hamano
  0 siblings, 1 reply; 21+ messages in thread
From: Jason Sewall @ 2007-07-23  3:59 UTC (permalink / raw)
  To: git; +Cc: gitster, raa.lkml, Jason Sewall

Test #7 of t9200 isn't likely to succeed because tests are executed too fast for cvs; add a delay to give it a chance to succeed.
---
 I think I didn't send this through the proper server, so here it is finally.
 t/t9200-git-cvsexportcommit.sh |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
index 4efa0c9..2096e59 100755
--- a/t/t9200-git-cvsexportcommit.sh
+++ b/t/t9200-git-cvsexportcommit.sh
@@ -164,6 +164,7 @@ test_expect_success \
       git add "G g/with spaces.png" &&
       git commit -a -m "Update with spaces" &&
       id=$(git rev-list --max-count=1 HEAD) &&
+      sleep 1 &&
       (cd "$CVSWORK" &&
       git-cvsexportcommit -c $id
       test "$(echo $(sort "G g/CVS/Entries"|cut -d/ -f2,3,5))" = "with spaces.png/1.2/-kb with spaces.txt/1.2/"
--
1.5.3.rc2.4.g726f9

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-23  3:59       ` [PATCH] Add a 1-second sleep to git-cvsexportcommit test Jason Sewall
@ 2007-07-23  4:32         ` Junio C Hamano
  2007-07-23  7:55           ` Simon 'corecode' Schubert
  0 siblings, 1 reply; 21+ messages in thread
From: Junio C Hamano @ 2007-07-23  4:32 UTC (permalink / raw)
  To: Jason Sewall; +Cc: git, raa.lkml

Jason Sewall <jasonsewall@gmail.com> writes:

> Test #7 of t9200 isn't likely to succeed because tests are executed too fast for cvs; add a delay to give it a chance to succeed.
> ---
>  I think I didn't send this through the proper server, so here it is finally.
>  t/t9200-git-cvsexportcommit.sh |    1 +
>  1 files changed, 1 insertions(+), 0 deletions(-)
>
> diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
> index 4efa0c9..2096e59 100755
> --- a/t/t9200-git-cvsexportcommit.sh
> +++ b/t/t9200-git-cvsexportcommit.sh
> @@ -164,6 +164,7 @@ test_expect_success \
>        git add "G g/with spaces.png" &&
>        git commit -a -m "Update with spaces" &&
>        id=$(git rev-list --max-count=1 HEAD) &&
> +      sleep 1 &&
>        (cd "$CVSWORK" &&
>        git-cvsexportcommit -c $id
>        test "$(echo $(sort "G g/CVS/Entries"|cut -d/ -f2,3,5))" = "with spaces.png/1.2/-kb with spaces.txt/1.2/"

Thanks.

But this makes one wonder why only this test and nothing else is
affected.  Maybe our machines are not fast enough for other
tests to execute inside a second, but in 6 months others start
to become problem and we would need a similar fix again?

I am tempted to do this instead, although it would make it much
slower.

It may be that we may want to fix this inside cvsexportcommit
itself, instead of working it around in the tests.  If somebody
tries to push more than one commit from git using two
cvsexportcommit in a row, he would need to make sure that the
second run happens one or more seconds after the first run,
otherwise he will see the exact corruption in real life.

Anybody else have better ideas?  

---
 t/t9200-git-cvsexportcommit.sh |   29 ++++++++++++++++++-----------
 1 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
index 4efa0c9..28c7dfa 100755
--- a/t/t9200-git-cvsexportcommit.sh
+++ b/t/t9200-git-cvsexportcommit.sh
@@ -28,6 +28,13 @@ git add empty &&
 git commit -q -a -m "Initial" 2>/dev/null ||
 exit 1
 
+git_cvsexportcommit () {
+	# CVS does not even look at files whose timestamps
+	# match the ones recorded in CVS/Entries
+	sleep 2 &&
+	git cvsexportcommit "$@"
+}
+
 test_expect_success \
     'New file' \
     'mkdir A B C D E F &&
@@ -42,7 +49,7 @@ test_expect_success \
      git commit -a -m "Test: New file" &&
      id=$(git rev-list --max-count=1 HEAD) &&
      (cd "$CVSWORK" &&
-     git cvsexportcommit -c $id &&
+     git_cvsexportcommit -c $id &&
      test "$(echo $(sort A/CVS/Entries|cut -d/ -f2,3,5))" = "newfile1.txt/1.1/" &&
      test "$(echo $(sort B/CVS/Entries|cut -d/ -f2,3,5))" = "newfile2.txt/1.1/" &&
      test "$(echo $(sort C/CVS/Entries|cut -d/ -f2,3,5))" = "newfile3.png/1.1/-kb" &&
@@ -66,7 +73,7 @@ test_expect_success \
      git commit -a -m "Test: Remove, add and update" &&
      id=$(git rev-list --max-count=1 HEAD) &&
      (cd "$CVSWORK" &&
-     git cvsexportcommit -c $id &&
+     git_cvsexportcommit -c $id &&
      test "$(echo $(sort A/CVS/Entries|cut -d/ -f2,3,5))" = "newfile1.txt/1.2/" &&
      test "$(echo $(sort B/CVS/Entries|cut -d/ -f2,3,5))" = "" &&
      test "$(echo $(sort C/CVS/Entries|cut -d/ -f2,3,5))" = "" &&
@@ -88,7 +95,7 @@ test_expect_success \
      git commit -a -m "generation 2" &&
      id=$(git rev-list --max-count=1 HEAD) &&
      (cd "$CVSWORK" &&
-     ! git cvsexportcommit -c $id
+     ! git_cvsexportcommit -c $id
      )'
 
 #test_expect_success \
@@ -100,7 +107,7 @@ test_expect_success \
 #     git commit -a -m "generation 3" &&
 #     id=$(git rev-list --max-count=1 HEAD) &&
 #     (cd "$CVSWORK" &&
-#     ! git cvsexportcommit -c $id
+#     ! git_cvsexportcommit -c $id
 #     )'
 
 # We reuse the state from two tests back here
@@ -114,7 +121,7 @@ test_expect_success \
      git commit -a -m "test: remove only a binary file" &&
      id=$(git rev-list --max-count=1 HEAD) &&
      (cd "$CVSWORK" &&
-     git cvsexportcommit -c $id &&
+     git_cvsexportcommit -c $id &&
      test "$(echo $(sort A/CVS/Entries|cut -d/ -f2,3,5))" = "newfile1.txt/1.2/" &&
      test "$(echo $(sort B/CVS/Entries|cut -d/ -f2,3,5))" = "" &&
      test "$(echo $(sort C/CVS/Entries|cut -d/ -f2,3,5))" = "" &&
@@ -132,7 +139,7 @@ test_expect_success \
      git commit -a -m "test: remove only a binary file" &&
      id=$(git rev-list --max-count=1 HEAD) &&
      (cd "$CVSWORK" &&
-     git cvsexportcommit -c $id &&
+     git_cvsexportcommit -c $id &&
      test "$(echo $(sort A/CVS/Entries|cut -d/ -f2,3,5))" = "" &&
      test "$(echo $(sort B/CVS/Entries|cut -d/ -f2,3,5))" = "" &&
      test "$(echo $(sort C/CVS/Entries|cut -d/ -f2,3,5))" = "" &&
@@ -153,7 +160,7 @@ test_expect_success \
       git commit -a -m "With spaces" &&
       id=$(git rev-list --max-count=1 HEAD) &&
       (cd "$CVSWORK" &&
-      git-cvsexportcommit -c $id &&
+      git_cvsexportcommit -c $id &&
       test "$(echo $(sort "G g/CVS/Entries"|cut -d/ -f2,3,5))" = "with spaces.png/1.1/-kb with spaces.txt/1.1/"
       )'
 
@@ -165,7 +172,7 @@ test_expect_success \
       git commit -a -m "Update with spaces" &&
       id=$(git rev-list --max-count=1 HEAD) &&
       (cd "$CVSWORK" &&
-      git-cvsexportcommit -c $id
+      git_cvsexportcommit -c $id
       test "$(echo $(sort "G g/CVS/Entries"|cut -d/ -f2,3,5))" = "with spaces.png/1.2/-kb with spaces.txt/1.2/"
       )'
 
@@ -190,7 +197,7 @@ test_expect_success \
       git commit -a -m "Går det så går det" && \
       id=$(git rev-list --max-count=1 HEAD) &&
       (cd "$CVSWORK" &&
-      git-cvsexportcommit -v -c $id &&
+      git_cvsexportcommit -v -c $id &&
       test "$(echo $(sort Å/goo/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/å/ä/ö/CVS/Entries|cut -d/ -f2,3,5))" = "gårdetsågårdet.png/1.1/-kb gårdetsågårdet.txt/1.1/"
       )'
 
@@ -208,7 +215,7 @@ test_expect_success \
       git commit -a -m "Update two" &&
       id=$(git rev-list --max-count=1 HEAD) &&
       (cd "$CVSWORK" &&
-      ! git-cvsexportcommit -c $id
+      ! git_cvsexportcommit -c $id
       )'
 
 case "$(git repo-config --bool core.filemode)" in
@@ -225,7 +232,7 @@ test_expect_success \
       git add G/off &&
       git commit -a -m "Execute test" &&
       (cd "$CVSWORK" &&
-      git-cvsexportcommit -c HEAD
+      git_cvsexportcommit -c HEAD
       test -x G/on &&
       ! test -x G/off
       )'

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-23  4:32         ` Junio C Hamano
@ 2007-07-23  7:55           ` Simon 'corecode' Schubert
  2007-07-24  0:23             ` Robin Rosenberg
  0 siblings, 1 reply; 21+ messages in thread
From: Simon 'corecode' Schubert @ 2007-07-23  7:55 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Jason Sewall, git, raa.lkml

Junio C Hamano wrote:
> It may be that we may want to fix this inside cvsexportcommit
> itself, instead of working it around in the tests.  If somebody
> tries to push more than one commit from git using two
> cvsexportcommit in a row, he would need to make sure that the
> second run happens one or more seconds after the first run,
> otherwise he will see the exact corruption in real life.

Ah, now I see the problem.  The timestamp in the CVS/Entries is the same (because it only has second granularity), so cvs commit won't consider it as changed.

That's the reason why CVS usually waits until the second turns after a "update" (obviously not after a "commit").  So we could either turn back the timestamp in the Entries file (ugly) or simply wait until the second turns.  Given the overall cvs performance, this won't be a big issue, I guess.

cheers
  simon

-- 
Serve - BSD     +++  RENT this banner advert  +++    ASCII Ribbon   /"\
Work - Mac      +++  space for low €€€ NOW!1  +++      Campaign     \ /
Party Enjoy Relax   |   http://dragonflybsd.org      Against  HTML   \
Dude 2c 2 the max   !   http://golden-apple.biz       Mail + News   / \

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-23  7:55           ` Simon 'corecode' Schubert
@ 2007-07-24  0:23             ` Robin Rosenberg
  2007-07-24  8:11               ` Simon 'corecode' Schubert
  0 siblings, 1 reply; 21+ messages in thread
From: Robin Rosenberg @ 2007-07-24  0:23 UTC (permalink / raw)
  To: Simon 'corecode' Schubert
  Cc: Junio C Hamano, Jason Sewall, git, raa.lkml

måndag 23 juli 2007 skrev Simon 'corecode' Schubert:
> Junio C Hamano wrote:
> > It may be that we may want to fix this inside cvsexportcommit
> > itself, instead of working it around in the tests.  If somebody
> > tries to push more than one commit from git using two
> > cvsexportcommit in a row, he would need to make sure that the
> > second run happens one or more seconds after the first run,
> > otherwise he will see the exact corruption in real life.
> 
> Ah, now I see the problem.  The timestamp in the CVS/Entries is the same (because it only has second granularity), 
> so cvs commit won't consider it as changed. 
> 
> That's the reason why CVS usually waits until the second turns after a "update" (obviously not after a "commit"). 
> So we could either turn back the timestamp in the Entries file (ugly) or simply wait until the second turns.  Given 
> the overall cvs performance, this won't be a big issue, I guess. 
> 
> cheers
>   simon
> 

CVS sleeps after commit here. Can we bisect it? I have 1.12.3 (mandriva). The patch below I think
would work around the problem, rather than trying to fix the test. but I'd like to have the last CVS 
revision where it does not work for the patch comment 

Since the sleep is per invocation of cvsexportcommit it won't hurt too much since it is rarely invoked
on a huge number of git commits.

-- robin

diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl
index d6ae99b..6377408 100755
--- a/git-cvsexportcommit.perl
+++ b/git-cvsexportcommit.perl
@@ -277,6 +277,10 @@ if ($opt_c) {
 # clean up
 unlink(".cvsexportcommit.diff");

+# timestamp problems. Invoking this command on a machine that is too fast may result in
+# CVS not recognizing changed because the timestamp is unchanged
+sleep(1);
+
 sub usage {
        print STDERR <<END;
 Usage: GIT_DIR=/path/to/.git ${\basename $0} [-h] [-p] [-v] [-c] [-f] [-m msgprefix] [ parent ] commit

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-24  0:23             ` Robin Rosenberg
@ 2007-07-24  8:11               ` Simon 'corecode' Schubert
  2007-07-24  8:33                 ` Robin Rosenberg
  0 siblings, 1 reply; 21+ messages in thread
From: Simon 'corecode' Schubert @ 2007-07-24  8:11 UTC (permalink / raw)
  To: Robin Rosenberg; +Cc: Junio C Hamano, Jason Sewall, git, raa.lkml

Robin Rosenberg wrote:
>>> It may be that we may want to fix this inside cvsexportcommit
>>> itself, instead of working it around in the tests.  If somebody
>>> tries to push more than one commit from git using two
>>> cvsexportcommit in a row, he would need to make sure that the
>>> second run happens one or more seconds after the first run,
>>> otherwise he will see the exact corruption in real life.
>> Ah, now I see the problem.  The timestamp in the CVS/Entries is the same (because it only has second granularity), 
>> so cvs commit won't consider it as changed. 
>>
>> That's the reason why CVS usually waits until the second turns after a "update" (obviously not after a "commit"). 
>> So we could either turn back the timestamp in the Entries file (ugly) or simply wait until the second turns.  Given 
>> the overall cvs performance, this won't be a big issue, I guess. 
> 
> CVS sleeps after commit here. Can we bisect it? I have 1.12.3
> (mandriva). The patch below I think would work around the problem,
> rather than trying to fix the test. but I'd like to have the last CVS
>  revision where it does not work for the patch comment

This is a strange thing.  CVS has this in their commit code since 1996.  So I wonder why this is getting triggered.

> Since the sleep is per invocation of cvsexportcommit it won't hurt
> too much since it is rarely invoked on a huge number of git commits.

The question also is, why does this happen on two sequential invocations of cvsexportcommit, but not on two cvs commits done by cvsexportcommit?  This should look the same to cvs, no?

cheers
  simon

-- 
Serve - BSD     +++  RENT this banner advert  +++    ASCII Ribbon   /"\
Work - Mac      +++  space for low €€€ NOW!1  +++      Campaign     \ /
Party Enjoy Relax   |   http://dragonflybsd.org      Against  HTML   \
Dude 2c 2 the max   !   http://golden-apple.biz       Mail + News   / \

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-24  8:11               ` Simon 'corecode' Schubert
@ 2007-07-24  8:33                 ` Robin Rosenberg
  2007-07-24  8:38                   ` Simon 'corecode' Schubert
  0 siblings, 1 reply; 21+ messages in thread
From: Robin Rosenberg @ 2007-07-24  8:33 UTC (permalink / raw)
  To: Simon 'corecode' Schubert
  Cc: Junio C Hamano, Jason Sewall, git, raa.lkml

tisdag 24 juli 2007 skrev Simon 'corecode' Schubert:
> Robin Rosenberg wrote:
> >>> It may be that we may want to fix this inside cvsexportcommit
> >>> itself, instead of working it around in the tests.  If somebody
> >>> tries to push more than one commit from git using two
> >>> cvsexportcommit in a row, he would need to make sure that the
> >>> second run happens one or more seconds after the first run,
> >>> otherwise he will see the exact corruption in real life.
> >> Ah, now I see the problem.  The timestamp in the CVS/Entries is the same (because it only has second granularity), 
> >> so cvs commit won't consider it as changed. 
> >>
> >> That's the reason why CVS usually waits until the second turns after a "update" (obviously not after a "commit"). 
> >> So we could either turn back the timestamp in the Entries file (ugly) or simply wait until the second turns.  Given 
> >> the overall cvs performance, this won't be a big issue, I guess. 
> > 
> > CVS sleeps after commit here. Can we bisect it? I have 1.12.3
> > (mandriva). The patch below I think would work around the problem,
> > rather than trying to fix the test. but I'd like to have the last CVS
> >  revision where it does not work for the patch comment
> 
> This is a strange thing.  CVS has this in their commit code since 1996.  So I wonder why this is getting triggered.
> 
> > Since the sleep is per invocation of cvsexportcommit it won't hurt
> > too much since it is rarely invoked on a huge number of git commits.
> 
> The question also is, why does this happen on two sequential invocations of cvsexportcommit, but not on two cvs commits done by cvsexportcommit?  This should look the same to cvs, no?

I reread my post here...  My last sentence was a comment to the patch and not the sleep in CVS.

-- robin

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-24  8:33                 ` Robin Rosenberg
@ 2007-07-24  8:38                   ` Simon 'corecode' Schubert
  2007-07-24  9:34                     ` Robin Rosenberg
  0 siblings, 1 reply; 21+ messages in thread
From: Simon 'corecode' Schubert @ 2007-07-24  8:38 UTC (permalink / raw)
  To: Robin Rosenberg; +Cc: Junio C Hamano, Jason Sewall, git, raa.lkml

Robin Rosenberg wrote:
>>> Since the sleep is per invocation of cvsexportcommit it won't hurt
>>> too much since it is rarely invoked on a huge number of git commits.
>> The question also is, why does this happen on two sequential invocations of cvsexportcommit, but not on two cvs commits done by cvsexportcommit?  This should look the same to cvs, no?
> 
> I reread my post here... My last sentence was a comment to the patch
> and not the sleep in CVS.

Yes, I realize this.  Still, I wonder the same:  why is this needed *per invocation of cvsexportcommit* and not *per invocation of cvs*?  Seems unintuitive to me, or I didn't read the patch good enough.

cheers
  simon

-- 
Serve - BSD     +++  RENT this banner advert  +++    ASCII Ribbon   /"\
Work - Mac      +++  space for low €€€ NOW!1  +++      Campaign     \ /
Party Enjoy Relax   |   http://dragonflybsd.org      Against  HTML   \
Dude 2c 2 the max   !   http://golden-apple.biz       Mail + News   / \

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-24  8:38                   ` Simon 'corecode' Schubert
@ 2007-07-24  9:34                     ` Robin Rosenberg
  2007-07-24 10:14                       ` Junio C Hamano
  2007-07-24 19:02                       ` Linus Torvalds
  0 siblings, 2 replies; 21+ messages in thread
From: Robin Rosenberg @ 2007-07-24  9:34 UTC (permalink / raw)
  To: Simon 'corecode' Schubert
  Cc: Junio C Hamano, Jason Sewall, git, raa.lkml

tisdag 24 juli 2007 skrev Simon 'corecode' Schubert:
> Robin Rosenberg wrote:
> >>> Since the sleep is per invocation of cvsexportcommit it won't hurt
> >>> too much since it is rarely invoked on a huge number of git commits.
> >> The question also is, why does this happen on two sequential invocations 
> >> of cvsexportcommit, but not on two cvs commits done by cvsexportcommit?  
> >> This should look the same to cvs, no?  
> > 
> > I reread my post here... My last sentence was a comment to the patch
> > and not the sleep in CVS.
> 
> Yes, I realize this.  Still, I wonder the same:  why is this needed *per
> invocation of cvsexportcommit* and not *per invocation of cvs*?  Seems
> unintuitive to me, or I didn't read the patch good enough.  

Besides the potential update and status commands cvs is only invoked once per
invocation of cvsexportcommit so there is no difference between a sleep per CVS
invokation vs a sleep per cvsexportcommit invocation. The sleep is needed to make
sure file modification times resulting from git-apply are different. 

The sleep in CVS fixes that on my machine so I do not have a problem (and cannot 
really verify that the patch I made fixes the problem).

This debug patch reveals the sleep in CVS. CVS does the sleep differently for different platforms.

diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
index 4efa0c9..9a1e998 100755
--- a/t/t9200-git-cvsexportcommit.sh
+++ b/t/t9200-git-cvsexportcommit.sh
@@ -153,7 +153,7 @@ test_expect_success \
       git commit -a -m "With spaces" &&
       id=$(git rev-list --max-count=1 HEAD) &&
       (cd "$CVSWORK" &&
-      git-cvsexportcommit -c $id &&
+      strace -fF -o a git-cvsexportcommit -c $id &&
       test "$(echo $(sort "G g/CVS/Entries"|cut -d/ -f2,3,5))" = "with spaces.png/1.1/-kb with spaces.txt/1.1/"
       )'
 
@@ -165,7 +165,7 @@ test_expect_success \
       git commit -a -m "Update with spaces" &&
       id=$(git rev-list --max-count=1 HEAD) &&
       (cd "$CVSWORK" &&
-      git-cvsexportcommit -c $id
+      strace -fF -o b git-cvsexportcommit -c $id
       test "$(echo $(sort "G g/CVS/Entries"|cut -d/ -f2,3,5))" = "with spaces.png/1.2/-kb with spaces.txt/1.2/"
       )'

Tail of the first cvsexportcommit invocation (trash/cvswork/a) from the place where it writes the last file
into the CVS repo.
 
27778 write(7, "/with spaces.png/1.1/Tue Jul 24 "..., 99) = 99
27778 close(7)                          = 0
27778 munmap(0xb7f15000, 4096)          = 0
27778 rename("CVS/Entries.Backup", "CVS/Entries") = 0
27778 unlink("CVS/Entries.Log")         = 0
27778 fchdir(6)                         = 0
27778 close(6)                          = 0
27778 rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
27778 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
27778 rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
27778 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
27778 rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
27778 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
27778 rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
27778 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
27778 rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
27778 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
27778 rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
27778 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
27778 time(NULL)                        = 1185268822
27778 gettimeofday({1185268822, 953340}, NULL) = 0

Here CVS sleeps. The amount varies between invocations since it
only sleeps enough for the seconds to wrap.

27778 nanosleep({0, 46660000}, NULL)    = 0
27778 time(NULL)                        = 1185268823
27778 rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
27778 close(1 <unfinished ...>
27766 <... read resumed> "", 4096)      = 0
27778 <... close resumed> )             = 0
27766 close(6 <unfinished ...>
27778 munmap(0xb7f14000, 4096 <unfinished ...>
27766 <... close resumed> )             = 0
27778 <... munmap resumed> )            = 0

Back into git-cvsexportcommit
27766 rt_sigaction(SIGHUP, {SIG_IGN},  <unfinished ...>
27778 exit_group(0)                     = ?
27766 <... rt_sigaction resumed> {SIG_DFL}, 8) = 0
27766 --- SIGCHLD (Child exited) @ 0 (0) ---
27766 rt_sigaction(SIGINT, {SIG_IGN}, {SIG_DFL}, 8) = 0
27766 rt_sigaction(SIGQUIT, {SIG_IGN}, {SIG_DFL}, 8) = 0
27766 waitpid(27778, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 27778
27766 rt_sigaction(SIGHUP, {SIG_DFL}, NULL, 8) = 0
27766 rt_sigaction(SIGINT, {SIG_DFL}, NULL, 8) = 0
27766 rt_sigaction(SIGQUIT, {SIG_DFL}, NULL, 8) = 0
27766 unlink(".msg")                    = 0
27766 unlink(".cvsexportcommit.diff")   = 0
27766 stat64("/home/me/tmp/git-cvsapplycommit-55ADfh", {st_mode=S_IFDIR|0700, st_size=6, ...}) = 0
27766 lstat64("/home/me/tmp/git-cvsapplycommit-55ADfh", {st_mode=S_IFDIR|0700, st_size=6, ...}) = 0
27766 chmod("/home/me/tmp/git-cvsapplycommit-55ADfh", 0700) = 0
27766 open("/home/me/tmp/git-cvsapplycommit-55ADfh", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 6
27766 fstat64(6, {st_mode=S_IFDIR|0700, st_size=6, ...}) = 0
27766 fcntl64(6, F_SETFD, FD_CLOEXEC)   = 0
27766 getdents64(6, /* 2 entries */, 4096) = 48
27766 getdents64(6, /* 0 entries */, 4096) = 0
27766 close(6)                          = 0
27766 rmdir("/home/me/tmp/git-cvsapplycommit-55ADfh") = 0
27766 write(1, "/home/me/SW/GIT/t/trash/cvsroot/"..., 234) = 234
27766 exit_group(0)                     = ?

-- robin

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-24  9:34                     ` Robin Rosenberg
@ 2007-07-24 10:14                       ` Junio C Hamano
  2007-07-24 12:57                         ` Robin Rosenberg
  2007-07-24 19:02                       ` Linus Torvalds
  1 sibling, 1 reply; 21+ messages in thread
From: Junio C Hamano @ 2007-07-24 10:14 UTC (permalink / raw)
  To: Robin Rosenberg
  Cc: Simon 'corecode' Schubert, Jason Sewall, git, raa.lkml

Robin Rosenberg <robin.rosenberg.lists@dewire.com> writes:

> Tail of the first cvsexportcommit invocation (trash/cvswork/a) from the place where it writes the last file
> into the CVS repo.
>  
> 27778 write(7, "/with spaces.png/1.1/Tue Jul 24 "..., 99) = 99
> 27778 close(7)                          = 0
> 27778 munmap(0xb7f15000, 4096)          = 0
> 27778 rename("CVS/Entries.Backup", "CVS/Entries") = 0
> 27778 unlink("CVS/Entries.Log")         = 0
> 27778 fchdir(6)                         = 0
> 27778 close(6)                          = 0
> ...
> 27778 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
> 27778 time(NULL)                        = 1185268822
> 27778 gettimeofday({1185268822, 953340}, NULL) = 0
>
> Here CVS sleeps. The amount varies between invocations since it
> only sleeps enough for the seconds to wrap.

Makes one wonder what it would do if you are on a filesystem
with coarser-than-a-second timestamp resolution.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-24 10:14                       ` Junio C Hamano
@ 2007-07-24 12:57                         ` Robin Rosenberg
  2007-07-24 15:31                           ` Jason Sewall
  0 siblings, 1 reply; 21+ messages in thread
From: Robin Rosenberg @ 2007-07-24 12:57 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: Simon 'corecode' Schubert, Jason Sewall, git, raa.lkml

tisdag 24 juli 2007 skrev Junio C Hamano:
> > Here CVS sleeps. The amount varies between invocations since it
> > only sleeps enough for the seconds to wrap.
> 
> Makes one wonder what it would do if you are on a filesystem
> with coarser-than-a-second timestamp resolution.

Like fat, but then the last test fails on FAT, which wasn't the case. Any other reasonable file
systems that comes to your mind?

Jason, could you provide us with some more information on OS, fs, cvs version etc.

Whether timestamp granularity is larger than a second or not can be checked with this line, I think:

	touch a && ls --full-time a && sleep 1 && touch a && ls --full-time a

Sample output where the timestamps are roughly one second apart.
-rw-r--r-- 1 me me 0 2007-07-24 14:15:47.330927250 +0200 a
-rw-r--r-- 1 me me 0 2007-07-24 14:15:48.338990250 +0200 a

-- robin

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-24 12:57                         ` Robin Rosenberg
@ 2007-07-24 15:31                           ` Jason Sewall
  0 siblings, 0 replies; 21+ messages in thread
From: Jason Sewall @ 2007-07-24 15:31 UTC (permalink / raw)
  To: Robin Rosenberg
  Cc: Junio C Hamano, Simon 'corecode' Schubert, git, raa.lkml

Fedora 7
Kernel 2.6.22 (SMP)
CVS 1.11.22
ext3 (unsure of version or how to discover version)

As one would expect from the above, the 'granularity' test you gave my
reveals 1-second granularity.

On 7/24/07, Robin Rosenberg <robin.rosenberg.lists@dewire.com> wrote:
> tisdag 24 juli 2007 skrev Junio C Hamano:
> > > Here CVS sleeps. The amount varies between invocations since it
> > > only sleeps enough for the seconds to wrap.
> >
> > Makes one wonder what it would do if you are on a filesystem
> > with coarser-than-a-second timestamp resolution.
>
> Like fat, but then the last test fails on FAT, which wasn't the case. Any other reasonable file
> systems that comes to your mind?
>
> Jason, could you provide us with some more information on OS, fs, cvs version etc.
>
> Whether timestamp granularity is larger than a second or not can be checked with this line, I think:
>
>         touch a && ls --full-time a && sleep 1 && touch a && ls --full-time a
>
> Sample output where the timestamps are roughly one second apart.
> -rw-r--r-- 1 me me 0 2007-07-24 14:15:47.330927250 +0200 a
> -rw-r--r-- 1 me me 0 2007-07-24 14:15:48.338990250 +0200 a
>
> -- robin
>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-24  9:34                     ` Robin Rosenberg
  2007-07-24 10:14                       ` Junio C Hamano
@ 2007-07-24 19:02                       ` Linus Torvalds
  2007-07-24 22:56                         ` Robin Rosenberg
  2007-07-25  7:35                         ` Andy Parkins
  1 sibling, 2 replies; 21+ messages in thread
From: Linus Torvalds @ 2007-07-24 19:02 UTC (permalink / raw)
  To: Robin Rosenberg
  Cc: Simon 'corecode' Schubert, Junio C Hamano, Jason Sewall,
	git, raa.lkml



On Tue, 24 Jul 2007, Robin Rosenberg wrote:
>
> 27778 time(NULL)                        = 1185268822
> 27778 gettimeofday({1185268822, 953340}, NULL) = 0
> 
> Here CVS sleeps. The amount varies between invocations since it
> only sleeps enough for the seconds to wrap.
> 
> 27778 nanosleep({0, 46660000}, NULL)    = 0
> 27778 time(NULL)                        = 1185268823

Btw, this is *really* dangerous and buggy.

The reason? The CPU real-time clock is very different from whatever clock 
the filesystems may use.

Filesystems generally do not use the same clock as the CPU does. That's 
obviously true for things like networked filesystems, but it's actually 
true even for local filesystems (even on UP) because the CPU "realtime" 
clock rather expensive and much too exact for them. It does all the fancy 
NTP date correction etc, and it has all the complex code to actually make 
sure you don't get any time jumps etc.

So you should basically assume that all filesystems will use a clock that 
is *close*, but not synchronized with the real-time clock. You have NFS 
issues, but even locally you'd generally expect the local filesystem to be 
based on a simply clock that is updated by the timer tick, and is "close 
enough" to the realtime clock that you get with gettimeofday(). But *not* 
identical.

So if you sleep for one second, the filesystem times will update by one 
second, but if you try to *synchronize* to exactly one second, it's not at 
all certain that the *filesystem* clock will be synchronized to the same 
second! Time skew is simply a fact of life.

A really obvious example of this is NFS. Anybody who thinks that the NFS 
times are synchronized to the client real-time clock is just seriously 
mistaken. They may be close, but they won't be identical.

So I think CVS is simply buggy here. It assumes that "filesystem time" is 
the same as "CPU time", and while that sounds like an obvious assumption 
to make, if you think about it for even five seconds (the NFS case above), 
you realize that it's a totally *buggy* assumption.

In other words: if you want the timestamps on two files to be one second 
apart, you have to sleep one second in between writing them (or you have 
to set the time explicitly with "utimes()" or similar). Doing the 
"optimized sleep" simply DOES NOT WORK.

So CVS is buggy. Big surprise. Film at 11.

Btw, if anybody can think of a similar scenario in git, please holler. We 
shouldn't have those kinds of bugs.

So the things you generally can depend on:

 - *within* a single filesystem, the clocks should be comparable (ie you 
   can do "stat()" on two files, and compare the date-stamps between the 
   files).

 - the clocks should obviously be "close" to the local realtime. Time skew 
   is a fact of life, but if time skews by more than a big fraction of a 
   second, something is wrong. It's certainly still very possible (NFS 
   with clients not running NTP), but at least at that point a program can 
   validly say "badly maintained network, it's the users problem".

but depending on exact time syncronization is a really really bad idea.

		Linus

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-24 19:02                       ` Linus Torvalds
@ 2007-07-24 22:56                         ` Robin Rosenberg
  2007-07-24 23:19                           ` Linus Torvalds
  2007-07-25  7:35                         ` Andy Parkins
  1 sibling, 1 reply; 21+ messages in thread
From: Robin Rosenberg @ 2007-07-24 22:56 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Simon 'corecode' Schubert, Junio C Hamano, Jason Sewall,
	git, raa.lkml

tisdag 24 juli 2007 skrev Linus Torvalds:
> 
> On Tue, 24 Jul 2007, Robin Rosenberg wrote:
> >
> > 27778 time(NULL)                        = 1185268822
> > 27778 gettimeofday({1185268822, 953340}, NULL) = 0
> > 
> > Here CVS sleeps. The amount varies between invocations since it
> > only sleeps enough for the seconds to wrap.
> > 
> > 27778 nanosleep({0, 46660000}, NULL)    = 0
> > 27778 time(NULL)                        = 1185268823
> 
> Btw, this is *really* dangerous and buggy.
> 
> The reason? The CPU real-time clock is very different from whatever clock 
> the filesystems may use.
> 
> Filesystems generally do not use the same clock as the CPU does. That's 
> obviously true for things like networked filesystems, but it's actually 
> true even for local filesystems (even on UP) because the CPU "realtime" 
> clock rather expensive and much too exact for them. It does all the fancy 
> NTP date correction etc, and it has all the complex code to actually make 
> sure you don't get any time jumps etc.

Having our mind enlightened, I propose this or nothing as a workaround. Since
cvsexportcommit is really a CVS workaround we might work around some bugs
in CVS itself while we're at it.

-- robin

From: Robin Rosenberg <robin.rosenberg@dewire.com>
Date: Wed, 25 Jul 2007 00:53:24 +0200
Subject: [PATCH] Sleep in git-cvsexportcommit

If git cvsexportcommit is executed fast enough in sequence, the CVS
timestamps could end up being the same. CVS tries to fix this
by sleeping until the CPU clock changes seconds. Unfortunately,
the CPU clock and the file system clock are not necessarily the same, so
the timestamps could be the same anyway. When that happens CVS may not
recognize changed files and cvs will forget to commit some files.

Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
 git-cvsexportcommit.perl |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl
index d6ae99b..f6366be 100755
--- a/git-cvsexportcommit.perl
+++ b/git-cvsexportcommit.perl
@@ -277,6 +277,11 @@ if ($opt_c) {
 # clean up
 unlink(".cvsexportcommit.diff");
 
+# CVS version 1.11.x and 1.12.x sleeps the wrong way to ensure the timestamp 
+# used by CVS and the one set by subsequence file modifications are different.
+# If they are not different CVS will not detect changes.
+sleep(1);
+
 sub usage {
 	print STDERR <<END;
 Usage: GIT_DIR=/path/to/.git ${\basename $0} [-h] [-p] [-v] [-c] [-f] [-m msgprefix] [ parent ] commit
-- 
1.5.2.3

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-24 22:56                         ` Robin Rosenberg
@ 2007-07-24 23:19                           ` Linus Torvalds
  0 siblings, 0 replies; 21+ messages in thread
From: Linus Torvalds @ 2007-07-24 23:19 UTC (permalink / raw)
  To: Robin Rosenberg
  Cc: Simon 'corecode' Schubert, Junio C Hamano, Jason Sewall,
	git, raa.lkml



On Wed, 25 Jul 2007, Robin Rosenberg wrote:
> 
> Having our mind enlightened, I propose this or nothing as a workaround. Since
> cvsexportcommit is really a CVS workaround we might work around some bugs
> in CVS itself while we're at it.

Side note: I think the reason it came up now is that with CONFIG_NO_HZ the 
Linux filesystem clock will easily be off by half a second even for local 
filesystems.

With CONFIG_NO_HZ, we don't update the time as religiously, and as a 
result, people who look at the low-resolution time (like filesystems) will 
get a noticeable skew.

Quite frankly, that's a Linux kernel bug, and we'll fix it. But it doesn't 
really invalidate the argument: applications really shouldn't depend on 
the "filesystem time" being in sync with the "CPU time", and it may be 
that the kernel bug was the one that ended up exposing this mis-feature of 
CVS.

Normally, Linux (and probably most other systems) will keep the local 
filesystems synchronized to within at least one clock-tick of the 
real-time clock, so the clock skew between filesystems and CPU is at most 
in the "few millisecond" range.

That's also the kind of range that NTP will largely guarantee, so 
generally, in most circumstances, while you cannot (and shouldn't) expect 
filesystem times to be "accurate", in most good situations you'll never 
see skews over a few milliseconds.

(But on the other hand, search for "kerberos" and "time skew" on google, 
and you see discussions about allowing five *minutes* of skew etc, so 
clearly the model of "everybody runs NTP" isn't exactly all of it ;)

So I suspect that the CVS code is (a) buggy and (b) hard to show the bug 
actually triggering on a well-maintained machine, and that it may well be 
the case that the only reason it shows up as a bug now is that Jason is 
running a recent kernel with CONFIG_NO_HZ. I have no idea what the default 
Fedora 7 kernel does.

		Linus

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-24 19:02                       ` Linus Torvalds
  2007-07-24 22:56                         ` Robin Rosenberg
@ 2007-07-25  7:35                         ` Andy Parkins
  2007-07-25  7:43                           ` Marius Storm-Olsen
  1 sibling, 1 reply; 21+ messages in thread
From: Andy Parkins @ 2007-07-25  7:35 UTC (permalink / raw)
  To: git
  Cc: Linus Torvalds, Robin Rosenberg,
	Simon 'corecode' Schubert, Junio C Hamano, Jason Sewall,
	raa.lkml

On Tuesday 2007 July 24, Linus Torvalds wrote:

> So if you sleep for one second, the filesystem times will update by one
> second, but if you try to *synchronize* to exactly one second, it's not at
> all certain that the *filesystem* clock will be synchronized to the same
> second! Time skew is simply a fact of life.

I think it's even worse; if memory serves one of the Windows file systems 
(spit) only stores times to a two-second resolution.  So half the time, 
waiting for one second won't change the time stamp _at all_.


Andy
-- 
Dr Andy Parkins, M Eng (hons), MIET
andyparkins@gmail.com

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test
  2007-07-25  7:35                         ` Andy Parkins
@ 2007-07-25  7:43                           ` Marius Storm-Olsen
  0 siblings, 0 replies; 21+ messages in thread
From: Marius Storm-Olsen @ 2007-07-25  7:43 UTC (permalink / raw)
  To: Andy Parkins
  Cc: git, Linus Torvalds, Robin Rosenberg,
	Simon 'corecode' Schubert, Junio C Hamano, Jason Sewall,
	raa.lkml

[-- Attachment #1: Type: text/plain, Size: 922 bytes --]

Andy Parkins said the following on 25.07.2007 09:35:
> On Tuesday 2007 July 24, Linus Torvalds wrote:
> 
>> So if you sleep for one second, the filesystem times will update by one
>> second, but if you try to *synchronize* to exactly one second, it's not at
>> all certain that the *filesystem* clock will be synchronized to the same
>> second! Time skew is simply a fact of life.
> 
> I think it's even worse; if memory serves one of the Windows file systems 
> (spit) only stores times to a two-second resolution.  So half the time, 
> waiting for one second won't change the time stamp _at all_.

"File time stamps on FAT drives are rounded to the nearest two seconds 
(even number) when the file is written to the drive. The file time 
stamps on NTFS drives are rounded to the nearest 100 nanoseconds when 
the file is written to the drive."

http://support.microsoft.com/kb/127830

-- 
.marius


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 187 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2007-07-25  7:43 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-22 19:41 Test #7 in t9200-git-cvsexportcommit fails Jason Sewall
2007-07-22 20:21 ` Alex Riesen
2007-07-22 20:49   ` Jason Sewall
2007-07-22 21:42     ` Alex Riesen
2007-07-22 22:19     ` Junio C Hamano
2007-07-23  3:59       ` [PATCH] Add a 1-second sleep to git-cvsexportcommit test Jason Sewall
2007-07-23  4:32         ` Junio C Hamano
2007-07-23  7:55           ` Simon 'corecode' Schubert
2007-07-24  0:23             ` Robin Rosenberg
2007-07-24  8:11               ` Simon 'corecode' Schubert
2007-07-24  8:33                 ` Robin Rosenberg
2007-07-24  8:38                   ` Simon 'corecode' Schubert
2007-07-24  9:34                     ` Robin Rosenberg
2007-07-24 10:14                       ` Junio C Hamano
2007-07-24 12:57                         ` Robin Rosenberg
2007-07-24 15:31                           ` Jason Sewall
2007-07-24 19:02                       ` Linus Torvalds
2007-07-24 22:56                         ` Robin Rosenberg
2007-07-24 23:19                           ` Linus Torvalds
2007-07-25  7:35                         ` Andy Parkins
2007-07-25  7:43                           ` Marius Storm-Olsen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).