On 05/27/2014 08:11 AM, Laine Stump wrote:
The original version of virTimeLocalOffsetFromUTC() (commit
1cddaea7aeca441b733c31990a3f139dd2d346f6) would fail for certain times
of the day if daylight savings time was active. This could most easily
be seen by uncommenting the TEST_LOCALOFFSET() cases that invlude a
s/invlude/include/
DST setting.
After a lot of experimenting, I found that the way to solve it in
almost all test cases is to set tm_isdst = -1 in the stuct tm prior to
calling mktime(). Once this is done, the correct offset is returned
for all test cases at all times except the two hours just after
00:00:00 Jan 1 UTC - during that time, any timezone that is *behind*
UTC, and that is supposed to always be in DST will not have DST
accounted for in its offset. I still do not know the source of this
problem, but it appears to be either a bug in glibc, or my improper
specification of a TZ setting, so I am leaving the offending tests
listed in virtimetest.c, but disabling them for now.
Per POSIX, the default time for swapping in or out of DST is at 2 am
unless $TZ says otherwise. So in your testing,
VIR05:00VID04:00,0/00:00:00,366/23:59:59
has only a 1 minute window where DST was not active, while
VIR05:00VID04:00,0,366
has a 24 hour window that overlaps two days.
---
See
https://www.redhat.com/archives/libvir-list/2014-May/msg00898.html
for my earlier comments on this problem.
src/util/virtime.c | 3 +++
tests/virtimetest.c | 24 +++++++++++++++++-------
2 files changed, 20 insertions(+), 7 deletions(-)
+#ifdef __BROKEN_DST_TESTS
+ TEST_LOCALOFFSET("VIR02:45VID00:45,0/00:00:00,366/23:59:59",
+ -45 * 60);
+ TEST_LOCALOFFSET("VIR05:00VID04:00,0/00:00:00,366/23:59:59",
+ ((-4 * 60) + 0) * 60);
+ TEST_LOCALOFFSET("VIR11:00VID10:00,0/00:00:00,366/23:59:59",
+ ((-10 * 60) + 0) * 60);
#endif
So is the point that these tests are only broken as a year rolls over,
while the code itself is robust, and all because we can't _quite_ force
our fake timezone to have daylight savings where we want it? Might it
be worth doing a simple filter (if time()/localtime_r() says today is
Jan 1 or Dec 31, skip these tests, otherwise run them), so that we are
at least testing the code 363 days a year?
At any rate, the change to virtime.c is essential (you convinced me of
that in the other thread), and this counts as a bug fix; it also passes
the testsuite. So regardless of whether you keep the #ifdef or convert
it to a time-dependent filter, ACK to getting this in before the release.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org