put();
}
-void ReplicatedPG::_applied_pushed_object(ObjectStore::Transaction *t, ObjectContext *obc)
+void ReplicatedPG::_applied_recovered_object(ObjectStore::Transaction *t, ObjectContext *obc)
{
lock();
- dout(10) << "_applied_pushed_object " << *obc << dendl;
+ dout(10) << "_applied_recovered_object " << *obc << dendl;
if (is_primary())
populate_obc_watchers(obc);
put_object_context(obc);
ssc->snapset.decode(sp);
}
- onreadable = new C_OSD_AppliedPushedObject(this, t, obc);
+ onreadable = new C_OSD_AppliedRecoveredObject(this, t, obc);
onreadable_sync = new C_OSD_OndiskWriteUnlock(obc);
} else {
onreadable = new ObjectStore::C_DeleteTransaction(t);
::decode(oi.snaps, i);
assert(oi.snaps.size() > 0);
oi.copy_user_bits(headobc->obs.oi);
- _make_clone(*t, head, soid, &oi);
- put_object_context(headobc);
+ ObjectContext *clone_obc = new ObjectContext(oi, true, NULL);
+ clone_obc->get();
+ clone_obc->ondisk_write_lock();
+ clone_obc->ssc = get_snapset_context(soid.oid, soid.get_key(), soid.hash, true);
+ register_object_context(clone_obc);
+
+ _make_clone(*t, head, soid, &clone_obc->obs.oi);
- // XXX: track objectcontext!
- int tr = osd->store->queue_transaction(&osr, t);
+ Context *onreadable = new C_OSD_AppliedRecoveredObject(this, t, clone_obc);
+ Context *onreadable_sync = new C_OSD_OndiskWriteUnlock(clone_obc);
+ int tr = osd->store->queue_transaction(&osr, t, onreadable, NULL, onreadable_sync);
assert(tr == 0);
+
+ put_object_context(headobc);
+
missing.got(latest->soid, latest->version);
missing_loc.erase(latest->soid);
continue;
recover_got(soid, latest->version);
osd->store->queue_transaction(&osr, t,
- new C_OSD_AppliedPushedObject(this, t, obc),
+ new C_OSD_AppliedRecoveredObject(this, t, obc),
new C_OSD_CommittedPushedObject(this, NULL,
info.history.same_interval_since,
info.last_complete),
(*p)->ondisk_write_unlock();
}
};
- struct C_OSD_AppliedPushedObject : public Context {
+ struct C_OSD_AppliedRecoveredObject : public Context {
ReplicatedPG *pg;
ObjectStore::Transaction *t;
ObjectContext *obc;
- C_OSD_AppliedPushedObject(ReplicatedPG *p, ObjectStore::Transaction *tt, ObjectContext *o) :
+ C_OSD_AppliedRecoveredObject(ReplicatedPG *p, ObjectStore::Transaction *tt, ObjectContext *o) :
pg(p), t(tt), obc(o) {}
void finish(int r) {
- pg->_applied_pushed_object(t, obc);
+ pg->_applied_recovered_object(t, obc);
}
};
struct C_OSD_CommittedPushedObject : public Context {
void sub_op_modify_commit(RepModify *rm);
void sub_op_modify_reply(MOSDSubOpReply *reply);
- void _applied_pushed_object(ObjectStore::Transaction *t, ObjectContext *obc);
+ void _applied_recovered_object(ObjectStore::Transaction *t, ObjectContext *obc);
void _committed_pushed_object(MOSDSubOp *op, epoch_t same_since, eversion_t lc);
void recover_got(hobject_t oid, eversion_t v);
void sub_op_push(MOSDSubOp *op);