]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: force promote for ops which ec base pool can't handle 5776/head
authorZhiqiang Wang <zhiqiang.wang@intel.com>
Thu, 3 Sep 2015 05:36:06 +0000 (13:36 +0800)
committerZhiqiang Wang <zhiqiang.wang@intel.com>
Tue, 8 Sep 2015 07:32:40 +0000 (15:32 +0800)
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>
src/osd/OSD.cc

index a98db3401d04699c5907f7612d3bce995438f56b..e22960bc376498c66bee3e4d1f5713f0c6d63ae3 100644 (file)
@@ -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: