From: Zhiqiang Wang Date: Thu, 3 Sep 2015 05:36:06 +0000 (+0800) Subject: osd: force promote for ops which ec base pool can't handle X-Git-Tag: v9.1.0~151^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8c2dfadbb95dc1a6c66871d49bdcbba0bb6d4a00;p=ceph.git osd: force promote for ops which ec base pool can't handle For ops which the ec base pool can't handle, if they are proxied to the base ec pool, ENOTSUPP is returned. Need to force promote the objects into the cache pool. Fixes: #12903 Signed-off-by: Zhiqiang Wang --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index a98db3401d04..e22960bc3764 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -8647,6 +8647,40 @@ int OSD::init_op_flags(OpRequestRef& op) if (ceph_osd_op_mode_cache(iter->op.op)) op->set_cache(); + // check for ec base pool + int64_t poolid = m->get_pg().pool(); + const pg_pool_t *pool = osdmap->get_pg_pool(poolid); + if (pool && pool->is_tier()) { + const pg_pool_t *base_pool = osdmap->get_pg_pool(pool->tier_of); + if (base_pool && base_pool->require_rollback()) { + if ((iter->op.op != CEPH_OSD_OP_READ) && + (iter->op.op != CEPH_OSD_OP_STAT) && + (iter->op.op != CEPH_OSD_OP_ISDIRTY) && + (iter->op.op != CEPH_OSD_OP_UNDIRTY) && + (iter->op.op != CEPH_OSD_OP_GETXATTR) && + (iter->op.op != CEPH_OSD_OP_GETXATTRS) && + (iter->op.op != CEPH_OSD_OP_CMPXATTR) && + (iter->op.op != CEPH_OSD_OP_SRC_CMPXATTR) && + (iter->op.op != CEPH_OSD_OP_ASSERT_VER) && + (iter->op.op != CEPH_OSD_OP_LIST_WATCHERS) && + (iter->op.op != CEPH_OSD_OP_LIST_SNAPS) && + (iter->op.op != CEPH_OSD_OP_ASSERT_SRC_VERSION) && + (iter->op.op != CEPH_OSD_OP_SETALLOCHINT) && + (iter->op.op != CEPH_OSD_OP_WRITEFULL) && + (iter->op.op != CEPH_OSD_OP_ROLLBACK) && + (iter->op.op != CEPH_OSD_OP_CREATE) && + (iter->op.op != CEPH_OSD_OP_DELETE) && + (iter->op.op != CEPH_OSD_OP_SETXATTR) && + (iter->op.op != CEPH_OSD_OP_RMXATTR) && + (iter->op.op != CEPH_OSD_OP_STARTSYNC) && + (iter->op.op != CEPH_OSD_OP_COPY_GET_CLASSIC) && + (iter->op.op != CEPH_OSD_OP_COPY_GET) && + (iter->op.op != CEPH_OSD_OP_COPY_FROM)) { + op->set_promote(); + } + } + } + switch (iter->op.op) { case CEPH_OSD_OP_CALL: { @@ -8722,23 +8756,6 @@ int OSD::init_op_flags(OpRequestRef& op) } break; - case CEPH_OSD_OP_WRITE: - case CEPH_OSD_OP_ZERO: - case CEPH_OSD_OP_TRUNCATE: - // always force promotion for object overwrites on a ec base pool - { - int64_t poolid = m->get_pg().pool(); - const pg_pool_t *pool = osdmap->get_pg_pool(poolid); - if (pool->is_tier()) { - const pg_pool_t *base_pool = osdmap->get_pg_pool(pool->tier_of); - assert(base_pool); - if (base_pool->is_erasure()) { - op->set_promote(); - } - } - } - break; - case CEPH_OSD_OP_READ: case CEPH_OSD_OP_SYNC_READ: case CEPH_OSD_OP_SPARSE_READ: