#include "messages/MPGStats.h"
#include "mgr/ClusterState.h"
+#include <time.h>
#include <boost/range/adaptor/reversed.hpp>
#define dout_context g_ceph_context
std::array<uint32_t,3> min;
std::array<uint32_t,3> max;
uint32_t last;
+ uint32_t last_update;
bool operator<(const mgr_ping_time_t& rhs) const {
if (pingtime < rhs.pingtime)
item.max[2] = j.second.back_max[2];
item.last = j.second.back_last;
item.back = true;
+ item.last_update = j.second.last_update;
sorted.emplace(item);
}
item.max[2] = j.second.front_max[2];
item.last = j.second.front_last;
item.back = false;
+ item.last_update = j.second.last_update;
sorted.emplace(item);
}
}
ceph_assert(!value || sitem.pingtime >= value);
f->open_object_section("entry");
+
+ const time_t lu(sitem.last_update);
+ char buffer[26];
+ string lustr(ctime_r(&lu, buffer));
+ lustr.pop_back(); // Remove trailing \n
+ auto stale = g_ceph_context->_conf.get_val<int64_t>("osd_heartbeat_stale");
+ f->dump_string("last update", lustr);
+ f->dump_bool("stale", ceph_clock_now().sec() - sitem.last_update > stale);
f->dump_int("from osd", sitem.from);
f->dump_int("to osd", sitem.to);
f->dump_string("interface", (sitem.back ? "back" : "front"));
// SLOW_PING_TIME
auto warn_slow_ping_time = cct->_conf.get_val<uint64_t>("mon_warn_on_slow_ping_time");
+ auto grace = cct->_conf.get_val<int64_t>("osd_heartbeat_grace");
if (warn_slow_ping_time == 0) {
double ratio = cct->_conf.get_val<double>("mon_warn_on_slow_ping_ratio");
- warn_slow_ping_time = cct->_conf.get_val<int64_t>("osd_heartbeat_grace");
+ warn_slow_ping_time = grace;
warn_slow_ping_time *= 1000000 * ratio; // Seconds of grace to microseconds at ratio
}
if (warn_slow_ping_time > 0) {
for (auto i : osd_stat) {
for (auto j : i.second.hb_pingtime) {
+ // Maybe source info is old
+ if (now.sec() - j.second.last_update > grace * 60)
+ continue;
+
mon_ping_item_t back;
back.pingtime = std::max(j.second.back_pingtime[0], j.second.back_pingtime[1]);
back.pingtime = std::max(back.pingtime, j.second.back_pingtime[2]);
#include <unistd.h>
#include <sys/stat.h>
#include <signal.h>
+#include <time.h>
#include <boost/scoped_ptr.hpp>
#include <boost/range/adaptor/reversed.hpp>
std::array<uint32_t,3> min;
std::array<uint32_t,3> max;
uint32_t last;
+ uint32_t last_update;
bool operator<(const osd_ping_time_t& rhs) const {
if (pingtime < rhs.pingtime)
item.max[2] = j.second.back_max[2];
item.last = j.second.back_last;
item.back = true;
+ item.last_update = j.second.last_update;
sorted.emplace(item);
}
if (j.second.front_last == 0)
item.max[1] = j.second.front_max[1];
item.max[2] = j.second.front_max[2];
item.last = j.second.front_last;
+ item.last_update = j.second.last_update;
item.back = false;
sorted.emplace(item);
}
for (auto &sitem : boost::adaptors::reverse(sorted)) {
ceph_assert(sitem.pingtime >= value);
f->open_object_section("entry");
+
+ const time_t lu(sitem.last_update);
+ char buffer[26];
+ string lustr(ctime_r(&lu, buffer));
+ lustr.pop_back(); // Remove trailing \n
+ auto stale = cct->_conf.get_val<int64_t>("osd_heartbeat_stale");
+ f->dump_string("last update", lustr);
+ f->dump_bool("stale", ceph_clock_now().sec() - sitem.last_update > stale);
f->dump_int("from osd", whoami);
f->dump_int("to osd", sitem.to);
f->dump_string("interface", (sitem.back ? "back" : "front"));
{
std::lock_guard l(service.stat_lock);
+ service.osd_stat.hb_pingtime[from].last_update = now.sec();
service.osd_stat.hb_pingtime[from].back_last = back_pingtime;
uint32_t total = 0;
for (auto &i : hb_pingtime) {
f->open_object_section("entry");
f->dump_int("osd", i.first);
+ const time_t lu(i.second.last_update);
+ char buffer[26];
+ string lustr(ctime_r(&lu, buffer));
+ lustr.pop_back(); // Remove trailing \n
+ f->dump_string("last update", lustr);
f->open_array_section("interfaces");
f->open_object_section("interface");
f->dump_string("interface", "back");
encode((int)hb_pingtime.size(), bl);
for (auto i : hb_pingtime) {
encode(i.first, bl); // osd
+ encode(i.second.last_update, bl);
encode(i.second.back_pingtime[0], bl);
encode(i.second.back_pingtime[1], bl);
encode(i.second.back_pingtime[2], bl);
int osd;
decode(osd, bl);
struct Interfaces ifs;
+ decode(ifs.last_update, bl);
decode(ifs.back_pingtime[0],bl);
decode(ifs.back_pingtime[1], bl);
decode(ifs.back_pingtime[2], bl);
o.back()->os_alerts[1].emplace(
"some alert2", "some alert2 details");
struct Interfaces gen_interfaces = {
- { 1000, 900, 800 }, { 990, 890, 790 }, { 1010, 910, 810 }, 1001,
+ 123456789, { 1000, 900, 800 }, { 990, 890, 790 }, { 1010, 910, 810 }, 1001,
{ 1100, 1000, 900 }, { 1090, 990, 890 }, { 1110, 1010, 910 }, 1101 };
o.back()->hb_pingtime[20] = gen_interfaces;
gen_interfaces = {
- { 100, 200, 300 }, { 90, 190, 290 }, { 110, 210, 310 }, 101 };
+ 987654321, { 100, 200, 300 }, { 90, 190, 290 }, { 110, 210, 310 }, 101 };
o.back()->hb_pingtime[30] = gen_interfaces;
}
uint32_t num_per_pool_osds = 0;
struct Interfaces {
+ uint32_t last_update; // in seconds
uint32_t back_pingtime[3];
uint32_t back_min[3];
uint32_t back_max[3];