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
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list