]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: safely encode all other attributes
authorSage Weil <sage@newdream.net>
Fri, 19 Dec 2008 00:45:56 +0000 (16:45 -0800)
committerSage Weil <sage@newdream.net>
Fri, 19 Dec 2008 00:45:56 +0000 (16:45 -0800)
src/osd/OSD.cc
src/osd/PG.cc
src/osd/ReplicatedPG.cc
src/osd/osd_types.h

index 4092b22f511d8317e8a1182dc44bc3e1e880d853..61de7ecf974eaea5831f1e7c4c316825ea27a307 100644 (file)
@@ -2480,8 +2480,10 @@ void OSD::split_pg(PG *parent, map<pg_t,PG*>& children, ObjectStore::Transaction
       dout(20) << "  moving " << poid << " from " << parentid << " -> " << pgid << dendl;
       PG *child = children[pgid];
       assert(child);
-      eversion_t v;
-      store->getattr(parentid.to_coll(), poid, "version", &v, sizeof(v));
+      bufferlist bv;
+      store->getattr(parentid.to_coll(), poid, "version", bv);
+      eversion_t v(bv);
+
       if (v > child->info.last_update) {
        child->info.last_update = v;
        dout(25) << "        tagging pg with v " << v << "  > " << child->info.last_update << dendl;
index 6bf137965af42ffe98b189bf2ec20d2f4275453d..0b432af017f4f6089bbaf0684ce6e44d505e7494 100644 (file)
@@ -541,13 +541,15 @@ bool PG::build_backlog_map(map<eversion_t,Log::Entry>& omap)
 
     Log::Entry e;
     e.oid = it->oid;
-    osd->store->getattr(info.pgid.to_coll(), poid, "version",
-                       &e.version, sizeof(e.version));
+    bufferlist bv;
+    osd->store->getattr(info.pgid.to_coll(), poid, "version", bv);
+    e.version.decode(bv);
     if (poid.oid.snap && poid.oid.snap < CEPH_NOSNAP) {
       e.op = Log::Entry::CLONE;
       osd->store->getattr(info.pgid.to_coll(), poid, "snaps", e.snaps);
-      osd->store->getattr(info.pgid.to_coll(), poid, "from_version", 
-                         &e.prior_version, sizeof(e.prior_version));
+      bufferlist bfv;
+      osd->store->getattr(info.pgid.to_coll(), poid, "from_version", bfv);
+      e.prior_version.decode(bfv);
     } else {
       e.op = Log::Entry::BACKLOG;           // FIXME if/when we do smarter op codes!
     }
@@ -1771,9 +1773,10 @@ void PG::read_log(ObjectStore *store)
       
       if (i->is_delete()) continue;
       
-      eversion_t v;
       pobject_t poid(info.pgid.pool(), 0, i->oid);
-      int r = osd->store->getattr(info.pgid.to_coll(), poid, "version", &v, sizeof(v));
+      bufferlist bv;
+      int r = osd->store->getattr(info.pgid.to_coll(), poid, "version", bv);
+      eversion_t v(bv);
       if (r < 0 || v < i->version) {
        dout(15) << "read_log  missing " << *i << dendl;
        missing.add(i->oid, i->version, v);
@@ -1840,15 +1843,19 @@ bool PG::block_if_wrlocked(MOSDOp* op)
 {
   pobject_t poid(info.pgid.pool(), 0, op->get_oid());
 
-  entity_name_t source;
-  int len = osd->store->getattr(info.pgid.to_coll(), poid, "wrlock", &source, sizeof(entity_name_t));
-  //dout(0) << "getattr returns " << len << " on " << oid << dendl;
+  bufferlist bs;
+  int len = osd->store->getattr(info.pgid.to_coll(), poid, "wrlock", bs);
+  if (len > 0) {
+    entity_name_t source;
+    bufferlist::iterator bp = bs.begin();
+    ::decode(source, bp);
+    //dout(0) << "getattr returns " << len << " on " << oid << dendl;
   
-  if (len == sizeof(source) &&
-      source != op->get_orig_source()) {
-    //the object is locked for writing by someone else -- add the op to the waiting queue      
-    waiting_for_wr_unlock[poid.oid].push_back(op);
-    return true;
+    if (source != op->get_orig_source()) {
+      //the object is locked for writing by someone else -- add the op to the waiting queue      
+      waiting_for_wr_unlock[poid.oid].push_back(op);
+      return true;
+    }
   }
   
   return false; //the object wasn't locked, so the operation can be handled right away
index 48fdc4173c9201fdf136df6958bed7212f74bf5a..ea410e0d699038687f68effe87ff75aacea91256 100644 (file)
@@ -723,8 +723,11 @@ void ReplicatedPG::op_read(MOSDOp *op)
   
   // check inc_lock?
   if (op->get_inc_lock() > 0) {
+    bufferlist b;
     __u32 cur = 0;
-    osd->store->getattr(info.pgid.to_coll(), poid, "inc_lock", &cur, sizeof(cur));
+    osd->store->getattr(info.pgid.to_coll(), poid, "inc_lock", b);
+    bufferlist::iterator bp = b.begin();
+    ::decode(cur, bp);
     if (cur > op->get_inc_lock()) {
       dout(10) << " inc_lock " << cur << " > " << op->get_inc_lock()
               << " on " << poid << dendl;
@@ -824,8 +827,12 @@ void ReplicatedPG::_make_clone(ObjectStore::Transaction& t,
 {
   t.clone(info.pgid.to_coll(), head, coid);
   t.setattr(info.pgid.to_coll(), coid, "snaps", snapsbl);
-  t.setattr(info.pgid.to_coll(), coid, "version", &v, sizeof(v));
-  t.setattr(info.pgid.to_coll(), coid, "from_version", &ov, sizeof(v));
+  bufferlist bv(sizeof(v));
+  ::encode(v, bv);
+  t.setattr(info.pgid.to_coll(), coid, "version", bv);
+  bufferlist bov(sizeof(v));
+  ::encode(ov, bov);
+  t.setattr(info.pgid.to_coll(), coid, "from_version", bov);
 }
 
 void ReplicatedPG::prepare_clone(ObjectStore::Transaction& t, bufferlist& logbl, osd_reqid_t reqid, pg_stat_t& stats,
@@ -942,7 +949,9 @@ int ReplicatedPG::prepare_simple_op(ObjectStore::Transaction& t, osd_reqid_t req
     // -- locking --
   case CEPH_OSD_OP_WRLOCK:
     { // lock object
-      t.setattr(info.pgid.to_coll(), poid, "wrlock", &reqid.name, sizeof(entity_name_t));
+      bufferlist b(sizeof(entity_name_t));
+      ::encode(reqid.name, b);
+      t.setattr(info.pgid.to_coll(), poid, "wrlock", b);
     }
     break;  
   case CEPH_OSD_OP_WRUNLOCK:
@@ -1166,10 +1175,15 @@ void ReplicatedPG::prepare_transaction(ObjectStore::Transaction& t, osd_reqid_t
   // finish.
   version = at_version;
   if (exists) {
-    if (inc_lock)
-      t.setattr(info.pgid.to_coll(), poid, "inc_lock", &inc_lock, sizeof(inc_lock));
+    if (inc_lock) {
+      bufferlist b(sizeof(inc_lock));
+      ::encode(inc_lock, b);
+      t.setattr(info.pgid.to_coll(), poid, "inc_lock", b);
+    }
 
-    t.setattr(info.pgid.to_coll(), poid, "version", &at_version, sizeof(at_version));
+    bufferlist bv(sizeof(at_version));
+    ::encode(at_version, bv);
+    t.setattr(info.pgid.to_coll(), poid, "version", bv);
 
     bufferlist snapsetbl;
     ::encode(snapset, snapsetbl);
@@ -1482,9 +1496,10 @@ ReplicatedPG::ProjectedObjectInfo *ReplicatedPG::get_projected_object(pobject_t
     pinfo->exists = true;
     pinfo->size = st.st_size;
     
-    r = osd->store->getattr(info.pgid.to_coll(), poid, "version",
-                           &pinfo->version, sizeof(pinfo->version));
+    bufferlist bv;
+    r = osd->store->getattr(info.pgid.to_coll(), poid, "version", bv);
     assert(r >= 0);
+    pinfo->version.decode(bv);
     
     if (poid.oid.snap == CEPH_NOSNAP) {
       bufferlist bl;
@@ -1534,8 +1549,11 @@ void ReplicatedPG::op_modify(MOSDOp *op)
   
   // check inc_lock?
   if (op->get_inc_lock() > 0) {
+    bufferlist b;
+    osd->store->getattr(info.pgid.to_coll(), poid, "inc_lock", b);
+    bufferlist::iterator bp = b.begin();
     __u32 cur = 0;
-    osd->store->getattr(info.pgid.to_coll(), poid, "inc_lock", &cur, sizeof(cur));
+    ::decode(cur, bp);
     if (cur > op->get_inc_lock()) {
       dout(10) << " inc_lock " << cur << " > " << op->get_inc_lock()
               << " on " << poid << dendl;
@@ -2048,13 +2066,12 @@ void ReplicatedPG::push_to_replica(pobject_t poid, int peer)
 
   // are we doing a clone on the replica?
   if (poid.oid.snap && poid.oid.snap < CEPH_NOSNAP) {  
-    eversion_t version, from_version;
-    int r = osd->store->getattr(info.pgid.to_coll(), poid, "version",
-                               &version, sizeof(version));
+    bufferlist bv, bfv;
+    int r = osd->store->getattr(info.pgid.to_coll(), poid, "version", bv);
     assert(r >= 0);
-    r = osd->store->getattr(info.pgid.to_coll(), poid, "from_version",
-                           &from_version, sizeof(from_version));
+    r = osd->store->getattr(info.pgid.to_coll(), poid, "from_version", bfv);
     assert(r >= 0);
+    eversion_t version(bv), from_version(bfv);
     
     pobject_t head = poid;
     head.oid.snap = CEPH_NOSNAP;
@@ -2122,7 +2139,6 @@ void ReplicatedPG::push(pobject_t poid, int peer,
 {
   // read data+attrs
   bufferlist bl;
-  eversion_t v;
   map<nstring,bufferptr> attrset;
   __u64 size;
 
@@ -2143,7 +2159,9 @@ void ReplicatedPG::push(pobject_t poid, int peer,
     osd->store->read(info.pgid.to_coll(), poid, 0, 0, bl);
     size = bl.length();
   }
-  osd->store->getattr(info.pgid.to_coll(), poid, "version", &v, sizeof(v));
+  bufferlist bv;
+  osd->store->getattr(info.pgid.to_coll(), poid, "version", bv);
+  eversion_t v(bv);
   osd->store->getattrs(info.pgid.to_coll(), poid, attrset);
 
   // ok
index 54d2e0fba2c8c0325ffb1f876efd4c7c2e67b62b..8b9eb7989cc7cd408e06c9a8d00a9a5897051eb7 100644 (file)
@@ -224,6 +224,9 @@ public:
   eversion_t(const ceph_eversion& ce) : 
     version(ce.version),
     epoch(ce.epoch) { }
+
+  eversion_t(bufferlist& bl) { decode(bl); }
+
   operator ceph_eversion() {
     ceph_eversion c;
     c.epoch = epoch;
@@ -245,6 +248,10 @@ public:
     ::decode(version, bl);
     ::decode(epoch, bl);
   }
+  void decode(bufferlist& bl) {
+    bufferlist::iterator p = bl.begin();
+    decode(p);
+  }
 };
 WRITE_CLASS_ENCODER(eversion_t)