#include "include/types.h"
#include "include/compat.h"
+#include "include/random.h"
#include "OSD.h"
#include "OSDMap.h"
#define dout_prefix _prefix(_dout, whoami, get_osdmap_epoch())
-const double OSD::OSD_TICK_INTERVAL = 1.0;
-
static ostream& _prefix(std::ostream* _dout, int whoami, epoch_t epoch) {
return *_dout << "osd." << whoami << " " << epoch << " ";
}
promote_probability_millis = prob;
// set hard limits for this interval to mitigate stampedes
- promote_max_objects = target_obj_sec * OSD::OSD_TICK_INTERVAL * 2;
- promote_max_bytes = target_bytes_sec * OSD::OSD_TICK_INTERVAL * 2;
+ promote_max_objects = target_obj_sec * osd->OSD_TICK_INTERVAL * 2;
+ promote_max_bytes = target_bytes_sec * osd->OSD_TICK_INTERVAL * 2;
}
// -------------------------------------
delete store;
}
+double OSD::get_tick_interval() const
+{
+ // vary +/- 5% to avoid scrub scheduling livelocks
+ constexpr auto delta = 0.05;
+ return (OSD_TICK_INTERVAL *
+ ceph::util::generate_random_number(1.0 - delta, 1.0 + delta));
+}
+
void cls_initialize(ClassHandler *ch);
void OSD::handle_signal(int signum)
heartbeat_thread.create("osd_srv_heartbt");
// tick
- tick_timer.add_event_after(OSD_TICK_INTERVAL,
+ tick_timer.add_event_after(get_tick_interval(),
new C_Tick(this));
{
Mutex::Locker l(tick_timer_lock);
- tick_timer_without_osd_lock.add_event_after(OSD_TICK_INTERVAL,
+ tick_timer_without_osd_lock.add_event_after(get_tick_interval(),
new C_Tick_WithoutOSDLock(this));
}
do_waiters();
- tick_timer.add_event_after(OSD_TICK_INTERVAL, new C_Tick(this));
+ tick_timer.add_event_after(get_tick_interval(), new C_Tick(this));
}
void OSD::tick_without_osd_lock()
mgrc.update_daemon_health(get_health_metrics());
service.kick_recovery_queue();
- tick_timer_without_osd_lock.add_event_after(OSD_TICK_INTERVAL,
+ tick_timer_without_osd_lock.add_event_after(get_tick_interval(),
new C_Tick_WithoutOSDLock(this));
}