]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: decrement old chunk's reference count if the chunk has a reference.
authormyoungwon oh <omwmw@sk.com>
Wed, 15 Aug 2018 11:36:50 +0000 (20:36 +0900)
committermyoungwon oh <omwmw@sk.com>
Fri, 7 Sep 2018 12:53:41 +0000 (21:53 +0900)
Signed-off-by: Myoungwon Oh <omwmw@sk.com>
src/objclass/class_api.cc
src/osd/PrimaryLogPG.cc
src/osd/osd_types.cc
src/test/librados/tier.cc

index 8d0776c389eac3b04f0c73d1af4545d0c13d0188..c3d0a122cf8bc6653de97e040f591027804d619e 100644 (file)
@@ -737,7 +737,7 @@ int cls_cxx_chunk_write_and_set(cls_method_context_t hctx, int ofs, int len,
                   int set_len)
 {
   PrimaryLogPG::OpContext **pctx = (PrimaryLogPG::OpContext **)hctx;
-  char cname[] = "refcount";
+  char cname[] = "cas";
   char method[] = "chunk_set";
 
   vector<OSDOp> ops(2);
index 23240db8f726507b1f98a8744a4c5c115cf51790..f4012fb0c3c164a732c7be640a1731327e09e776 100644 (file)
@@ -2610,11 +2610,13 @@ int PrimaryLogPG::do_manifest_flush(OpRequestRef op, ObjectContextRef obc, Flush
       return -ENODATA;
     }
 
+    unsigned flags = CEPH_OSD_FLAG_IGNORE_CACHE | CEPH_OSD_FLAG_IGNORE_OVERLAY |
+                    CEPH_OSD_FLAG_RWORDERED;
     tgt_length = chunk_data.length();
-    pg_pool_t::fingerprint_t fp_t = pool.info.get_fingerprint_type();
+    pg_pool_t::fingerprint_t fp_algo_t = pool.info.get_fingerprint_type();
     if (iter->second.has_reference() &&
-       fp_t != pg_pool_t::TYPE_FINGERPRINT_NONE) {
-      switch (fp_t) {
+       fp_algo_t != pg_pool_t::TYPE_FINGERPRINT_NONE) {
+      switch (fp_algo_t) {
        case pg_pool_t::TYPE_FINGERPRINT_SHA1:
          {
            boost::optional<sha1_digest_info_t> fp_t = chunk_data.sha1();
@@ -2623,6 +2625,19 @@ int PrimaryLogPG::do_manifest_flush(OpRequestRef op, ObjectContextRef obc, Flush
            if (fp_t != boost::none) {
              fp_oid = fp_t.get().to_str();
            }
+           if (fp_oid != tgt_soid.oid) {
+             // decrement old chunk's reference count 
+             ObjectOperation dec_op;
+             cls_chunk_refcount_put_op put_call;
+             ::encode(put_call, in);                             
+             dec_op.call("refcount", "chunk_put", in);         
+             // we don't care dec_op's completion. scrub for dedup will fix this.
+             tid = osd->objecter->mutate(
+               tgt_soid.oid, oloc, dec_op, snapc,
+               ceph::real_clock::from_ceph_timespec(obc->obs.oi.mtime),
+               flags, NULL);
+             in.clear();
+           }
            tgt_soid.oid = fp_oid;
            iter->second.oid = tgt_soid;
            // add data op
@@ -2642,8 +2657,6 @@ int PrimaryLogPG::do_manifest_flush(OpRequestRef op, ObjectContextRef obc, Flush
     } else {
       obj_op.add_data(CEPH_OSD_OP_WRITE, tgt_offset, tgt_length, chunk_data);
     }
-    unsigned flags = CEPH_OSD_FLAG_IGNORE_CACHE | CEPH_OSD_FLAG_IGNORE_OVERLAY |
-                    CEPH_OSD_FLAG_RWORDERED ;
 
     C_ManifestFlush *fin = new C_ManifestFlush(this, soid, get_last_peering_reset());
     fin->offset = iter->first;
index 407d259dc21bef3046338bec8ca2e5316e45dae9..e2b2d0fa78acdb842c5cd34bf6e805b5915451ab 100644 (file)
@@ -1960,9 +1960,6 @@ ostream& operator<<(ostream& out, const pg_pool_t& p)
       out << it->first;
     }
   }
-  if (p.get_fingerprint_type() != pg_pool_t::TYPE_FINGERPRINT_NONE) {
-    out << " fingerprint_algorighm " << p.get_fingerprint_name();
-  }
   return out;
 }
 
index 0ad801ff6bb329ed64830ff3087c9b114383adb3..d872f634ac44c095ee69cd7ee25442c778248bfb 100644 (file)
@@ -3231,7 +3231,7 @@ TEST_F(LibRadosTwoPoolsPP, ManifestRefRead) {
   // redirect's refcount 
   {
     bufferlist in, out;
-    cache_ioctx.exec("bar", "refcount", "chunk_read", in, out);
+    cache_ioctx.exec("bar", "cas", "chunk_read", in, out);
     cls_chunk_refcount_read_ret read_ret;
     try {
       auto iter = out.cbegin();
@@ -3244,7 +3244,7 @@ TEST_F(LibRadosTwoPoolsPP, ManifestRefRead) {
   // chunk's refcount 
   {
     bufferlist in, out;
-    cache_ioctx.exec("bar-chunk", "refcount", "chunk_read", in, out);
+    cache_ioctx.exec("bar-chunk", "cas", "chunk_read", in, out);
     cls_chunk_refcount_read_ret read_ret;
     try {
       auto iter = out.cbegin();
@@ -3329,7 +3329,7 @@ TEST_F(LibRadosTwoPoolsPP, ManifestUnset) {
   // redirect's refcount 
   {
     bufferlist in, out;
-    cache_ioctx.exec("bar", "refcount", "chunk_read", in, out);
+    cache_ioctx.exec("bar", "cas", "chunk_read", in, out);
     cls_chunk_refcount_read_ret read_ret;
     try {
       auto iter = out.cbegin();
@@ -3342,7 +3342,7 @@ TEST_F(LibRadosTwoPoolsPP, ManifestUnset) {
   // chunk's refcount 
   {
     bufferlist in, out;
-    cache_ioctx.exec("bar-chunk", "refcount", "chunk_read", in, out);
+    cache_ioctx.exec("bar-chunk", "cas", "chunk_read", in, out);
     cls_chunk_refcount_read_ret read_ret;
     try {
       auto iter = out.cbegin();
@@ -3377,13 +3377,13 @@ TEST_F(LibRadosTwoPoolsPP, ManifestUnset) {
   // redirect's refcount 
   {
     bufferlist in, out;
-    cache_ioctx.exec("bar", "refcount", "chunk_read", in, out);
+    cache_ioctx.exec("bar", "cas", "chunk_read", in, out);
     ASSERT_EQ(0U, out.length());
   }
   // chunk's refcount 
   {
     bufferlist in, out;
-    cache_ioctx.exec("bar-chunk", "refcount", "chunk_read", in, out);
+    cache_ioctx.exec("bar-chunk", "cas", "chunk_read", in, out);
     ASSERT_EQ(0, out.length());
   }
 
@@ -3513,7 +3513,7 @@ TEST_F(LibRadosTwoPoolsPP, ManifestDedupRefRead) {
     sha1_gen.Update((const unsigned char *)"There hi", size);
     sha1_gen.Final(fingerprint);
     buf_to_hex(fingerprint, CEPH_CRYPTO_SHA1_DIGESTSIZE, p_str);
-    cache_ioctx.exec(p_str, "refcount", "chunk_read", in, out);
+    cache_ioctx.exec(p_str, "cas", "chunk_read", in, out);
     cls_chunk_refcount_read_ret read_ret;
     try {
       auto iter = out.cbegin();