]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: merge pg_temp_wanted before sending them 37910/head
authorKefu Chai <kchai@redhat.com>
Sun, 1 Nov 2020 03:23:13 +0000 (11:23 +0800)
committerKefu Chai <kchai@redhat.com>
Sun, 1 Nov 2020 03:55:42 +0000 (11:55 +0800)
there is chance that new pg_temp_wanted is added when we are sending
them in ShardServices::send_pg_temp(), but the pg temp are already
collected into the messages before seastar::parallel_for_each(). so,
we cannot move all elements from pg_temp_wanted to pg_temp_pending after
sending the messages, that'd also move the unsent pg temps to
pg_temp_pending as well. so we have to do this before do the async call,

this issue was root caused by Xuehan Xu <xxhdx1985126@gmail.com>.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/osd/shard_services.cc

index 4e393df8446186b3d289b20571dc285d90b87b8e..8c2cfc41543e2e4a329fedbcdb21bdd24be28c75 100644 (file)
@@ -200,6 +200,8 @@ seastar::future<> ShardServices::send_pg_temp()
     }
     m->pg_temp.emplace(pgid, pg_temp.acting);
   }
+  pg_temp_pending.merge(pg_temp_wanted);
+  pg_temp_wanted.clear();
   return seastar::parallel_for_each(std::begin(ms), std::end(ms),
     [this](auto m) {
       if (m) {
@@ -207,9 +209,6 @@ seastar::future<> ShardServices::send_pg_temp()
       } else {
        return seastar::now();
       }
-    }).then([this] {
-      pg_temp_pending.merge(pg_temp_wanted);
-      pg_temp_wanted.clear();
     });
 }