{
stringstream ss;
ScrubMap scrubmap;
- int errors = 0;
-
+ int errors = 0, fixed = 0;
bool repair = state_test(PG_STATE_REPAIR);
+ const char *mode = repair ? "repair":"scrub";
osd->map_lock.get_read();
lock();
if (anymissing) {
for (unsigned i=0; i<acting.size(); i++) {
if (p[i] == m[i]->objects.end() || po->poid != p[i]->poid) {
- ss << info.pgid << " scrub osd" << acting[i] << " missing " << po->poid;
+ ss << info.pgid << " " << mode << " osd" << acting[i] << " missing " << po->poid;
osd->get_logclient()->log(LOG_ERROR, ss);
num_missing++;
if (po->size != p[i]->size) {
dout(0) << "scrub osd" << acting[i] << " " << po->poid
<< " size " << p[i]->size << " != " << po->size << dendl;
- ss << info.pgid << " scrub osd" << acting[i] << " " << po->poid
+ ss << info.pgid << " " << mode << " osd" << acting[i] << " " << po->poid
<< " size " << p[i]->size << " != " << po->size;
osd->get_logclient()->log(LOG_ERROR, ss);
peerok = ok = false;
if (po->attrs.size() != p[i]->attrs.size()) {
dout(0) << "scrub osd" << acting[i] << " " << po->poid
<< " attr count " << p[i]->attrs.size() << " != " << po->attrs.size() << dendl;
- ss << info.pgid << " scrub osd" << acting[i] << " " << po->poid
+ ss << info.pgid << " " << mode << " osd" << acting[i] << " " << po->poid
<< " attr count " << p[i]->attrs.size() << " != " << po->attrs.size();
osd->get_logclient()->log(LOG_ERROR, ss);
peerok = ok = false;
if (q->second.cmp(p[i]->attrs[q->first])) {
dout(0) << "scrub osd" << acting[i] << " " << po->poid
<< " attr " << q->first << " value mismatch" << dendl;
- ss << info.pgid << " scrub osd" << acting[i] << " " << po->poid
+ ss << info.pgid << " " << mode << " osd" << acting[i] << " " << po->poid
<< " attr " << q->first << " value mismatch";
osd->get_logclient()->log(LOG_ERROR, ss);
peerok = ok = false;
} else {
dout(0) << "scrub osd" << acting[i] << " " << po->poid
<< " attr " << q->first << " missing" << dendl;
- ss << info.pgid << " scrub osd" << acting[i] << " " << po->poid
+ ss << info.pgid << " " << mode << " osd" << acting[i] << " " << po->poid
<< " attr " << q->first << " missing";
osd->get_logclient()->log(LOG_ERROR, ss);
peerok = ok = false;
if (num_missing || num_bad) {
dout(0) << "scrub " << num_missing << " missing, " << num_bad << " bad objects" << dendl;
- ss << info.pgid << " scrub " << num_missing << " missing, " << num_bad << " bad objects";
+ ss << info.pgid << " " << mode << " " << num_missing << " missing, " << num_bad << " bad objects";
osd->get_logclient()->log(LOG_ERROR, ss);
state_set(PG_STATE_INCONSISTENT);
if (repair)
*/
// ok, do the pg-type specific scrubbing
- errors += _scrub(scrubmap);
+ _scrub(scrubmap, errors, fixed);
/*
lock();
}
*/
- ss << info.pgid << " scrub " << errors << " errors";
+ ss << info.pgid << " " << mode << " " << errors << " errors";
+ if (repair)
+ ss << ", " << fixed << " fixed";
osd->get_logclient()->log(errors ? LOG_ERROR:LOG_INFO, ss);
- if (!errors && repair)
+ if (!(errors - fixed) && repair)
state_clear(PG_STATE_INCONSISTENT);
state_clear(PG_STATE_REPAIR);
// SCRUB
-int ReplicatedPG::_scrub(ScrubMap& scrubmap)
+int ReplicatedPG::_scrub(ScrubMap& scrubmap, int& errors, int& fixed)
{
- int errors = 0;
dout(10) << "_scrub" << dendl;
coll_t c = info.pgid.to_coll();
bool repair = state_test(PG_STATE_REPAIR);
+ const char *mode = repair ? "repair":"scrub";
// traverse in reverse order.
sobject_t head;
// basic checks.
if (p->attrs.count(OI_ATTR) == 0) {
- dout(0) << "scrub no '" << OI_ATTR << "' attr on " << soid << dendl;
+ dout(0) << mode << " no '" << OI_ATTR << "' attr on " << soid << dendl;
errors++;
continue;
}
bv.push_back(p->attrs[OI_ATTR]);
object_info_t oi(bv);
- dout(20) << "scrub " << soid << " " << oi << dendl;
+ dout(20) << mode << " " << soid << " " << oi << dendl;
stat.num_bytes += p->size;
stat.num_kb += SHIFT_ROUND_UP(p->size, 10);
}
}
- dout(10) << "scrub got "
+ dout(10) << mode << " got "
<< stat.num_objects << "/" << info.stats.num_objects << " objects, "
<< stat.num_object_clones << "/" << info.stats.num_object_clones << " clones, "
<< stat.num_bytes << "/" << info.stats.num_bytes << " bytes, "
stat.num_object_clones != info.stats.num_object_clones ||
stat.num_bytes != info.stats.num_bytes ||
stat.num_kb != info.stats.num_kb) {
- ss << info.pgid << " scrub stat mismatch, got "
+ ss << info.pgid << " " << mode << " stat mismatch, got "
<< stat.num_objects << "/" << info.stats.num_objects << " objects, "
<< stat.num_object_clones << "/" << info.stats.num_object_clones << " clones, "
<< stat.num_bytes << "/" << info.stats.num_bytes << " bytes, "
errors++;
if (repair) {
+ fixed++;
info.stats = stat;
update_stats();
}
}
- dout(10) << "scrub finish" << dendl;
+ dout(10) << "_scrub (" << mode << ") finish" << dendl;
return errors;
}