]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: add bool supports_omap() in pg_pool_t.
authorJianpeng Ma <jianpeng.ma@intel.com>
Tue, 9 Jun 2015 06:14:31 +0000 (14:14 +0800)
committerJianpeng Ma <jianpeng.ma@intel.com>
Tue, 9 Jun 2015 06:14:31 +0000 (14:14 +0800)
Using this func judge pg whether support omap operations.

Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
src/osd/ReplicatedPG.cc
src/osd/osd_types.h

index 7bcce73ecaa907e3850c655b958fe08a9c8916d8..9b3f2b8dc835cfa68cd5b345d6df30779fb21c12 100644 (file)
@@ -4722,7 +4722,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        tracepoint(osd, do_osd_op_pre_omapgetkeys, soid.oid.name.c_str(), soid.snap.val, start_after.c_str(), max_return);
        set<string> out_set;
 
-       if (!pool.info.require_rollback()) {
+       if (pool.info.supports_omap()) {
          ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator(
            coll, soid
            );
@@ -4759,7 +4759,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        tracepoint(osd, do_osd_op_pre_omapgetvals, soid.oid.name.c_str(), soid.snap.val, start_after.c_str(), max_return, filter_prefix.c_str());
        map<string, bufferlist> out_set;
 
-       if (!pool.info.require_rollback()) {
+       if (pool.info.supports_omap()) {
          ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator(
            coll, soid
            );
@@ -4785,7 +4785,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
 
     case CEPH_OSD_OP_OMAPGETHEADER:
       tracepoint(osd, do_osd_op_pre_omapgetheader, soid.oid.name.c_str(), soid.snap.val);
-      if (pool.info.require_rollback()) {
+      if (!pool.info.supports_omap()) {
        // return empty header
        break;
       }
@@ -4811,7 +4811,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        }
        tracepoint(osd, do_osd_op_pre_omapgetvalsbykeys, soid.oid.name.c_str(), soid.snap.val, list_entries(keys_to_get).c_str());
        map<string, bufferlist> out;
-       if (!pool.info.require_rollback()) {
+       if (pool.info.supports_omap()) {
          osd->store->omap_get_values(coll, soid, keys_to_get, &out);
        } // else return empty omap entries
        ::encode(out, osd_op.outdata);
@@ -4841,7 +4841,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        
        map<string, bufferlist> out;
 
-       if (!pool.info.require_rollback()) {
+       if (pool.info.supports_omap()) {
          set<string> to_get;
          for (map<string, pair<bufferlist, int> >::iterator i = assertions.begin();
               i != assertions.end();
@@ -4895,7 +4895,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
 
       // OMAP Write ops
     case CEPH_OSD_OP_OMAPSETVALS:
-      if (pool.info.require_rollback()) {
+      if (!pool.info.supports_omap()) {
        result = -EOPNOTSUPP;
        tracepoint(osd, do_osd_op_pre_omapsetvals, soid.oid.name.c_str(), soid.snap.val, "???");
        break;
@@ -4931,7 +4931,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
 
     case CEPH_OSD_OP_OMAPSETHEADER:
       tracepoint(osd, do_osd_op_pre_omapsetheader, soid.oid.name.c_str(), soid.snap.val);
-      if (pool.info.require_rollback()) {
+      if (!pool.info.supports_omap()) {
        result = -EOPNOTSUPP;
        break;
       }
@@ -4952,7 +4952,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
 
     case CEPH_OSD_OP_OMAPCLEAR:
       tracepoint(osd, do_osd_op_pre_omapclear, soid.oid.name.c_str(), soid.snap.val);
-      if (pool.info.require_rollback()) {
+      if (!pool.info.supports_omap()) {
        result = -EOPNOTSUPP;
        break;
       }
@@ -4972,7 +4972,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
       break;
 
     case CEPH_OSD_OP_OMAPRMKEYS:
-      if (pool.info.require_rollback()) {
+      if (!pool.info.supports_omap()) {
        result = -EOPNOTSUPP;
        tracepoint(osd, do_osd_op_pre_omaprmkeys, soid.oid.name.c_str(), soid.snap.val, "???");
        break;
@@ -6087,7 +6087,7 @@ int ReplicatedPG::fill_in_copy_get(
 
   // omap
   uint32_t omap_keys = 0;
-  if (pool.info.require_rollback()) {
+  if (!pool.info.supports_omap()) {
     cursor.omap_complete = true;
   } else {
     if (left > 0 && !cursor.omap_complete) {
@@ -6222,7 +6222,7 @@ void ReplicatedPG::_copy_some(ObjectContextRef obc, CopyOpRef cop)
   }
 
   uint32_t copyget_flags = 0;
-  if (pool.info.require_rollback())
+  if (!pool.info.supports_omap())
    copyget_flags |= CEPH_OSD_COPY_GET_FLAG_NOTSUPP_OMAP;
 
   op.copy_get(&cop->cursor, get_copy_chunk_size(), copyget_flags,
@@ -6271,7 +6271,7 @@ void ReplicatedPG::process_copy_chunk(hobject_t oid, ceph_tid_t tid, int r)
   if (cop->omap_data.length() || cop->omap_header.length())
     cop->results.has_omap = true;
 
-  if (r >= 0 && pool.info.require_rollback() &&
+  if (r >= 0 && !pool.info.supports_omap() &&
       (cop->omap_data.length() || cop->omap_header.length())) {
     r = -EOPNOTSUPP;
   }
@@ -6451,7 +6451,7 @@ void ReplicatedPG::_write_copy_chunk(CopyOpRef cop, PGBackend::PGTransaction *t)
       cop->dest_obj_fadvise_flags);
     cop->data.clear();
   }
-  if (!pool.info.require_rollback()) {
+  if (pool.info.supports_omap()) {
     if (!cop->temp_cursor.omap_complete) {
       if (cop->omap_header.length()) {
        cop->results.omap_digest =
@@ -10656,7 +10656,7 @@ bool ReplicatedPG::agent_work(int start_max)
     }
 
     // be careful flushing omap to an EC pool.
-    if (base_pool->is_erasure() &&
+    if (!base_pool->supports_omap() &&
        obc->obs.oi.test_flag(object_info_t::FLAG_OMAP)) {
       dout(20) << __func__ << " skip (omap to EC) " << obc->obs.oi << dendl;
       osd->logger->inc(l_osd_agent_skip);
@@ -10994,7 +10994,7 @@ bool ReplicatedPG::agent_choose_mode(bool restart, OpRequestRef op)
   // also exclude omap objects if ec backing pool
   const pg_pool_t *base_pool = get_osdmap()->get_pg_pool(pool.info.tier_of);
   assert(base_pool);
-  if (base_pool->is_erasure())
+  if (!base_pool->supports_omap())
     unflushable += info.stats.stats.sum.num_objects_omap;
 
   uint64_t num_user_objects = info.stats.stats.sum.num_objects;
@@ -11009,7 +11009,7 @@ bool ReplicatedPG::agent_choose_mode(bool restart, OpRequestRef op)
 
   // also reduce the num_dirty by num_objects_omap
   int64_t num_dirty = info.stats.stats.sum.num_objects_dirty;
-  if (base_pool->is_erasure()) {
+  if (!base_pool->supports_omap()) {
     if (num_dirty > info.stats.stats.sum.num_objects_omap)
       num_dirty -= info.stats.stats.sum.num_objects_omap;
     else
index 09d67f210f436ce62ae398a4ca0a52048a15c2b3..f70c6bc29a5fe475e5a59df0e2503b90ad8ae288 100644 (file)
@@ -1092,6 +1092,10 @@ public:
   bool is_replicated()   const { return get_type() == TYPE_REPLICATED; }
   bool is_erasure() const { return get_type() == TYPE_ERASURE; }
 
+  bool supports_omap() const {
+    return !(get_type() == TYPE_ERASURE || has_flag(FLAG_DEBUG_FAKE_EC_POOL));
+  }
+
   bool requires_aligned_append() const { return is_erasure(); }
   uint64_t required_alignment() const { return stripe_width; }