]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: mark ObjectCleanRegions dirty for related operations
authorlishuhao <lishuhao@unitedstack.com>
Sun, 14 Apr 2019 11:48:28 +0000 (19:48 +0800)
committerletterwuyu <lishuhao@unitedstack.com>
Mon, 6 May 2019 12:17:42 +0000 (20:17 +0800)
Signed-off-by: Ning Yao <yaoning@unitedstack.com>
Signed-off-by: lishuhao <lishuhao@unitedstack.com>
src/osd/PrimaryLogPG.cc
src/osd/PrimaryLogPG.h

index 3d6dfb9e6e3f96bff6c640ee382e32c50562d063..62f7512e2424217404a27fd17f234459329abdae 100644 (file)
@@ -6320,6 +6320,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
              trim.insert(op.extent.truncate_size,
                oi.size - op.extent.truncate_size);
              ctx->modified_ranges.union_of(trim);
+             ctx->clean_regions.mark_data_region_dirty(op.extent.truncate_size, oi.size - op.extent.truncate_size);
            }
            if (op.extent.truncate_size != oi.size) {
               truncate_update_size_and_usage(ctx->delta_stats,
@@ -6367,7 +6368,8 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
         }
        write_update_size_and_usage(ctx->delta_stats, oi, ctx->modified_ranges,
                                    op.extent.offset, op.extent.length);
-
+       ctx->clean_regions.mark_data_region_dirty(op.extent.offset, op.extent.length);
+       dout(10) << "clean_regions modified" << ctx->clean_regions << dendl;
       }
       break;
       
@@ -6406,6 +6408,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
 
        write_update_size_and_usage(ctx->delta_stats, oi, ctx->modified_ranges,
            0, op.extent.length, true);
+       ctx->clean_regions.mark_data_region_dirty(0, op.extent.length);
       }
       break;
 
@@ -6441,6 +6444,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
          interval_set<uint64_t> ch;
          ch.insert(op.extent.offset, op.extent.length);
          ctx->modified_ranges.union_of(ch);
+         ctx->clean_regions.mark_data_region_dirty(op.extent.offset, op.extent.length);
          ctx->delta_stats.num_wr++;
          oi.clear_data_digest();
        } else {
@@ -6520,7 +6524,10 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
          interval_set<uint64_t> trim;
          trim.insert(op.extent.offset, oi.size-op.extent.offset);
          ctx->modified_ranges.union_of(trim);
-       }
+         ctx->clean_regions.mark_data_region_dirty(op.extent.offset, oi.size - op.extent.offset);
+       } else if (oi.size < op.extent.offset) {
+          ctx->clean_regions.mark_data_region_dirty(oi.size, op.extent.offset - oi.size);
+        }
        if (op.extent.offset != oi.size) {
           truncate_update_size_and_usage(ctx->delta_stats,
                                          oi,
@@ -6762,11 +6769,15 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
          oi.manifest.redirect_target = target;
          oi.manifest.type = object_manifest_t::TYPE_REDIRECT;
          t->truncate(soid, 0);
+          ctx->clean_regions.mark_data_region_dirty(0, oi.size);
          if (oi.is_omap() && pool.info.supports_omap()) {
            t->omap_clear(soid);
            obs.oi.clear_omap_digest();
            obs.oi.clear_flag(object_info_t::FLAG_OMAP);
+            ctx->clean_regions.mark_omap_dirty();
          }
+          write_update_size_and_usage(ctx->delta_stats, oi, ctx->modified_ranges,
+           0, oi.size, false);
          ctx->delta_stats.num_bytes -= oi.size;
          oi.size = 0;
          oi.new_object();
@@ -7421,6 +7432,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
          }
        }
        t->omap_setkeys(soid, to_set_bl);
+       ctx->clean_regions.mark_omap_dirty();
        ctx->delta_stats.num_wr++;
         ctx->delta_stats.num_wr_kb += shift_round_up(to_set_bl.length(), 10);
       }
@@ -7438,6 +7450,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
       {
        maybe_create_new_object(ctx);
        t->omap_setheader(soid, osd_op.indata);
+       ctx->clean_regions.mark_omap_dirty();
        ctx->delta_stats.num_wr++;
       }
       obs.oi.set_flag(object_info_t::FLAG_OMAP);
@@ -7458,6 +7471,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        }
        if (oi.is_omap()) {
          t->omap_clear(soid);
+         ctx->clean_regions.mark_omap_dirty();
          ctx->delta_stats.num_wr++;
          obs.oi.clear_omap_digest();
          obs.oi.clear_flag(object_info_t::FLAG_OMAP);
@@ -7489,6 +7503,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        }
        tracepoint(osd, do_osd_op_pre_omaprmkeys, soid.oid.name.c_str(), soid.snap.val);
        t->omap_rmkeys(soid, to_rm_bl);
+       ctx->clean_regions.mark_omap_dirty();
        ctx->delta_stats.num_wr++;
       }
       obs.oi.clear_omap_digest();
@@ -7693,8 +7708,10 @@ inline int PrimaryLogPG::_delete_oid(
     interval_set<uint64_t> ch;
     ch.insert(0, oi.size);
     ctx->modified_ranges.union_of(ch);
+    ctx->clean_regions.mark_data_region_dirty(0, oi.size);
   }
 
