Skip to content

Commit

Permalink
osd: force promote for ops which ec base pool can't handle
Browse files Browse the repository at this point in the history
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 <zhiqiang.wang@intel.com>
  • Loading branch information
wonzhq committed Sep 3, 2015
1 parent b199c49 commit 1ca6ef8
Showing 1 changed file with 30 additions and 17 deletions.
47 changes: 30 additions & 17 deletions src/osd/OSD.cc
Expand Up @@ -8647,6 +8647,36 @@ 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->is_tier()) {
const pg_pool_t *base_pool = osdmap->get_pg_pool(pool->tier_of);
assert(base_pool);
if (iter->op.op == CEPH_OSD_OP_SYNC_READ ||
iter->op.op == CEPH_OSD_OP_MAPEXT ||
iter->op.op == CEPH_OSD_OP_SPARSE_READ ||
iter->op.op == CEPH_OSD_OP_WRITE ||
iter->op.op == CEPH_OSD_OP_ZERO ||
iter->op.op == CEPH_OSD_OP_TRUNCATE ||
iter->op.op == CEPH_OSD_OP_CLONERANGE ||
iter->op.op == CEPH_OSD_OP_TMAPGET ||
iter->op.op == CEPH_OSD_OP_TMAPPUT ||
iter->op.op == CEPH_OSD_OP_TMAPUP) {
if (base_pool->require_rollback()) {
op->set_promote();
}
} else if (iter->op.op == CEPH_OSD_OP_OMAPSETVALS ||
iter->op.op == CEPH_OSD_OP_OMAPSETHEADER ||
iter->op.op == CEPH_OSD_OP_OMAPCLEAR ||
iter->op.op == CEPH_OSD_OP_OMAPRMKEYS ||
iter->op.op == CEPH_OSD_OP_CALL) {
if (!base_pool->supports_omap()) {
op->set_promote();
}
}
}

switch (iter->op.op) {
case CEPH_OSD_OP_CALL:
{
Expand Down Expand Up @@ -8722,23 +8752,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:
Expand Down

0 comments on commit 1ca6ef8

Please sign in to comment.