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!
}
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);
{
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
// 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;
{
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,
// -- 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:
// 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);
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;
// 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;
// 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;
{
// read data+attrs
bufferlist bl;
- eversion_t v;
map<nstring,bufferptr> attrset;
__u64 size;
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