]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: force promote for object overwrites on a ec base pool
authorZhiqiang Wang <zhiqiang.wang@intel.com>
Wed, 27 May 2015 08:20:36 +0000 (16:20 +0800)
committerSamuel Just <sjust@redhat.com>
Tue, 18 Aug 2015 18:25:23 +0000 (11:25 -0700)
When doing object overwrites on the ec base pool, the write op can't be
proxied. Always force promotion in this case.

Signed-off-by: Zhiqiang Wang <zhiqiang.wang@intel.com>
src/osd/OSD.cc

index f446cd9e0335cf44fc9861f7d6f25d8070e972f3..40f4fa3951cea3ec9ecfeb47a87922e0740168d1 100644 (file)
@@ -8651,6 +8651,24 @@ int OSD::init_op_flags(OpRequestRef& op)
       if (m->ops.size() == 1) {
        op->set_skip_promote();
       }
+      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;
 
     default:
       break;