From: myoungwon oh Date: Wed, 15 Aug 2018 11:36:50 +0000 (+0900) Subject: osd: decrement old chunk's reference count if the chunk has a reference. X-Git-Tag: v14.0.1~340^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=917062df0896a2cdbe83319a9d74a14972886500;p=ceph.git osd: decrement old chunk's reference count if the chunk has a reference. Signed-off-by: Myoungwon Oh --- diff --git a/src/objclass/class_api.cc b/src/objclass/class_api.cc index 8d0776c389ea..c3d0a122cf8b 100644 --- a/src/objclass/class_api.cc +++ b/src/objclass/class_api.cc @@ -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 ops(2); diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 23240db8f726..f4012fb0c3c1 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -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 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; diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 407d259dc21b..e2b2d0fa78ac 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -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; } diff --git a/src/test/librados/tier.cc b/src/test/librados/tier.cc index 0ad801ff6bb3..d872f634ac44 100644 --- a/src/test/librados/tier.cc +++ b/src/test/librados/tier.cc @@ -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();