hobject_t head;
SnapSet snapset;
vector<snapid_t>::reverse_iterator curclone;
+ hobject_t next_clone;
bufferlist last_data;
else {
curclone = snapset.clones.rbegin();
head = p->first;
+ next_clone = hobject_t();
dout(20) << " snapset " << snapset << dendl;
}
//assert(data.length() == p->size);
//
+ if (!next_clone.is_min() && next_clone != soid) {
+ osd->clog.error() << mode << " " << info.pgid << " " << soid
+ << " expected clone " << next_clone;
+ ++scrubber.shallow_errors;
+ }
+
if (soid.snap == CEPH_NOSNAP) {
if (!snapset.head_exists) {
osd->clog.error() << mode << " " << info.pgid << " " << soid
++scrubber.shallow_errors;
continue;
}
+ if (curclone == snapset.clones.rend()) {
+ next_clone = hobject_t();
+ } else {
+ next_clone = soid;
+ next_clone.snap = *curclone;
+ }
} else if (soid.snap) {
// it's a clone
stat.num_object_clones++;
}
if (soid.snap != *curclone) {
- osd->clog.error() << mode << " " << info.pgid << " " << soid
- << " expected clone " << *curclone;
- ++scrubber.shallow_errors;
- assert(soid.snap == *curclone);
+ continue; // we warn above. we could do better here...
}
if (oi.size != snapset.clone_size[*curclone]) {
osd->clog.error() << mode << " " << info.pgid << " " << soid
<< " size " << oi.size << " != clone_size "
- << snapset.cloen_size[*curclone];
+ << snapset.clone_size[*curclone];
++scrubber.shallow_errors;
}
// ...
// what's next?
- if (curclone != snapset.clones.rend())
+ if (curclone != snapset.clones.rend()) {
++curclone;
-
- if (curclone == snapset.clones.rend())
+ }
+ if (curclone == snapset.clones.rend()) {
head = hobject_t();
+ next_clone = hobject_t();
+ } else {
+ next_clone.snap = *curclone;
+ }
} else {
// it's unversioned.
+ next_clone = hobject_t();
}
string cat; // fixme
scrub_cstat.add(stat, cat);
}
+
+ if (!next_clone.is_min()) {
+ osd->clog.error() << mode << " " << info.pgid
+ << " expected clone " << next_clone;
+ ++scrubber.shallow_errors;
+ }
dout(10) << "_scrub (" << mode << ") finish" << dendl;
}