If is_degraded returns true for backfill, the object may not be
in any replica's missing set. Only call start_recovery_op if
we actually started an op. This bug could cause a stuck
in backfill error.
Signed-off-by: Samuel Just <samuel.just@dreamhost.com>
dout(10) << " ondisk_read_lock for " << soid << dendl;
obc->ondisk_read_lock();
- start_recovery_op(soid);
-
// who needs it?
+ bool started = false;
for (unsigned i=1; i<acting.size(); i++) {
int peer = acting[i];
if (peer_missing.count(peer) &&
peer_missing[peer].is_missing(soid)) {
+ if (!started) {
+ start_recovery_op(soid);
+ started = true;
+ }
push_to_replica(obc, soid, peer);
}
}