From 643b6a50aee5a8e61cd2541b777cd6d3dc396a2a Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 23 Jan 2014 13:32:21 -0800 Subject: [PATCH] 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 --- src/osd/PG.cc | 2 +- src/osd/ReplicatedPG.cc | 100 ++++++++++++++++++++-------------------- src/osd/osd_types.h | 5 +- 3 files changed, 55 insertions(+), 52 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 51c0b4271d276..166dd8a715b22 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -833,7 +833,7 @@ map::const_iterator PG::find_best_info(const map 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) { diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index b26d2f1b81cb1..31e31c72dbc7f 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -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 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 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 changing; changing.insert(OI_ATTR); changing.insert(SS_ATTR); @@ -2839,7 +2839,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& 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& 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& 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& 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& 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& 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& 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& 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& 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& 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& ops) string aname; bp.copy(op.xattr.name_len, aname); string name = "_" + aname; - if (pool.info.ec_pool()) { + if (pool.info.require_rollback()) { map > 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& ops) string aname; bp.copy(op.xattr.name_len, aname); string name = "_" + aname; - if (pool.info.ec_pool()) { + if (pool.info.require_rollback()) { map > 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& 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& 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& 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& 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& 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& 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& 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& 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& 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& 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& 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& 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 > 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 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& 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(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::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 > 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::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(); } 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::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 *out) { - if (pool.info.ec_pool()) { + if (pool.info.require_rollback()) { if (out) *out = obc->attr_cache; return 0; diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 185d4368e4ab4..4a958092f8dc4 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -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; } -- 2.39.5