mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-13 10:37:02 +02:00
We've had a start date even before the internal monotonic clock existed, but once the monotonic clock was added, the start date was not updated to distinguish the wall clock time units and the internal monotonic time units. The distinction is important because both clocks do not necessarily progress at the same speed. The very rare occurrences of the wall-clock date are essentially for human consumption and communication with third parties (e.g. report the start date in "show info" for monitoring purposes). However currently this one is also used to measure the distance to "now" as being the process' uptime. This is actually not correct. It only works because for now the two dates are initialized at the exact same instant at boot but could still be wrong if the system's date shows a big jump backwards during startup for example. In addition the current situation prevents us from enforcing an abritrary offset at boot to reveal some heisenbugs. This patch adds a new "start_time" at boot that is set from "now" and is used in uptime calculations. "start_date" instead is now set from "date" and will always reflect the system date for human consumption (e.g. in "show info"). This way we're now sure that any drift of the internal clock relative to the system date will not impact the reported uptime. This could possibly be backported though it's unlikely that anyone has ever noticed the problem.
56 lines
2.1 KiB
C
56 lines
2.1 KiB
C
/*
|
|
* include/haproxy/clock.h
|
|
* Exported parts for time-keeping
|
|
*
|
|
* Copyright (C) 2000-2021 Willy Tarreau - w@1wt.eu
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation, version 2.1
|
|
* exclusively.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef _HAPROXY_CLOCK_H
|
|
#define _HAPROXY_CLOCK_H
|
|
|
|
#include <sys/time.h>
|
|
#include <haproxy/api.h>
|
|
|
|
extern struct timeval start_date; /* the process's start date in wall-clock time */
|
|
extern struct timeval start_time; /* the process's start date in internal monotonic time */
|
|
extern volatile ullong global_now; /* common monotonic date between all threads (32:32) */
|
|
|
|
extern THREAD_LOCAL struct timeval now; /* internal monotonic date derived from real clock */
|
|
extern THREAD_LOCAL struct timeval date; /* the real current date (wall-clock time) */
|
|
|
|
uint64_t now_cpu_time_thread(int thr);
|
|
uint64_t now_mono_time(void);
|
|
uint64_t now_cpu_time(void);
|
|
void clock_set_local_source(void);
|
|
void clock_update_local_date(int max_wait, int interrupted);
|
|
void clock_update_global_date();
|
|
void clock_init_process_date(void);
|
|
void clock_init_thread_date(void);
|
|
int clock_setup_signal_timer(void *timer, int sig, int val);
|
|
char *timeofday_as_iso_us(int pad);
|
|
uint clock_report_idle(void);
|
|
void clock_leaving_poll(int timeout, int interrupted);
|
|
void clock_entering_poll(void);
|
|
|
|
static inline void clock_update_date(int max_wait, int interrupted)
|
|
{
|
|
clock_update_local_date(max_wait, interrupted);
|
|
clock_update_global_date();
|
|
}
|
|
|
|
#endif
|