summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <samuel.just@dreamhost.com>2012-01-25 13:58:58 -0800
committerSamuel Just <samuel.just@dreamhost.com>2012-01-25 13:58:58 -0800
commit4454d3915095983ee91368b84ae5e2e2fc7d67b8 (patch)
treed6fbbbf2d037c7c05717a0e5d6db75c0e5a37e2e
parentacb164c81e8142d5489585a124a38347ad192e35 (diff)
parentf16b38deaee3d0ed35229aecba4f8f12b8404f03 (diff)
downloadceph-4454d3915095983ee91368b84ae5e2e2fc7d67b8.tar.gz
Merge remote branch 'upstream/wip-osd-clone-obc'
-rw-r--r--src/osd/ReplicatedPG.cc25
-rw-r--r--src/osd/ReplicatedPG.h8
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);