HeartbeatMap::HeartbeatMap(CephContext *cct)
: m_cct(cct),
m_rwlock("HeartbeatMap::m_rwlock"),
- m_inject_unhealthy_until(0),
m_unhealthy_workers(0),
m_total_workers(0)
{
delete h;
}
-bool HeartbeatMap::_check(const heartbeat_handle_d *h, const char *who, time_t now)
+bool HeartbeatMap::_check(const heartbeat_handle_d *h, const char *who,
+ ceph::coarse_mono_clock::rep now)
{
bool healthy = true;
- time_t was;
-
- was = h->timeout;
+ auto was = h->timeout.load();
if (was && was < now) {
ldout(m_cct, 1) << who << " '" << h->name << "'"
<< " had timed out after " << h->grace << dendl;
return healthy;
}
-void HeartbeatMap::reset_timeout(heartbeat_handle_d *h, time_t grace, time_t suicide_grace)
+void HeartbeatMap::reset_timeout(heartbeat_handle_d *h,
+ ceph::coarse_mono_clock::rep grace,
+ ceph::coarse_mono_clock::rep suicide_grace)
{
ldout(m_cct, 20) << "reset_timeout '" << h->name << "' grace " << grace
<< " suicide " << suicide_grace << dendl;
- time_t now = time(NULL);
+ auto now = chrono::duration_cast<chrono::seconds>(
+ ceph::coarse_mono_clock::now().time_since_epoch()).count();
_check(h, "reset_timeout", now);
h->timeout = now + grace;
void HeartbeatMap::clear_timeout(heartbeat_handle_d *h)
{
ldout(m_cct, 20) << "clear_timeout '" << h->name << "'" << dendl;
- time_t now = time(NULL);
+ auto now = chrono::duration_cast<std::chrono::seconds>(
+ ceph::coarse_mono_clock::now().time_since_epoch()).count();
_check(h, "clear_timeout", now);
h->timeout = 0;
h->suicide_timeout = 0;
int unhealthy = 0;
int total = 0;
m_rwlock.get_read();
- time_t now = time(NULL);
+ auto now = ceph::coarse_mono_clock::now();
if (m_cct->_conf->heartbeat_inject_failure) {
ldout(m_cct, 0) << "is_healthy injecting failure for next " << m_cct->_conf->heartbeat_inject_failure << " seconds" << dendl;
- m_inject_unhealthy_until = now + m_cct->_conf->heartbeat_inject_failure;
+ m_inject_unhealthy_until = now + std::chrono::seconds(m_cct->_conf->heartbeat_inject_failure);
m_cct->_conf->set_val("heartbeat_inject_failure", "0");
}
bool healthy = true;
if (now < m_inject_unhealthy_until) {
- ldout(m_cct, 0) << "is_healthy = false, injected failure for next " << (m_inject_unhealthy_until - now) << " seconds" << dendl;
+ auto sec = std::chrono::duration_cast<std::chrono::seconds>(m_inject_unhealthy_until - now).count();
+ ldout(m_cct, 0) << "is_healthy = false, injected failure for next "
+ << sec << " seconds" << dendl;
healthy = false;
}
p != m_workers.end();
++p) {
heartbeat_handle_d *h = *p;
- if (!_check(h, "is_healthy", now)) {
+ auto epoch = chrono::duration_cast<chrono::seconds>(now.time_since_epoch()).count();
+ if (!_check(h, "is_healthy", epoch)) {
healthy = false;
unhealthy++;
}
#include <list>
#include <atomic>
#include <string>
-
#include <pthread.h>
+#include "common/ceph_time.h"
#include "RWLock.h"
class CephContext;
struct heartbeat_handle_d {
const std::string name;
pthread_t thread_id;
+ // TODO: use atomic<time_point>, once we can ditch GCC 4.8
std::atomic<unsigned> timeout = { 0 }, suicide_timeout = { 0 };
time_t grace, suicide_grace;
std::list<heartbeat_handle_d*>::iterator list_item;
void remove_worker(const heartbeat_handle_d *h);
// reset the timeout so that it expects another touch within grace amount of time
- void reset_timeout(heartbeat_handle_d *h, time_t grace, time_t suicide_grace);
+ void reset_timeout(heartbeat_handle_d *h,
+ ceph::coarse_mono_clock::rep grace,
+ ceph::coarse_mono_clock::rep suicide_grace);
// clear the timeout so that it's not checked on
void clear_timeout(heartbeat_handle_d *h);
private:
CephContext *m_cct;
RWLock m_rwlock;
- time_t m_inject_unhealthy_until;
+ ceph::coarse_mono_clock::time_point m_inject_unhealthy_until;
std::list<heartbeat_handle_d*> m_workers;
std::atomic<unsigned> m_unhealthy_workers = { 0 };
std::atomic<unsigned> m_total_workers = { 0 };
- bool _check(const heartbeat_handle_d *h, const char *who, time_t now);
+ bool _check(const heartbeat_handle_d *h, const char *who,
+ ceph::coarse_mono_clock::rep now);
};
}