]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix versioned bucket data sync fail when upload is busy 16163/head
authorlvshuhua <lvshuhua@cmss.chinamobile.com>
Wed, 7 Dec 2016 07:47:47 +0000 (15:47 +0800)
committerNathan Cutler <ncutler@suse.com>
Thu, 6 Jul 2017 09:26:26 +0000 (11:26 +0200)
Fixes: http://tracker.ceph.com/issues/18208
Signed-off-by: lvshuhua <lvshuhua@cmss.chinamobile.com>
(cherry picked from commit ce7d00ac1642d84c1d9111156a544c37801c5adf)

src/rgw/rgw_data_sync.cc

index be9e25d4751339cdef4c40f3b6f5f662dec6fe27..af0b1726e218c3a938217fcc59cd6e109447aeef 100644 (file)
@@ -2436,7 +2436,7 @@ class RGWBucketShardIncrementalSyncCR : public RGWCoroutine {
   boost::intrusive_ptr<RGWContinuousLeaseCR> lease_cr;
   list<rgw_bi_log_entry> list_result;
   list<rgw_bi_log_entry>::iterator entries_iter;
-  map<string, pair<real_time, RGWModifyOp> > squash_map;
+  map<pair<string, string>, pair<real_time, RGWModifyOp> > squash_map;
   rgw_bucket_shard_inc_sync_marker& inc_marker;
   rgw_obj_key key;
   rgw_bi_log_entry *entry{nullptr};
@@ -2496,11 +2496,8 @@ int RGWBucketShardIncrementalSyncCR::operate()
         if (e.state != CLS_RGW_STATE_COMPLETE) {
           continue;
         }
-        auto& squash_entry = squash_map[e.object];
-        if (squash_entry.first == e.timestamp &&
-            e.op == CLS_RGW_OP_DEL) {
-          squash_entry.second = e.op;
-        } else if (squash_entry.first < e.timestamp) {
+        auto& squash_entry = squash_map[make_pair(e.object, e.instance)];
+        if (squash_entry.first <= e.timestamp) {
           squash_entry = make_pair<>(e.timestamp, e.op);
         }
       }
@@ -2553,7 +2550,7 @@ int RGWBucketShardIncrementalSyncCR::operate()
           marker_tracker.try_update_high_marker(cur_id, 0, entry->timestamp);
           continue;
         }
-        if (make_pair<>(entry->timestamp, entry->op) != squash_map[entry->object]) {
+        if (make_pair<>(entry->timestamp, entry->op) != squash_map[make_pair(entry->object, entry->instance)]) {
           set_status() << "squashed operation, skipping";
           ldout(sync_env->cct, 20) << "[inc sync] skipping object: "
               << bucket_shard_str{bs} << "/" << key << ": squashed operation" << dendl;