mirror of
https://github.com/samba-team/samba.git
synced 2025-03-05 20:58:40 +03:00
make ctdb uptime print how long the recovery took in the recovery daemon when we check that the public ip address allocation on the local node is correct (we have the ips we should have and we dont have any we shouldnt have) use ctdb uptime and check the recovery start/stop times and make sure we dont check for ip allocation inconsistencies during a recovery where the ip address allocation is in flux. (This used to be ctdb commit f86551580349b7f662f9a07e4eb0c1189e38e429)
109 lines
2.2 KiB
C
109 lines
2.2 KiB
C
/*
|
|
functions taken from samba4 for quick prototyping of ctdb. These are
|
|
not intended to remain part of ctdb
|
|
*/
|
|
|
|
#include "includes.h"
|
|
#include "system/time.h"
|
|
#include "system/filesys.h"
|
|
|
|
|
|
/**
|
|
return a zero timeval
|
|
*/
|
|
struct timeval timeval_zero(void)
|
|
{
|
|
struct timeval tv;
|
|
tv.tv_sec = 0;
|
|
tv.tv_usec = 0;
|
|
return tv;
|
|
}
|
|
|
|
/**
|
|
return True if a timeval is zero
|
|
*/
|
|
bool timeval_is_zero(const struct timeval *tv)
|
|
{
|
|
return tv->tv_sec == 0 && tv->tv_usec == 0;
|
|
}
|
|
|
|
/**
|
|
return a timeval for the current time
|
|
*/
|
|
struct timeval timeval_current(void)
|
|
{
|
|
struct timeval tv;
|
|
gettimeofday(&tv, NULL);
|
|
return tv;
|
|
}
|
|
|
|
double timeval_elapsed(struct timeval *tv)
|
|
{
|
|
struct timeval tv2 = timeval_current();
|
|
return (tv2.tv_sec - tv->tv_sec) +
|
|
(tv2.tv_usec - tv->tv_usec)*1.0e-6;
|
|
}
|
|
|
|
double timeval_delta(struct timeval *tv2, struct timeval *tv)
|
|
{
|
|
return (tv2->tv_sec - tv->tv_sec) +
|
|
(tv2->tv_usec - tv->tv_usec)*1.0e-6;
|
|
}
|
|
|
|
/**
|
|
return a timeval struct with the given elements
|
|
*/
|
|
_PUBLIC_ struct timeval timeval_set(uint32_t secs, uint32_t usecs)
|
|
{
|
|
struct timeval tv;
|
|
tv.tv_sec = secs;
|
|
tv.tv_usec = usecs;
|
|
return tv;
|
|
}
|
|
|
|
_PUBLIC_ int timeval_compare(const struct timeval *tv1, const struct timeval *tv2)
|
|
{
|
|
if (tv1->tv_sec > tv2->tv_sec) return 1;
|
|
if (tv1->tv_sec < tv2->tv_sec) return -1;
|
|
if (tv1->tv_usec > tv2->tv_usec) return 1;
|
|
if (tv1->tv_usec < tv2->tv_usec) return -1;
|
|
return 0;
|
|
}
|
|
|
|
_PUBLIC_ struct timeval timeval_until(const struct timeval *tv1,
|
|
const struct timeval *tv2)
|
|
{
|
|
struct timeval t;
|
|
if (timeval_compare(tv1, tv2) >= 0) {
|
|
return timeval_zero();
|
|
}
|
|
t.tv_sec = tv2->tv_sec - tv1->tv_sec;
|
|
if (tv1->tv_usec > tv2->tv_usec) {
|
|
t.tv_sec--;
|
|
t.tv_usec = 1000000 - (tv1->tv_usec - tv2->tv_usec);
|
|
} else {
|
|
t.tv_usec = tv2->tv_usec - tv1->tv_usec;
|
|
}
|
|
return t;
|
|
}
|
|
|
|
static struct timeval timeval_add(const struct timeval *tv,
|
|
uint32_t secs, uint32_t usecs)
|
|
{
|
|
struct timeval tv2 = *tv;
|
|
const unsigned int million = 1000000;
|
|
tv2.tv_sec += secs;
|
|
tv2.tv_usec += usecs;
|
|
tv2.tv_sec += tv2.tv_usec / million;
|
|
tv2.tv_usec = tv2.tv_usec % million;
|
|
return tv2;
|
|
}
|
|
|
|
|
|
_PUBLIC_ struct timeval timeval_current_ofs(uint32_t secs, uint32_t usecs)
|
|
{
|
|
struct timeval tv = timeval_current();
|
|
return timeval_add(&tv, secs, usecs);
|
|
}
|
|
|