Re: [PATCH] Add a 1-second sleep to git-cvsexportcommit test

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




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
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux