]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/: fix hobject_t construction
authorSamuel Just <samuel.just@dreamhost.com>
Mon, 11 Jul 2011 20:22:48 +0000 (13:22 -0700)
committerSamuel Just <samuel.just@dreamhost.com>
Tue, 30 Aug 2011 00:43:05 +0000 (17:43 -0700)
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 <samuel.just@dreamhost.com>
src/osd/Ager.cc
src/osd/OSD.cc
src/osd/OSD.h
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h
src/osd/osd_types.h
src/streamtest.cc
src/test_trans.cc

index a0e064f6050c017c9ebe0d3bc8dadbff910a96c1..ac51580ac8b2030acfc1244fd6bc4052015596ae 100644 (file)
@@ -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);
index 4fccc909429ec2310ca5ee839ea30b9da6959ef6..cffdcbb0437a6858bb5acea1e203eb245dee510f 100644 (file)
@@ -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();
index 1c78eb31b4b705e02d852f781167b84371866fa4..135834d53bdd4c547ceace47ec791ece8eef9695 100644 (file)
@@ -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));
   }
   
 
index 2a64ed71500be0fd71ecc1cfa68a7525933755b0..1bf1baf12f9b544d641597b337c0f01c9ca71b54 100644 (file)
@@ -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<hobject_t,ObjectContext*> src_obc;
   for (vector<OSDOp>::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<OSDOp>& 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<hobject_t,ObjectContext*>& 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<object_t, SnapSetContext*>::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.
index b494c075626d4c8046685cb5ec887dde41091d98..3ee3b8e194fb160d0be6152a51fe928444932ddb 100644 (file)
@@ -505,11 +505,12 @@ protected:
   }
   void put_object_context(ObjectContext *obc);
   void put_object_contexts(map<hobject_t,ObjectContext*>& 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;
index c63da65dbdfd8b466d66e7dd8fa94e6e0179128e..9cbf87bcc87b3cdca939386e3b41b6afa5621e2b 100644 (file)
@@ -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));
index 9736281f1a072df627f6593c91173eed0c484a59..65d7248e7ca02efe4bde32d5f1154e8ac1b2f684 100644 (file)
@@ -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;
 
index f36f6d44d7d6f443f27bb81f15ebfc79a5de01f8..248bb943bbaf5a7ecbe1d2803ad9bd34f3a4f1e6 100644 (file)
@@ -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;