From 5e927ebe0b7e3ee6925db58c175c125d0ff03b3e Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Mon, 11 Jul 2011 13:22:48 -0700 Subject: [PATCH] osd/: fix hobject_t construction sobject_t requires only an object_t and a snapid_t. hobject_t also requires the hash which should be used for the object. In most cases, the osd must fill this in using the op message. In cases where the hash used does not matter (as in the metadata collection), the explicit hobject_t(const sobject_t &) constructor supplies a hash. Signed-off-by: Samuel Just --- src/osd/Ager.cc | 4 +-- src/osd/OSD.cc | 8 +++--- src/osd/OSD.h | 8 +++--- src/osd/ReplicatedPG.cc | 64 ++++++++++++++++++++++------------------- src/osd/ReplicatedPG.h | 5 ++-- src/osd/osd_types.h | 4 +-- src/streamtest.cc | 2 +- src/test_trans.cc | 2 +- 8 files changed, 52 insertions(+), 45 deletions(-) diff --git a/src/osd/Ager.cc b/src/osd/Ager.cc index a0e064f6050c0..ac51580ac8b20 100644 --- a/src/osd/Ager.cc +++ b/src/osd/Ager.cc @@ -115,7 +115,7 @@ uint64_t Ager::age_fill(float pc, utime_t until) { bufferlist sbl; sbl.substr_of(bl, 0, t); ObjectStore::Transaction tr; - hobject_t oid(poid, 0); + hobject_t oid(sobject_t(poid, 0)); tr.write(coll_t(), oid, off, t, sbl); store->apply_transaction(tr); off += t; @@ -157,7 +157,7 @@ void Ager::age_empty(float pc) { generic_dout(2) << "age_empty at " << free << " / " << avail << " / " << pc << " removing " << hex << poid << dec << dendl; ObjectStore::Transaction t; - hobject_t oid(poid, 0); + hobject_t oid(sobject_t(poid, 0)); t.remove(coll_t(), oid); store->apply_transaction(t); age_free_oids.push_back(poid); diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 4fccc909429ec..cffdcbb0437a6 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -202,7 +202,7 @@ int OSD::mkfs(const std::string &dev, const std::string &jdev, ceph_fsid_t fsid, object_t oid("disk_bw_test"); for (int i=0; i<1000; i++) { ObjectStore::Transaction *t = new ObjectStore::Transaction; - t->write(coll_t::META_COLL, hobject_t(oid, 0), i*bl.length(), bl.length(), bl); + t->write(coll_t::META_COLL, hobject_t(sobject_t(oid, 0)), i*bl.length(), bl.length(), bl); store->queue_transaction(NULL, t); } store->sync(); @@ -210,7 +210,7 @@ int OSD::mkfs(const std::string &dev, const std::string &jdev, ceph_fsid_t fsid, end -= start; dout(0) << "measured " << (1000.0 / (double)end) << " mb/sec" << dendl; ObjectStore::Transaction tr; - tr.remove(coll_t::META_COLL, hobject_t(oid, 0)); + tr.remove(coll_t::META_COLL, hobject_t(sobject_t(oid, 0))); ret = store->apply_transaction(tr); if (ret) { derr << "OSD::mkfs: error while benchmarking: apply_transaction returned " @@ -2133,7 +2133,7 @@ void OSD::handle_command(MMonCommand *m) char nm[30]; snprintf(nm, sizeof(nm), "disk_bw_test_%lld", (long long)pos); object_t oid(nm); - hobject_t soid(oid, 0); + hobject_t soid(sobject_t(oid, 0)); ObjectStore::Transaction *t = new ObjectStore::Transaction; t->write(coll_t::META_COLL, soid, 0, bsize, bl); store->queue_transaction(NULL, t); @@ -4961,7 +4961,7 @@ void OSD::handle_op(MOSDOp *op) if ((op->get_flags() & CEPH_OSD_FLAG_PGOP) == 0) { // missing object? - hobject_t head(op->get_oid(), CEPH_NOSNAP); + hobject_t head(op->get_oid(), CEPH_NOSNAP, op->get_pg().ps()); if (pg->is_missing_object(head)) { pg->wait_for_missing_object(head, op); pg->unlock(); diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 1c78eb31b4b70..135834d53bdd4 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -161,12 +161,12 @@ public: static hobject_t get_osdmap_pobject_name(epoch_t epoch) { char foo[20]; snprintf(foo, sizeof(foo), "osdmap.%d", epoch); - return hobject_t(object_t(foo), 0); + return hobject_t(sobject_t(object_t(foo), 0)); } static hobject_t get_inc_osdmap_pobject_name(epoch_t epoch) { char foo[20]; snprintf(foo, sizeof(foo), "inc_osdmap.%d", epoch); - return hobject_t(object_t(foo), 0); + return hobject_t(sobject_t(object_t(foo), 0)); } hobject_t make_pg_log_oid(pg_t pg) { @@ -174,7 +174,7 @@ public: ss << "pglog_" << pg; string s; getline(ss, s); - return hobject_t(object_t(s.c_str()), 0); + return hobject_t(sobject_t(object_t(s.c_str()), 0)); } hobject_t make_pg_biginfo_oid(pg_t pg) { @@ -182,7 +182,7 @@ public: ss << "pginfo_" << pg; string s; getline(ss, s); - return hobject_t(object_t(s.c_str()), 0); + return hobject_t(sobject_t(object_t(s.c_str()), 0)); } diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 2a64ed71500be..1bf1baf12f9b5 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -406,7 +406,7 @@ void ReplicatedPG::do_op(MOSDOp *op) ObjectContext *obc; bool can_create = op->may_write(); snapid_t snapid; - int r = find_object_context(op->get_oid(), op->get_object_locator(), + int r = find_object_context(op->get_oid(), op->get_pg().ps(), op->get_object_locator(), op->get_snapid(), &obc, can_create, &snapid); if (r) { @@ -417,7 +417,7 @@ void ReplicatedPG::do_op(MOSDOp *op) if (is_primary() || (!(op->get_rmw_flags() & CEPH_OSD_FLAG_LOCALIZE_READS))) { // missing the specific snap we need; requeue and wait. assert(!can_create); // only happens on a read - hobject_t soid(op->get_oid(), snapid); + hobject_t soid(op->get_oid(), snapid, op->get_pg().ps()); wait_for_missing_object(soid, op); return; } @@ -477,16 +477,18 @@ void ReplicatedPG::do_op(MOSDOp *op) map src_obc; for (vector::iterator p = op->ops.begin(); p != op->ops.end(); p++) { OSDOp& osd_op = *p; + hobject_t toid(osd_op.soid, op->get_pg().ps()); if (osd_op.soid.oid.name.length()) { - if (!src_obc.count(osd_op.soid)) { + if (!src_obc.count(toid)) { ObjectContext *sobc; snapid_t ssnapid; - int r = find_object_context(osd_op.soid.oid, op->get_object_locator(), osd_op.soid.snap, + int r = find_object_context(toid.oid, op->get_pg().ps(), + op->get_object_locator(), toid.snap, &sobc, false, &ssnapid); if (r == -EAGAIN) { // missing the specific snap we need; requeue and wait. - hobject_t soid(osd_op.soid.oid, ssnapid); - wait_for_missing_object(soid, op); + hobject_t wait_oid(osd_op.soid.oid, ssnapid, op->get_pg().ps()); + wait_for_missing_object(wait_oid, op); } else if (r) { osd->reply_op_error(op, r); } else if (is_degraded_object(sobc->obs.oi.soid)) { @@ -498,7 +500,7 @@ void ReplicatedPG::do_op(MOSDOp *op) << op->get_oid() << " oloc " << obc->obs.oi.oloc << dendl; osd->reply_op_error(op, -EINVAL); } else { - src_obc[osd_op.soid] = sobc; + src_obc[toid] = sobc; continue; } // Error cleanup below @@ -812,7 +814,8 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid, // load clone info bufferlist bl; ObjectContext *obc = 0; - int r = find_object_context(coid.oid, OLOC_BLANK, sn, &obc, false, NULL); + int r = find_object_context(coid.oid, coid.hash, + OLOC_BLANK, sn, &obc, false, NULL); if (r == -ENOENT || coid.snap != obc->obs.oi.soid.snap) { if (obc) put_object_context(obc); return 0; @@ -824,7 +827,7 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid, // get snap set context if (!obc->ssc) - obc->ssc = get_snapset_context(coid.oid, false); + obc->ssc = get_snapset_context(coid.oid, coid.hash, false); SnapSetContext *ssc = obc->ssc; assert(ssc); SnapSet& snapset = ssc->snapset; @@ -921,7 +924,7 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid, // save head snapset dout(10) << coid << " new snapset " << snapset << dendl; - hobject_t snapoid(coid.oid, snapset.head_exists ? CEPH_NOSNAP:CEPH_SNAPDIR); + hobject_t snapoid(coid.oid, snapset.head_exists ? CEPH_NOSNAP:CEPH_SNAPDIR, coid.hash); ctx->snapset_obc = get_object_context(snapoid, coi.oloc, false); assert(ctx->snapset_obc->registered); if (snapset.clones.empty() && !snapset.head_exists) { @@ -1673,7 +1676,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops, result = -EINVAL; break; } - t.clone_range(coll, osd_op.soid, obs.oi.soid, + t.clone_range(coll, hobject_t(osd_op.soid, obs.oi.soid.hash), obs.oi.soid, op.clonerange.src_offset, op.clonerange.length, op.clonerange.offset); write_update_size_and_usage(ctx->delta_stats, oi, ssc->snapset, ctx->modified_ranges, @@ -2091,7 +2094,8 @@ int ReplicatedPG::_rollback_to(OpContext *ctx, ceph_osd_op& op) dout(10) << "_rollback_to " << soid << " snapid " << snapid << dendl; ObjectContext *rollback_to; - int ret = find_object_context(soid.oid, oi.oloc, snapid, &rollback_to, false, &cloneid); + int ret = find_object_context(soid.oid, soid.hash, oi.oloc, + snapid, &rollback_to, false, &cloneid); if (ret) { if (-ENOENT == ret) { // there's no snapshot here, or there's no object. @@ -2103,7 +2107,7 @@ int ReplicatedPG::_rollback_to(OpContext *ctx, ceph_osd_op& op) /* 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! */ - hobject_t rollback_target(soid.oid, cloneid); + hobject_t rollback_target(soid.oid, cloneid, soid.hash); assert(is_missing_object(rollback_target)); dout(20) << "_rollback_to attempted to roll back to a missing object " << rollback_target << " (requested snapid: ) " << snapid << dendl; @@ -2540,7 +2544,7 @@ int ReplicatedPG::prepare_transaction(OpContext *ctx) ctx->op_t.setattr(coll, soid, SS_ATTR, bss); if (!head_existed) { // if we logically recreated the head, remove old _snapdir object - hobject_t snapoid(soid.oid, CEPH_SNAPDIR); + hobject_t snapoid(soid.oid, CEPH_SNAPDIR, soid.hash); ctx->snapset_obc = get_object_context(snapoid, ctx->new_obs.oi.oloc, false); if (ctx->snapset_obc && ctx->snapset_obc->obs.exists) { @@ -2557,7 +2561,7 @@ int ReplicatedPG::prepare_transaction(OpContext *ctx) } } else if (ctx->new_snapset.clones.size()) { // save snapset on _snap - hobject_t snapoid(soid.oid, CEPH_SNAPDIR); + hobject_t snapoid(soid.oid, CEPH_SNAPDIR, soid.hash); dout(10) << " final snapset " << ctx->new_snapset << " in " << snapoid << dendl; ctx->at_version.version++; @@ -3011,13 +3015,13 @@ ReplicatedPG::ObjectContext *ReplicatedPG::get_object_context(const hobject_t& s SnapSetContext *ssc = NULL; if (can_create) - ssc = get_snapset_context(soid.oid, true); + ssc = get_snapset_context(soid.oid, soid.hash, true); obc = new ObjectContext(oi, true, ssc); } register_object_context(obc); if (can_create && !obc->ssc) - obc->ssc = get_snapset_context(soid.oid, true); + obc->ssc = get_snapset_context(soid.oid, soid.hash, true); if (r >= 0) { obc->obs.oi.decode(bv); @@ -3045,14 +3049,15 @@ ReplicatedPG::ObjectContext *ReplicatedPG::get_object_context(const hobject_t& s } -int ReplicatedPG::find_object_context(const object_t& oid, const object_locator_t& oloc, +int ReplicatedPG::find_object_context(const object_t& oid, ps_t seed, + const object_locator_t& oloc, snapid_t snapid, ObjectContext **pobc, bool can_create, snapid_t *psnapid) { // want the head? - hobject_t head(oid, CEPH_NOSNAP); + hobject_t head(oid, CEPH_NOSNAP, seed); if (snapid == CEPH_NOSNAP) { ObjectContext *obc = get_object_context(head, oloc, can_create); if (!obc) @@ -3061,13 +3066,13 @@ int ReplicatedPG::find_object_context(const object_t& oid, const object_locator_ *pobc = obc; if (can_create && !obc->ssc) - obc->ssc = get_snapset_context(oid, true); + obc->ssc = get_snapset_context(oid, seed, true); return 0; } // we want a snap - SnapSetContext *ssc = get_snapset_context(oid, can_create); + SnapSetContext *ssc = get_snapset_context(oid, seed, can_create); if (!ssc) return -ENOENT; @@ -3109,7 +3114,7 @@ int ReplicatedPG::find_object_context(const object_t& oid, const object_locator_ put_snapset_context(ssc); return -ENOENT; } - hobject_t soid(oid, ssc->snapset.clones[k]); + hobject_t soid(oid, ssc->snapset.clones[k], seed); put_snapset_context(ssc); // we're done with ssc ssc = 0; @@ -3173,7 +3178,8 @@ void ReplicatedPG::put_object_contexts(map& obcv) obcv.clear(); } -ReplicatedPG::SnapSetContext *ReplicatedPG::get_snapset_context(const object_t& oid, bool can_create) +ReplicatedPG::SnapSetContext *ReplicatedPG::get_snapset_context(const object_t& oid, ps_t seed, + bool can_create) { SnapSetContext *ssc; map::iterator p = snapset_contexts.find(oid); @@ -3181,11 +3187,11 @@ ReplicatedPG::SnapSetContext *ReplicatedPG::get_snapset_context(const object_t& ssc = p->second; } else { bufferlist bv; - hobject_t head(oid, CEPH_NOSNAP); + hobject_t head(oid, CEPH_NOSNAP, seed); int r = osd->store->getattr(coll, head, SS_ATTR, bv); if (r < 0) { // try _snapset - hobject_t snapdir(oid, CEPH_SNAPDIR); + hobject_t snapdir(oid, CEPH_SNAPDIR, seed); r = osd->store->getattr(coll, snapdir, SS_ATTR, bv); if (r < 0 && !can_create) return NULL; @@ -3595,7 +3601,7 @@ int ReplicatedPG::pull(const hobject_t& soid) } // check snapset - SnapSetContext *ssc = get_snapset_context(soid.oid, false); + SnapSetContext *ssc = get_snapset_context(soid.oid, soid.hash, false); dout(10) << " snapset " << ssc->snapset << dendl; calc_clone_subsets(ssc->snapset, soid, missing, data_subset, clone_subsets); @@ -3703,7 +3709,7 @@ void ReplicatedPG::push_to_replica(ObjectContext *obc, const hobject_t& soid, in return push_start(snapdir, peer); } - SnapSetContext *ssc = get_snapset_context(soid.oid, false); + SnapSetContext *ssc = get_snapset_context(soid.oid, soid.hash, false); dout(15) << "push_to_replica snapset is " << ssc->snapset << dendl; calc_clone_subsets(ssc->snapset, soid, peer_missing[peer], data_subset, clone_subsets); @@ -3711,7 +3717,7 @@ void ReplicatedPG::push_to_replica(ObjectContext *obc, const hobject_t& soid, in } else if (soid.snap == CEPH_NOSNAP) { // pushing head or unversioned object. // base this on partially on replica's clones? - SnapSetContext *ssc = get_snapset_context(soid.oid, false); + SnapSetContext *ssc = get_snapset_context(soid.oid, soid.hash, false); dout(15) << "push_to_replica snapset is " << ssc->snapset << dendl; calc_head_subsets(ssc->snapset, soid, peer_missing[peer], data_subset, clone_subsets); put_snapset_context(ssc); @@ -4055,7 +4061,7 @@ void ReplicatedPG::sub_op_push(MOSDSubOp *op) if (soid.snap && soid.snap < CEPH_NOSNAP) { // clone. make sure we have enough data. - SnapSetContext *ssc = get_snapset_context(soid.oid, false); + SnapSetContext *ssc = get_snapset_context(soid.oid, soid.hash, false); assert(ssc); clone_subsets.clear(); // forget what pusher said; recalculate cloning. diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index b494c075626d4..3ee3b8e194fb1 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -505,11 +505,12 @@ protected: } void put_object_context(ObjectContext *obc); void put_object_contexts(map& obcv); - int find_object_context(const object_t& oid, const object_locator_t& oloc, + int find_object_context(const object_t& oid, ps_t seed, + const object_locator_t& oloc, snapid_t snapid, ObjectContext **pobc, bool can_create, snapid_t *psnapid=NULL); - SnapSetContext *get_snapset_context(const object_t& oid, bool can_create); + SnapSetContext *get_snapset_context(const object_t& oid, ps_t seed, bool can_create); void register_snapset_context(SnapSetContext *ssc) { if (!ssc->registered) { ssc->registered = true; diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index c63da65dbdfd8..9cbf87bcc87b3 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -102,7 +102,7 @@ enum { CEPH_RBD_RULE, }; -#define OSD_SUPERBLOCK_POBJECT hobject_t(object_t("osd_superblock"), 0) +#define OSD_SUPERBLOCK_POBJECT hobject_t(sobject_t(object_t("osd_superblock"), 0)) // placement seed (a hash value) typedef uint32_t ps_t; @@ -1254,7 +1254,7 @@ WRITE_CLASS_ENCODER(ScrubMap) struct OSDOp { ceph_osd_op op; bufferlist data; - hobject_t soid; + sobject_t soid; OSDOp() { memset(&op, 0, sizeof(ceph_osd_op)); diff --git a/src/streamtest.cc b/src/streamtest.cc index 9736281f1a072..65d7248e7ca02 100644 --- a/src/streamtest.cc +++ b/src/streamtest.cc @@ -145,7 +145,7 @@ int main(int argc, const char **argv) set_start(pos, ceph_clock_now(g_ceph_context)); ObjectStore::Transaction *t = new ObjectStore::Transaction; - t->write(coll_t(), poid, pos, bytes, bl); + t->write(coll_t(), hobject_t(poid), pos, bytes, bl); fs->queue_transaction(NULL, t, new C_Ack(pos), new C_Commit(pos)); pos += bytes; diff --git a/src/test_trans.cc b/src/test_trans.cc index f36f6d44d7d6f..248bb943bbaf5 100644 --- a/src/test_trans.cc +++ b/src/test_trans.cc @@ -63,7 +63,7 @@ int main(int argc, const char **argv) char f[30]; snprintf(f, sizeof(f), "foo%d\n", i); sobject_t soid(f, CEPH_NOSNAP); - t.write(coll_t(), soid, 0, bl.length(), bl); + t.write(coll_t(), hobject_t(soid), 0, bl.length(), bl); } dout(0) << "starting thread" << dendl; -- 2.39.5