1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
#include <gflags/gflags.h>
#include <glog/logging.h>
#include <algorithm>
#include <string>
#include <vector>
#include "log/cluster_state_controller.h"
#include "log/logged_entry.h"
#include "server/staleness_tracker.h"
#include "util/thread_pool.h"
namespace libevent = cert_trans::libevent;
using cert_trans::StalenessTracker;
using cert_trans::LoggedEntry;
using std::bind;
using std::chrono::seconds;
using std::lock_guard;
using std::mutex;
DEFINE_int32(staleness_check_delay_secs, 5,
"number of seconds between node staleness checks");
StalenessTracker::StalenessTracker(const ClusterStateController* controller,
ThreadPool* pool,
libevent::Base* event_base)
: controller_(CHECK_NOTNULL(controller)),
pool_(CHECK_NOTNULL(pool)),
event_base_(CHECK_NOTNULL(event_base)),
task_(pool_),
node_is_stale_(controller_->NodeIsStale()) {
event_base_->Delay(seconds(FLAGS_staleness_check_delay_secs),
task_.task()->AddChild(
bind(&StalenessTracker::UpdateNodeStaleness, this)));
}
StalenessTracker::~StalenessTracker() {
task_.task()->Return();
task_.Wait();
}
bool StalenessTracker::IsNodeStale() const {
lock_guard<mutex> lock(mutex_);
return node_is_stale_;
}
void StalenessTracker::UpdateNodeStaleness() {
if (!task_.task()->IsActive()) {
// We're shutting down, just return.
return;
}
const bool node_is_stale(controller_->NodeIsStale());
{
lock_guard<mutex> lock(mutex_);
node_is_stale_ = node_is_stale;
}
event_base_->Delay(seconds(FLAGS_staleness_check_delay_secs),
task_.task()->AddChild(
bind(&StalenessTracker::UpdateNodeStaleness, this)));
}
|