obc->ondisk_read_unlock();
}
- if (result == -EAGAIN) // must have referenced non-existent class
+ if (result == -EAGAIN)
return;
// prepare the reply
break;
case CEPH_OSD_OP_ROLLBACK :
- _rollback_to(ctx, op);
+ result = _rollback_to(ctx, op);
break;
case CEPH_OSD_OP_ZERO:
info.stats.num_wr++;
}
-void ReplicatedPG::_rollback_to(OpContext *ctx, ceph_osd_op& op)
+int ReplicatedPG::_rollback_to(OpContext *ctx, ceph_osd_op& op)
{
SnapSetContext *ssc = ctx->obc->ssc;
ObjectState& obs = ctx->new_obs;
const sobject_t& soid = oi.soid;
ObjectStore::Transaction& t = ctx->op_t;
snapid_t snapid = (uint64_t)op.snap.snapid;
+ snapid_t cloneid = 0;
dout(10) << "_rollback_to " << soid << " snapid " << snapid << dendl;
ObjectContext *rollback_to;
- int ret = find_object_context(soid.oid, oi.oloc, snapid, &rollback_to, false);
+ int ret = find_object_context(soid.oid, oi.oloc, snapid, &rollback_to, false, &cloneid);
if (ret) {
if (-ENOENT == ret) {
// there's no snapshot here, or there's no object.
/* a different problem, like degraded pool
* with not-yet-restored object. We shouldn't have been able
* to get here; recovery should have completed first! */
- assert(0);
+ sobject_t rollback_target(soid.oid, cloneid);
+ assert(is_missing_object(rollback_target));
+ dout(20) << "_rollback_to attempted to roll back to a missing object "
+ << rollback_target << " (requested snapid: ) " << snapid << dendl;
+ wait_for_missing_object(rollback_target, ctx->op);
} else {
// ummm....huh? It *can't* return anything else at time of writing.
assert(0);
ssc->snapset.clone_overlap[*ssc->snapset.clones.rbegin()] = overlaps;
}
}
+ return ret;
}
void ReplicatedPG::_make_clone(ObjectStore::Transaction& t,
void do_osd_op_effects(OpContext *ctx);
private:
void _delete_head(OpContext *ctx);
- void _rollback_to(OpContext *ctx, ceph_osd_op& op);
+ int _rollback_to(OpContext *ctx, ceph_osd_op& op);
public:
bool same_for_read_since(epoch_t e);
bool same_for_modify_since(epoch_t e);