diff options
author | Samuel Just <samuel.just@dreamhost.com> | 2012-01-25 13:58:58 -0800 |
---|---|---|
committer | Samuel Just <samuel.just@dreamhost.com> | 2012-01-25 13:58:58 -0800 |
commit | 4454d3915095983ee91368b84ae5e2e2fc7d67b8 (patch) | |
tree | d6fbbbf2d037c7c05717a0e5d6db75c0e5a37e2e | |
parent | acb164c81e8142d5489585a124a38347ad192e35 (diff) | |
parent | f16b38deaee3d0ed35229aecba4f8f12b8404f03 (diff) | |
download | ceph-4454d3915095983ee91368b84ae5e2e2fc7d67b8.tar.gz |
Merge remote branch 'upstream/wip-osd-clone-obc'
-rw-r--r-- | src/osd/ReplicatedPG.cc | 25 | ||||
-rw-r--r-- | src/osd/ReplicatedPG.h | 8 |
2 files changed, 21 insertions, 12 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index d2185fee5b6..9728f79b899 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -4380,10 +4380,10 @@ void ReplicatedPG::_committed_pushed_object(MOSDSubOp *op, epoch_t same_since, e 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); @@ -4681,7 +4681,7 @@ void ReplicatedPG::sub_op_push(MOSDSubOp *op) 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); @@ -5254,13 +5254,22 @@ int ReplicatedPG::recover_primary(int max) ::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; @@ -5293,7 +5302,7 @@ int ReplicatedPG::recover_primary(int max) 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), diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 6b43aa23d67..830fae17068 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -710,14 +710,14 @@ protected: (*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 { @@ -744,7 +744,7 @@ protected: 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); |