ReplicatedPG,osd_types: seperate require_rollback from ec_pool

It's handy to allow a pool to answer false to ec_pool() and
true to require_rollback() in order to allow a replicated
pool to test the rollback mechanisms without allowing
non-NO_SHARD shards.

Signed-off-by: Samuel Just <sam.just@inktank.com>
This commit is contained in:
Samuel Just 2014-01-23 13:32:21 -08:00
parent f020ce90f7
commit 643b6a50ae
3 changed files with 55 additions and 52 deletions

View File

@ -833,7 +833,7 @@ map<int, pg_info_t>::const_iterator PG::find_best_info(const map<int, pg_info_t>
continue;
}
// Prefer newer last_update
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
if (p->second.last_update > best->second.last_update)
continue;
if (p->second.last_update < best->second.last_update) {

View File

@ -2227,7 +2227,7 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid)
osd_reqid_t(),
ctx->mtime)
);
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
set<snapid_t> snaps(
ctx->obc->obs.oi.snaps.begin(),
ctx->obc->obs.oi.snaps.end());
@ -2264,7 +2264,7 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid)
osd_reqid_t(),
ctx->mtime)
);
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
set<string> changing;
changing.insert(OI_ATTR);
ctx->obc->fill_in_setattrs(changing, &(ctx->log.back().mod_desc));
@ -2304,7 +2304,7 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid)
ctx->snapset_obc->obs.exists = false;
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
if (ctx->log.back().mod_desc.rmobject(ctx->at_version.version)) {
t->stash(snapoid, ctx->at_version.version);
} else {
@ -2339,7 +2339,7 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid)
::encode(ctx->snapset_obc->obs.oi, bl);
setattr_maybe_cache(ctx->snapset_obc, ctx, t, OI_ATTR, bl);
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
set<string> changing;
changing.insert(OI_ATTR);
changing.insert(SS_ATTR);
@ -2839,7 +2839,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
// --- READS ---
case CEPH_OSD_OP_SYNC_READ:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -2865,7 +2865,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
bufferlist bl;
if (trim != (uint64_t)-1 && op.extent.length == 0) {
// read size was trimmed to zero
} else if (pool.info.ec_pool()) {
} else if (pool.info.require_rollback()) {
ctx->pending_async_reads.push_back(
make_pair(
make_pair(op.extent.offset, op.extent.length),
@ -2895,7 +2895,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
/* map extents */
case CEPH_OSD_OP_MAPEXT:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -2915,7 +2915,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
/* map extents */
case CEPH_OSD_OP_SPARSE_READ:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -3488,7 +3488,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
ctx->mod_desc.append(oi.size);
} else {
ctx->mod_desc.mark_unrollbackable();
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -3528,7 +3528,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
result = check_offset_and_length(op.extent.offset, op.extent.length, cct->_conf->osd_max_object_size);
if (result < 0)
break;
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
t->append(soid, op.extent.offset, op.extent.length, osd_op.indata);
} else {
t->write(soid, op.extent.offset, op.extent.length, osd_op.indata);
@ -3553,7 +3553,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
if (result < 0)
break;
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
if (obs.exists) {
if (ctx->mod_desc.rmobject(oi.version.version)) {
t->stash(soid, oi.version.version);
@ -3597,7 +3597,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
break;
case CEPH_OSD_OP_ZERO:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -3661,7 +3661,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
// falling through
case CEPH_OSD_OP_TRUNCATE:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -3720,7 +3720,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
case CEPH_OSD_OP_CLONERANGE:
ctx->mod_desc.mark_unrollbackable();
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -3810,7 +3810,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
string aname;
bp.copy(op.xattr.name_len, aname);
string name = "_" + aname;
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
map<string, boost::optional<bufferlist> > to_set;
bufferlist old;
int r = getattr_maybe_cache(ctx->obc, name, &old);
@ -3836,7 +3836,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
string aname;
bp.copy(op.xattr.name_len, aname);
string name = "_" + aname;
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
map<string, boost::optional<bufferlist> > to_set;
bufferlist old;
int r = getattr_maybe_cache(ctx->obc, name, &old);
@ -3880,7 +3880,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
// -- trivial map --
case CEPH_OSD_OP_TMAPGET:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -3897,7 +3897,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
break;
case CEPH_OSD_OP_TMAPPUT:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -3955,7 +3955,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
break;
case CEPH_OSD_OP_TMAPUP:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -3970,7 +3970,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
// OMAP Read ops
case CEPH_OSD_OP_OMAPGETKEYS:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -4007,7 +4007,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
break;
case CEPH_OSD_OP_OMAPGETVALS:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -4052,7 +4052,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
break;
case CEPH_OSD_OP_OMAPGETHEADER:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -4065,7 +4065,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
break;
case CEPH_OSD_OP_OMAPGETVALSBYKEYS:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -4088,7 +4088,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
break;
case CEPH_OSD_OP_OMAP_CMP:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -4159,7 +4159,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
// OMAP Write ops
case CEPH_OSD_OP_OMAPSETVALS:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -4192,7 +4192,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
break;
case CEPH_OSD_OP_OMAPSETHEADER:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -4211,7 +4211,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
break;
case CEPH_OSD_OP_OMAPCLEAR:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -4230,7 +4230,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
break;
case CEPH_OSD_OP_OMAPRMKEYS:
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
break;
}
@ -4387,7 +4387,7 @@ inline int ReplicatedPG::_delete_head(OpContext *ctx, bool no_whiteout)
if (!obs.exists || (obs.oi.is_whiteout() && !no_whiteout))
return -ENOENT;
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
if (ctx->mod_desc.rmobject(oi.version.version)) {
t->stash(soid, oi.version.version);
} else {
@ -4494,7 +4494,7 @@ int ReplicatedPG::_rollback_to(OpContext *ctx, ceph_osd_op& op)
dout(10) << "_rollback_to deleting " << soid.oid
<< " and rolling back to old snap" << dendl;
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
if (obs.exists) {
if (ctx->mod_desc.rmobject(oi.version.version)) {
t->stash(soid, oi.version.version);
@ -4619,7 +4619,7 @@ void ReplicatedPG::make_writeable(OpContext *ctx)
ctx->clone_obc->destructor_callback = new C_PG_ObjectContext(this, ctx->clone_obc.get());
ctx->clone_obc->obs.oi = static_snap_oi;
ctx->clone_obc->obs.exists = true;
if (pool.info.ec_pool())
if (pool.info.require_rollback())
ctx->clone_obc->attr_cache = ctx->obc->attr_cache;
snap_oi = &ctx->clone_obc->obs.oi;
} else {
@ -4893,7 +4893,7 @@ void ReplicatedPG::finish_ctx(OpContext *ctx, int log_op_type)
ctx->at_version,
ctx->obs->oi.version,
0, osd_reqid_t(), ctx->mtime));
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
if (ctx->log.back().mod_desc.rmobject(ctx->at_version.version)) {
ctx->op_t->stash(snapoid, ctx->at_version.version);
} else {
@ -4922,9 +4922,9 @@ void ReplicatedPG::finish_ctx(OpContext *ctx, int log_op_type)
0, osd_reqid_t(), ctx->mtime));
ctx->snapset_obc = get_object_context(snapoid, true);
if (pool.info.ec_pool() && !ctx->snapset_obc->obs.exists) {
if (pool.info.require_rollback() && !ctx->snapset_obc->obs.exists) {
ctx->log.back().mod_desc.create();
} else if (!pool.info.ec_pool()) {
} else if (!pool.info.require_rollback()) {
ctx->log.back().mod_desc.mark_unrollbackable();
}
ctx->snapset_obc->obs.exists = true;
@ -4937,7 +4937,7 @@ void ReplicatedPG::finish_ctx(OpContext *ctx, int log_op_type)
ctx->op_t->touch(snapoid);
setattr_maybe_cache(ctx->snapset_obc, ctx, ctx->op_t, OI_ATTR, bv);
setattr_maybe_cache(ctx->snapset_obc, ctx, ctx->op_t, SS_ATTR, bss);
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
map<string, boost::optional<bufferlist> > to_set;
to_set[SS_ATTR];
to_set[OI_ATTR];
@ -4984,7 +4984,7 @@ void ReplicatedPG::finish_ctx(OpContext *ctx, int log_op_type)
<< " in " << soid << dendl;
setattr_maybe_cache(ctx->obc, ctx, ctx->op_t, SS_ATTR, bss);
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
set<string> changing;
changing.insert(OI_ATTR);
changing.insert(SS_ATTR);
@ -5132,7 +5132,7 @@ int ReplicatedPG::fill_in_copy_get(
bool async_read_started = false;
object_copy_data_t _reply_obj;
C_CopyFrom_AsyncReadCb *cb = NULL;
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
cb = new C_CopyFrom_AsyncReadCb(&osd_op, classic);
}
object_copy_data_t &reply_obj = cb ? cb->reply_obj : _reply_obj;
@ -5189,7 +5189,7 @@ int ReplicatedPG::fill_in_copy_get(
// omap
std::map<std::string,bufferlist>& out_omap = reply_obj.omap;
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
cursor.omap_complete = true;
} else {
if (left > 0 && !cursor.omap_complete) {
@ -5344,7 +5344,7 @@ void ReplicatedPG::process_copy_chunk(hobject_t oid, tid_t tid, int r)
return;
}
if (r >= 0 && pool.info.ec_pool() && cop->omap.size()) {
if (r >= 0 && pool.info.require_rollback() && cop->omap.size()) {
r = -EOPNOTSUPP;
}
cop->objecter_tid = 0;
@ -5474,7 +5474,7 @@ void ReplicatedPG::finish_copyfrom(OpContext *ctx)
ObjectState& obs = ctx->new_obs;
CopyFromCallback *cb = static_cast<CopyFromCallback*>(ctx->copy_cb);
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
if (obs.exists) {
if (ctx->mod_desc.rmobject(ctx->at_version.version)) {
ctx->op_t->stash(obs.oi.soid, ctx->at_version.version);
@ -6251,7 +6251,7 @@ void ReplicatedPG::issue_repop(RepGather *repop, utime_t now)
repop->ctx->apply_pending_attrs();
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
for (vector<pg_log_entry_t>::iterator i = repop->ctx->log.begin();
i != repop->ctx->log.end();
++i) {
@ -6554,7 +6554,7 @@ void ReplicatedPG::handle_watch_timeout(WatchRef watch)
::encode(obc->obs.oi, bl);
setattr_maybe_cache(obc, repop->ctx, t, OI_ATTR, bl);
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
map<string, boost::optional<bufferlist> > to_set;
to_set[OI_ATTR] = bl;
ctx->log.back().mod_desc.setattrs(to_set);
@ -6637,7 +6637,7 @@ ObjectContextRef ReplicatedPG::get_object_context(const hobject_t& soid,
populate_obc_watchers(obc);
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
if (attrs) {
for (map<string, bufferptr>::iterator i = attrs->begin();
i != attrs->end();
@ -10103,7 +10103,7 @@ void ReplicatedPG::hit_set_persist()
0,
osd_reqid_t(),
ctx->mtime));
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
if (ctx->log.back().mod_desc.rmobject(ctx->at_version.version)) {
ctx->op_t->stash(old_obj, ctx->at_version.version);
} else {
@ -10163,7 +10163,7 @@ void ReplicatedPG::hit_set_persist()
osd_reqid_t(),
ctx->mtime)
);
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
ctx->log.back().mod_desc.create();
} else {
ctx->log.back().mod_desc.mark_unrollbackable();
@ -10192,7 +10192,7 @@ void ReplicatedPG::hit_set_trim(RepGather *repop, unsigned max)
0,
osd_reqid_t(),
repop->ctx->mtime));
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
if (repop->ctx->log.back().mod_desc.rmobject(
repop->ctx->at_version.version)) {
repop->ctx->op_t->stash(oid, repop->ctx->at_version.version);
@ -11037,7 +11037,7 @@ void ReplicatedPG::setattr_maybe_cache(
const string &key,
bufferlist &val)
{
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
op->pending_attrs[obc][key] = val;
}
t->setattr(obc->obs.oi.soid, key, val);
@ -11049,7 +11049,7 @@ void ReplicatedPG::rmattr_maybe_cache(
PGBackend::PGTransaction *t,
const string &key)
{
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
op->pending_attrs[obc][key] = boost::optional<bufferlist>();
}
t->rmattr(obc->obs.oi.soid, key);
@ -11060,7 +11060,7 @@ int ReplicatedPG::getattr_maybe_cache(
const string &key,
bufferlist *val)
{
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
map<string, bufferlist>::iterator i = obc->attr_cache.find(key);
if (i != obc->attr_cache.end()) {
if (val)
@ -11077,7 +11077,7 @@ int ReplicatedPG::getattrs_maybe_cache(
ObjectContextRef obc,
map<string, bufferlist> *out)
{
if (pool.info.ec_pool()) {
if (pool.info.require_rollback()) {
if (out)
*out = obc->attr_cache;
return 0;

View File

@ -871,7 +871,10 @@ public:
/// This method will later return true for ec pools as well
bool ec_pool() const {
return flags & FLAG_DEBUG_FAKE_EC_POOL;
return type == TYPE_ERASURE;
}
bool require_rollback() const {
return ec_pool() || flags & FLAG_DEBUG_FAKE_EC_POOL;
}
unsigned get_type() const { return type; }