Report PG states again, clear PG history on reaching active+clean
parent
f95299b769
commit
dc57c5c362
|
@ -59,8 +59,20 @@ json11::Json osd_t::get_status()
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void osd_t::report_status()
|
||||||
json11::Json::object pg_status;
|
{
|
||||||
|
std::string st = get_status().dump();
|
||||||
|
// (!) Keys end with . to allow "select /osd/state/123. by prefix"
|
||||||
|
// because Consul transactions fail if you try to read non-existing keys
|
||||||
|
json11::Json::array txn = {
|
||||||
|
json11::Json::object {
|
||||||
|
{ "KV", json11::Json::object {
|
||||||
|
{ "Verb", "set" },
|
||||||
|
{ "Key", consul_prefix+"/osd/state/"+std::to_string(osd_num)+"." },
|
||||||
|
{ "Value", base64_encode(st) },
|
||||||
|
} }
|
||||||
|
},
|
||||||
|
};
|
||||||
for (auto & p: pgs)
|
for (auto & p: pgs)
|
||||||
{
|
{
|
||||||
auto & pg = p.second;
|
auto & pg = p.second;
|
||||||
|
@ -76,32 +88,31 @@ json11::Json osd_t::get_status()
|
||||||
pg_st["degraded_count"] = pg.degraded_objects.size();
|
pg_st["degraded_count"] = pg.degraded_objects.size();
|
||||||
pg_st["incomplete_count"] = pg.incomplete_objects.size();
|
pg_st["incomplete_count"] = pg.incomplete_objects.size();
|
||||||
pg_st["write_osd_set"] = pg.cur_set;
|
pg_st["write_osd_set"] = pg.cur_set;
|
||||||
pg_status[std::to_string(pg.pg_num)] = pg_st;
|
txn.push_back(json11::Json::object {
|
||||||
}
|
{ "KV", json11::Json::object {
|
||||||
st["pgs"] = pg_status;
|
{ "Verb", "set" },
|
||||||
*/
|
{ "Key", consul_prefix+"/pg/state/"+std::to_string(pg.pg_num)+"." },
|
||||||
|
{ "Value", base64_encode(json11::Json(pg_st).dump()) },
|
||||||
void osd_t::report_status()
|
} }
|
||||||
{
|
});
|
||||||
std::string st = get_status().dump();
|
if (pg.state == PG_ACTIVE && pg.target_history.size())
|
||||||
// (!) Keys end with . to allow "select /osd/state/123. by prefix"
|
|
||||||
// because Consul transactions fail if you try to read non-existing keys
|
|
||||||
std::string req = "PUT /v1/kv/"+consul_prefix+"/osd/state/"+std::to_string(osd_num)+". HTTP/1.1\r\n"+
|
|
||||||
"Host: "+consul_host+"\r\n"+
|
|
||||||
"Content-Length: "+std::to_string(st.size())+"\r\n"+
|
|
||||||
"Connection: close\r\n"+
|
|
||||||
"\r\n"+st;
|
|
||||||
http_request(consul_address, req, [this](int err, std::string res)
|
|
||||||
{
|
|
||||||
int pos = res.find("\r\n\r\n");
|
|
||||||
if (pos >= 0)
|
|
||||||
{
|
{
|
||||||
res = res.substr(pos+4);
|
pg.target_history.clear();
|
||||||
|
pg.all_peers = pg.target_set;
|
||||||
|
txn.push_back(json11::Json::object {
|
||||||
|
{ "KV", json11::Json::object {
|
||||||
|
{ "Verb", "delete" },
|
||||||
|
{ "Key", consul_prefix+"/pg/history/"+std::to_string(pg.pg_num)+"." },
|
||||||
|
} }
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (err != 0 || res != "true")
|
}
|
||||||
|
consul_txn(txn, [this](std::string err, json11::Json res)
|
||||||
|
{
|
||||||
|
if (err != "")
|
||||||
{
|
{
|
||||||
consul_failed_attempts++;
|
consul_failed_attempts++;
|
||||||
printf("Error reporting state to Consul: code %d (%s), response text: %s\n", err, strerror(err), res.c_str());
|
printf("Error reporting state to Consul: %s\n", err.c_str());
|
||||||
if (consul_failed_attempts > MAX_CONSUL_ATTEMPTS)
|
if (consul_failed_attempts > MAX_CONSUL_ATTEMPTS)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Cluster connection failed");
|
throw std::runtime_error("Cluster connection failed");
|
||||||
|
|
Loading…
Reference in New Issue