-
Problem report
-
Resolution: Fixed
-
Critical
-
2.2.6, 2.4.3, 4.0.39
-
Sprint 39, Sprint 59 (Dec 2019), Sprint 60 (Jan 2020), Sprint 61 (Feb 2020), Sprint 62 (Mar 2020), Sprint 64 (May 2020)
-
1
Problem:
After the change to summer time occurred, maintenance happens when it should not.
How to replicate:
- Grab a virtual machine, set OS and PHP timezones to America/Chicago.
- Create a maintenance that happens weekly as per attached screenshot.
- date --set="6 mar 2015 23:58"
- We are now at the end of Friday. Winter time is active. Maintenance will start in a couple of minutes.
- date --set="8 mar 2015 00:58"
- We are in the beginning of Sunday. Winter time is still active. Maintenance will end in a couple of minutes.
- date --set="8 mar 2015 01:58"
- In two minutes summer time will start. When this will happen, Zabbix erroneously will again decide that maintenance should start.
I've added the following debug code in timer.c:
active_since = db_active_since - (wday * SEC_PER_DAY + tm->tm_hour * SEC_PER_HOUR + tm->tm_min * SEC_PER_MIN + tm->tm_sec); zabbix_log(LOG_LEVEL_DEBUG, " active since: %d", active_since); for (; db_start_date >= db_active_since; db_start_date -= SEC_PER_DAY) { zabbix_log(LOG_LEVEL_DEBUG, " db_start_date %d", db_start_date); /* check for every x week(s) */ week = (db_start_date - active_since) / SEC_PER_WEEK; if (0 != week % db_every) { zabbix_log(LOG_LEVEL_DEBUG, " continue from: if (0 != week % db_every)"); continue; } /* check for day of the week */ tm = localtime(&db_start_date); wday = (0 == tm->tm_wday ? 7 : tm->tm_wday) - 1; zabbix_log(LOG_LEVEL_DEBUG, " wday: %d", wday); zabbix_log(LOG_LEVEL_DEBUG, " db_dayofweek %d", db_dayofweek); if (0 == (db_dayofweek & (1 << wday))) { zabbix_log(LOG_LEVEL_DEBUG, " continue from: if (0 == (db_dayofweek & (1 << wday)))"); continue; } zabbix_log(LOG_LEVEL_DEBUG, " break"); break; } break; case TIMEPERIOD_TYPE_MONTHLY:
And here's the debug output:
Maintenance begins: 28112:20150307:000014.298 active since: 952322386 28112:20150307:000014.298 db_start_date 1425708000 28112:20150307:000014.298 wday: 5 28112:20150307:000014.298 db_dayofweek 32 28112:20150307:000014.299 break 28112:20150307:000014.299 In process_maintenance_hosts() 28112:20150307:000014.299 query [txnlev:0] [select h.hostid,h.host,h.maintenanceid,h.maintenance_status,h.maintenance_type,h.maintenance_from from maintenances_hosts mh,hosts h where mh.hostid=h.hostid and h.status=0 and mh.maintenanceid=1] 28112:20150307:000014.300 query [txnlev:0] [select h.hostid,h.host,h.maintenanceid,h.maintenance_status,h.maintenance_type,h.maintenance_from from maintenances_groups mg,hosts_groups hg,hosts h where mg.groupid=hg.groupid and hg.hostid=h.hostid and h.status=0 and mg.maintenanceid=1] 28112:20150307:000014.302 End of process_maintenance_hosts() 28112:20150307:000014.302 In update_maintenance_hosts() 28112:20150307:000014.302 query [txnlev:1] [begin;] 28112:20150307:000014.302 putting host 'Zabbix server' into maintenance (with data collection) Maintenance ends: 28112:20150308:010006.679 active since: 952318794 28112:20150308:010006.679 db_start_date 1425794400 28112:20150308:010006.679 wday: 6 28112:20150308:010006.679 db_dayofweek 32 28112:20150308:010006.679 continue from: if (0 == (db_dayofweek & (1 << wday))) 28112:20150308:010006.679 db_start_date 1425708000 28112:20150308:010006.680 wday: 5 28112:20150308:010006.680 db_dayofweek 32 28112:20150308:010006.680 break 28112:20150308:010006.680 In update_maintenance_hosts() 28112:20150308:010006.680 query [txnlev:1] [begin;] 28112:20150308:010006.681 query [txnlev:1] [select hostid,host,maintenance_type,maintenance_from from hosts where status=0 and flags<>2 and maintenance_status=1] 28112:20150308:010006.681 taking host 'Zabbix server' out of maintenance Maintenance erroneously begins again: 28112:20150308:030019.733 active since: 952311581 28112:20150308:030019.733 db_start_date 1425790800 28112:20150308:030019.733 wday: 5 28112:20150308:030019.733 db_dayofweek 32 28112:20150308:030019.733 break 28112:20150308:030019.733 In process_maintenance_hosts() 28112:20150308:030019.734 query [txnlev:0] [select h.hostid,h.host,h.maintenanceid,h.maintenance_status,h.maintenance_type,h.maintenance_from from maintenances_hosts mh,hosts h where mh.hostid=h.hostid and h.status=0 and mh.maintenanceid=1] 28112:20150308:030019.734 query [txnlev:0] [select h.hostid,h.host,h.maintenanceid,h.maintenance_status,h.maintenance_type,h.maintenance_from from maintenances_groups mg,hosts_groups hg,hosts h where mg.groupid=hg.groupid and hg.hostid=h.hostid and h.status=0 and mg.maintenanceid=1] 28112:20150308:030019.736 End of process_maintenance_hosts() 28112:20150308:030019.736 In update_maintenance_hosts() 28112:20150308:030019.736 query [txnlev:1] [begin;] 28112:20150308:030019.737 putting host 'Zabbix server' into maintenance (with data collection)
Looks like wday is calculated incorrectly after DST change, it should be 6, but it's 5 again.
- causes
-
ZBX-17558 Zabbix agent2 compilation fails on windows
- Closed
- depends on
-
ZBXNEXT-5190 Allow to set "end time" instead of "duration" for the maintenance window
- Open
-
ZBX-20511 Add DST related nuances to the notes for maintenance documentation
- Closed