+  ctx->clean_regions.mark_omap_dirty();
   ctx->delta_stats.num_wr++;
   if (soid.is_snap()) {
     ceph_assert(ctx->obc->ssc->snapset.clone_overlap.count(soid.snap));
@@ -7870,6 +7887,8 @@ int PrimaryLogPG::_rollback_to(OpContext *ctx, ceph_osd_op& op)
       maybe_create_new_object(ctx, true);
       ctx->delta_stats.num_bytes -= obs.oi.size;
       ctx->delta_stats.num_bytes += rollback_to->obs.oi.size;
+      ctx->clean_regions.mark_data_region_dirty(0, std::max(obs.oi.size, rollback_to->obs.oi.size));
+      ctx->clean_regions.mark_omap_dirty();
       obs.oi.size = rollback_to->obs.oi.size;
       if (rollback_to->obs.oi.is_data_digest())
        obs.oi.set_data_digest(rollback_to->obs.oi.data_digest);
@@ -8372,6 +8391,9 @@ void PrimaryLogPG::finish_ctx(OpContext *ctx, int log_op_type)
                                    ctx->obs->oi.version,
                                    ctx->user_at_version, ctx->reqid,
                                    ctx->mtime, 0));
+  ctx->log.back().clean_regions = ctx->clean_regions;
+  dout(20) << __func__ << " object " << soid <<  " marks clean_regions " << ctx->log.back().clean_regions << dendl;
+
   if (soid.snap < CEPH_NOSNAP) {
     switch (log_op_type) {
     case pg_log_entry_t::MODIFY:
@@ -9211,6 +9233,7 @@ void PrimaryLogPG::process_copy_chunk_manifest(hobject_t oid, ceph_tid_t tid, in
                                  p.second->cursor.data_offset, sub_chunk.outdata.length());
       obs.oi.manifest.chunk_map[p.second->cursor.data_offset].clear_flag(chunk_info_t::FLAG_DIRTY); 
       obs.oi.manifest.chunk_map[p.second->cursor.data_offset].clear_flag(chunk_info_t::FLAG_MISSING); 
+      ctx->clean_regions.mark_data_region_dirty(p.second->cursor.data_offset, sub_chunk.outdata.length());
       sub_chunk.outdata.clear();
     }
     obs.oi.clear_data_digest();
@@ -9393,6 +9416,7 @@ void PrimaryLogPG::finish_copyfrom(CopyFromCallback *cb)
   if (obs.oi.size > 0)
     ch.insert(0, obs.oi.size);
   ctx->modified_ranges.union_of(ch);
+  ctx->clean_regions.mark_data_region_dirty(0, std::max(obs.oi.size, cb->get_data_size()));
 
   if (cb->get_data_size() != obs.oi.size) {
     ctx->delta_stats.num_bytes -= obs.oi.size;
@@ -9563,11 +9587,15 @@ void PrimaryLogPG::finish_promote(int r, CopyResults *results,
     } else {
       tctx->new_obs.oi.clear_data_digest();
     }
+    if (results->object_size)
+      tctx->clean_regions.mark_data_region_dirty(0, results->object_size);
     if (results->is_omap_digest()) {
       tctx->new_obs.oi.set_omap_digest(results->omap_digest);
     } else {
       tctx->new_obs.oi.clear_omap_digest();
     }
+    if (results->has_omap)
+        tctx->clean_regions.mark_omap_dirty();
     tctx->new_obs.oi.truncate_seq = results->truncate_seq;
     tctx->new_obs.oi.truncate_size = results->truncate_size;
 
@@ -10110,6 +10138,7 @@ int PrimaryLogPG::try_flush_mark_clean(FlushOpRef fop)
       t->omap_clear(oid);
       ctx->new_obs.oi.clear_omap_digest();
       ctx->new_obs.oi.clear_flag(object_info_t::FLAG_OMAP);
+      ctx->clean_regions.mark_omap_dirty();
     }
     if (obc->obs.oi.size == chunks_size) { 
       t->truncate(oid, 0);
@@ -10119,6 +10148,7 @@ int PrimaryLogPG::try_flush_mark_clean(FlushOpRef fop)
       truncate_update_size_and_usage(ctx->delta_stats,
                                     ctx->new_obs.oi,
                                     0);
+      ctx->clean_regions.mark_data_region_dirty(0, ctx->new_obs.oi.size);
       ctx->new_obs.oi.new_object();
       for (auto &p : ctx->new_obs.oi.manifest.chunk_map) {
        p.second.clear_flag(chunk_info_t::FLAG_DIRTY);
@@ -13536,6 +13566,9 @@ void PrimaryLogPG::hit_set_persist()
   ctx->op_t->create(oid);
   if (bl.length()) {
     ctx->op_t->write(oid, 0, bl.length(), bl, 0);
+    write_update_size_and_usage(ctx->delta_stats, obc->obs.oi, ctx->modified_ranges,
+        0, bl.length());
+    ctx->clean_regions.mark_data_region_dirty(0, bl.length());
   }
   map <string, bufferlist> attrs;
   attrs[OI_ATTR].claim(boi);
@@ -13552,6 +13585,7 @@ void PrimaryLogPG::hit_set_persist()
       ctx->mtime,
       0)
     );
+  ctx->log.back().clean_regions = ctx->clean_regions;
 
   hit_set_trim(ctx, max);
 
index 5942be6c765073f90ff1736a529349aa799e22ee..b2fecb679b8396f658ec46aac7c298e3be5da065 100644 (file)
@@ -573,6 +573,7 @@ public:
     bool ignore_cache;    ///< true if IGNORE_CACHE flag is set
     bool ignore_log_op_stats;  // don't log op stats
     bool update_log_only; ///< this is a write that returned an error - just record in pg log for dup detection
+    ObjectCleanRegions clean_regions;
 
     // side effects
     list<pair<watch_info_t,bool> > watch_connects; ///< new watch + will_ping flag