From: Sage Weil Date: Fri, 19 Dec 2008 00:45:56 +0000 (-0800) Subject: osd: safely encode all other attributes X-Git-Tag: v0.6~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e194bc95cfb8494bd8361d00f6fd910354d10075;p=ceph.git osd: safely encode all other attributes --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 4092b22f511d..61de7ecf974e 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2480,8 +2480,10 @@ void OSD::split_pg(PG *parent, map& 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; diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 6bf137965af4..0b432af017f4 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -541,13 +541,15 @@ bool PG::build_backlog_map(map& 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 diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 48fdc4173c92..ea410e0d6990 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -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 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 diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 54d2e0fba2c8..8b9eb7989cc7 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -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)