Greg Troxel <
g...@lexort.com> writes:
(Earlier, on weewx-user, I posted that I was seeing a backtrace from
v4beta (recent master). I'm following up here now that I've read the
code and have something perhaps useful to say.)
> Traceback (most recent call last):
> File "/usr/weewx/bin/weewx/reportengine.py", line 197, in run
> obj.start()
> File "/usr/weewx/bin/weewx/reportengine.py", line 280, in start
> self.run()
> File "/usr/weewx/bin/weewx/imagegenerator.py", line 41, in run
> self.genImages(self.gen_ts)
> File "/usr/weewx/bin/weewx/imagegenerator.py", line 180, in genImages
> aggregate_interval=aggregate_interval)
> File "/usr/weewx/bin/weewx/xtypes.py", line 86, in get_series
> aggregate_interval)
> File "/usr/weewx/bin/weewx/xtypes.py", line 138, in get_series
> for stamp in weeutil.weeutil.intervalgen(startstamp, stopstamp, aggregate_interval):
> File "/usr/weewx/bin/weeutil/weeutil.py", line 339, in intervalgen
> stamp2 = int(time.mktime(dt2.timetuple()))
> OverflowError: mktime argument out of range
I am using python 2.7, NetBSD 8 on earmv7hf-el. weewx 3.x has run for
over 2 years with essentially no problems.
Ihave added printfs to weeutil.py, in intervalgen. The crash happens
during the loop in else block. The last dt2 printout is
dt2 2020-03-08 02:00:00
which is a time that does not exist (here in EST5EDT). So apparently
the python time doing the addition in the datetime object is not going
back to timeval each time.
I am using the older skin that was standard before the Seasons skin
became normal.
Is anyone else seeing this? You can tell you are having this problem
two ways:
traceback in log during html report generation
graphs on week/month/year page are stale
I looked at python datetime docs:
https://docs.python.org/3/library/datetime.html
https://docs.python.org/2/library/datetime.html
There is a notion of "aware" vs "naive" datetime objects, and as I read
it the code is creating naive objects, which don't have an associated
timezone. So adding 3600s to 2020-03-08T01:00 leads to 02:00, even
though I think that time doesn't exist and the right answer is 03:00.
time.mktime() says it will raise an error if the time cannot be
represented:
https://docs.python.org/2/library/time.html
I think to fix, we need a try: block that just does mktime on dt2 and
discards the result, with an catch block that does continue, so we
increment dt2 again. Or, to pass the local tz in the constructor,
perhaps.
I suppose it is possible that the underlying mktime library function on
NetBSD is stricter than on Other Systems. The man page says:
The function returns the specified calendar time; if the calendar
time cannot be represented, it returns (time_t)-1. This can happen
either because the resulting conversion would not fit in a time_t
variable, or because the time specified happens to be in the
daylight savings gap and tm_isdst was set to -1. Other mktime()
implementations do not return an error in the second case and
return the appropriate time offset after the daylight savings gap.
There is code to mimick this behavior, but it is not enabled by
default.
and also makes a claim of conforming to C89.
I have previously observed test failures in bup (a backup program using
git data storage, written in python), and reproduced problems in git. I
didn't ever chase that down, but I am now suspecting the same underlying
cause, namely invocations of mktime which are incorrect according to
standards, but happen to work anyway on Linux. (That is of course
guess, not a substantiated conclusion.)