Report PG states again, clear PG history on reaching active+clean

trace-sqes
Vitaliy Filippov 2020-04-19 00:48:23 +03:00
parent f95299b769
commit dc57c5c362
1 changed files with 35 additions and 24 deletions

View File

@ -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");