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();
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
} 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;
// 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();
// 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();
// 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();
// 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();
// 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());
}
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();