ObjectContext *obc;
bool can_create = op->may_write();
snapid_t snapid;
- int r = find_object_context(hobject_t(op->get_oid(), op->get_snapid(), op->get_pg().ps()),
+ int r = find_object_context(hobject_t(op->get_oid(),
+ op->get_object_locator().key,
+ op->get_snapid(), op->get_pg().ps()),
op->get_object_locator(),
&obc, can_create, &snapid);
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, op->get_pg().ps());
+ hobject_t soid(op->get_oid(), op->get_object_locator().key,
+ snapid, op->get_pg().ps());
wait_for_missing_object(soid, op);
return;
}
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());
+ hobject_t toid(osd_op.soid, op->get_object_locator().key, op->get_pg().ps());
if (osd_op.soid.oid.name.length()) {
if (!src_obc.count(toid)) {
ObjectContext *sobc;
snapid_t ssnapid;
- int r = find_object_context(hobject_t(toid.oid, toid.snap, op->get_pg().ps()),
+ int r = find_object_context(hobject_t(toid.oid, op->get_object_locator().key,
+ toid.snap, op->get_pg().ps()),
op->get_object_locator(),
&sobc, false, &ssnapid);
if (r == -EAGAIN) {
// missing the specific snap we need; requeue and wait.
- hobject_t wait_oid(osd_op.soid.oid, ssnapid, op->get_pg().ps());
+ hobject_t wait_oid(osd_op.soid.oid, op->get_object_locator().key,
+ ssnapid, op->get_pg().ps());
wait_for_missing_object(wait_oid, op);
} else if (r) {
osd->reply_op_error(op, r);
// load clone info
bufferlist bl;
ObjectContext *obc = 0;
- int r = find_object_context(hobject_t(coid.oid, sn, coid.hash),
+ int r = find_object_context(hobject_t(coid.oid, coid.key, sn, coid.hash),
OLOC_BLANK, &obc, false, NULL);
if (r == -ENOENT || coid.snap != obc->obs.oi.soid.snap) {
if (obc) put_object_context(obc);
// get snap set context
if (!obc->ssc)
- obc->ssc = get_snapset_context(coid.oid, coid.hash, false);
+ obc->ssc = get_snapset_context(coid.oid, coid.key, coid.hash, false);
SnapSetContext *ssc = obc->ssc;
assert(ssc);
SnapSet& snapset = ssc->snapset;
// save head snapset
dout(10) << coid << " new snapset " << snapset << dendl;
- hobject_t snapoid(coid.oid, snapset.head_exists ? CEPH_NOSNAP:CEPH_SNAPDIR, coid.hash);
+ hobject_t snapoid(coid.oid, coid.key, 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) {
ObjectContext *src_obc = 0;
if (ceph_osd_op_type_multi(op.op)) {
- src_obc = ctx->src_obc[hobject_t(osd_op.soid, soid.hash)];
+ src_obc = ctx->src_obc[hobject_t(osd_op.soid, soid.key, soid.hash)];
assert(src_obc);
}
result = -EINVAL;
break;
}
- 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);
+ t.clone_range(coll, hobject_t(osd_op.soid, obs.oi.soid.key,
+ 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,
op.clonerange.offset, op.clonerange.length, false);
dout(10) << "_rollback_to " << soid << " snapid " << snapid << dendl;
ObjectContext *rollback_to;
- int ret = find_object_context(hobject_t(soid.oid, snapid, soid.hash),
+ int ret = find_object_context(hobject_t(soid.oid, oi.oloc.key, snapid, soid.hash),
oi.oloc, &rollback_to, false, &cloneid);
if (ret) {
if (-ENOENT == ret) {
/* 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, soid.hash);
+ hobject_t rollback_target(soid.oid, soid.key, 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;
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, soid.hash);
+ hobject_t snapoid(soid.oid, soid.key, 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) {
}
} else if (ctx->new_snapset.clones.size()) {
// save snapset on _snap
- hobject_t snapoid(soid.oid, CEPH_SNAPDIR, soid.hash);
+ hobject_t snapoid(soid.oid, soid.key, CEPH_SNAPDIR, soid.hash);
dout(10) << " final snapset " << ctx->new_snapset
<< " in " << snapoid << dendl;
ctx->at_version.version++;
SnapSetContext *ssc = NULL;
if (can_create)
- ssc = get_snapset_context(soid.oid, soid.hash, true);
+ ssc = get_snapset_context(soid.oid, soid.key, 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, soid.hash, true);
+ obc->ssc = get_snapset_context(soid.oid, soid.key, soid.hash, true);
if (r >= 0) {
obc->obs.oi.decode(bv);
snapid_t *psnapid)
{
// want the head?
- hobject_t head(oid.oid, CEPH_NOSNAP, oid.hash);
+ hobject_t head(oid.oid, oid.key, CEPH_NOSNAP, oid.hash);
if (oid.snap == CEPH_NOSNAP) {
ObjectContext *obc = get_object_context(head, oloc, can_create);
if (!obc)
*pobc = obc;
if (can_create && !obc->ssc)
- obc->ssc = get_snapset_context(oid.oid, oid.hash, true);
+ obc->ssc = get_snapset_context(oid.oid, oid.key, oid.hash, true);
return 0;
}
// we want a snap
- SnapSetContext *ssc = get_snapset_context(oid.oid, oid.hash, can_create);
+ SnapSetContext *ssc = get_snapset_context(oid.oid, oid.key, oid.hash, can_create);
if (!ssc)
return -ENOENT;
put_snapset_context(ssc);
return -ENOENT;
}
- hobject_t soid(oid.oid, ssc->snapset.clones[k], oid.hash);
+ hobject_t soid(oid.oid, oid.key, ssc->snapset.clones[k], oid.hash);
put_snapset_context(ssc); // we're done with ssc
ssc = 0;
obcv.clear();
}
-ReplicatedPG::SnapSetContext *ReplicatedPG::get_snapset_context(const object_t& oid, ps_t seed,
+ReplicatedPG::SnapSetContext *ReplicatedPG::get_snapset_context(const object_t& oid,
+ const string& key,
+ ps_t seed,
bool can_create)
{
SnapSetContext *ssc;
ssc = p->second;
} else {
bufferlist bv;
- hobject_t head(oid, CEPH_NOSNAP, seed);
+ hobject_t head(oid, key, CEPH_NOSNAP, seed);
int r = osd->store->getattr(coll, head, SS_ATTR, bv);
if (r < 0) {
// try _snapset
- hobject_t snapdir(oid, CEPH_SNAPDIR, seed);
+ hobject_t snapdir(oid, key, CEPH_SNAPDIR, seed);
r = osd->store->getattr(coll, snapdir, SS_ATTR, bv);
if (r < 0 && !can_create)
return NULL;
}
// check snapset
- SnapSetContext *ssc = get_snapset_context(soid.oid, soid.hash, false);
+ SnapSetContext *ssc = get_snapset_context(soid.oid, soid.key, soid.hash, false);
dout(10) << " snapset " << ssc->snapset << dendl;
calc_clone_subsets(ssc->snapset, soid, missing,
data_subset, clone_subsets);
return push_start(snapdir, peer);
}
- SnapSetContext *ssc = get_snapset_context(soid.oid, soid.hash, false);
+ SnapSetContext *ssc = get_snapset_context(soid.oid, soid.key, 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);
} 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, soid.hash, false);
+ SnapSetContext *ssc = get_snapset_context(soid.oid, soid.key, 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);
if (soid.snap && soid.snap < CEPH_NOSNAP) {
// clone. make sure we have enough data.
- SnapSetContext *ssc = get_snapset_context(soid.oid, soid.hash, false);
+ SnapSetContext *ssc = get_snapset_context(soid.oid, soid.key, soid.hash, false);
assert(ssc);
clone_subsets.clear(); // forget what pusher said; recalculate cloning.