Skip to content

Commit

Permalink
OSD: OSDMapRef access by multiple threads is unsafe
Browse files Browse the repository at this point in the history
we update OSD::osdmap in OSD::_committed_osd_maps() which is executed
by objectstore's finisher thread. while PG::sched_scrub() is called
by OSD's sharded work queue's worker thread.and we push the osdmap
updates down to PGs OSD::consume_map() which is in turn called by
OSD::_committed_osd_maps() where osdmap is updated. so it does not big
deal if we are checking a stale CEPH_OSDMAP_NODEEP_SCRUB flag.
also this flag will be updated with the latest osdmap very soon.

Signed-off-by: Kefu Chai <kchai@redhat.com>
Signed-off-by: Zengran Zhang <zhangzengran@sangfor.com.cn>
  • Loading branch information
Zengran Zhang committed Apr 3, 2019
1 parent d656ef0 commit 454c4cb
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 3 deletions.
5 changes: 4 additions & 1 deletion src/osd/OSD.cc
Expand Up @@ -469,7 +469,7 @@ void OSDService::shutdown()
f->stop();
}

osdmap = OSDMapRef();
publish_map(OSDMapRef());
next_osdmap = OSDMapRef();
}

Expand Down Expand Up @@ -3954,7 +3954,10 @@ int OSD::shutdown()
monc->shutdown();
osd_lock.Unlock();

map_lock.get_write();
osdmap = OSDMapRef();
map_lock.put_write();

for (auto s : shards) {
std::lock_guard l(s->osdmap_lock);
s->shard_osdmap = OSDMapRef();
Expand Down
4 changes: 2 additions & 2 deletions src/osd/PG.cc
Expand Up @@ -4298,7 +4298,7 @@ bool PG::sched_scrub()
time_for_deep = (time_for_deep || deep_coin_flip);

//NODEEP_SCRUB so ignore time initiated deep-scrub
if (osd->osd->get_osdmap()->test_flag(CEPH_OSDMAP_NODEEP_SCRUB) ||
if (get_osdmap()->test_flag(CEPH_OSDMAP_NODEEP_SCRUB) ||
pool.info.has_flag(pg_pool_t::FLAG_NODEEP_SCRUB)) {
time_for_deep = false;
nodeep_scrub = true;
Expand All @@ -4308,7 +4308,7 @@ bool PG::sched_scrub()
ceph_assert(!scrubber.must_deep_scrub);

//NOSCRUB so skip regular scrubs
if ((osd->osd->get_osdmap()->test_flag(CEPH_OSDMAP_NOSCRUB) ||
if ((get_osdmap()->test_flag(CEPH_OSDMAP_NOSCRUB) ||
pool.info.has_flag(pg_pool_t::FLAG_NOSCRUB)) && !time_for_deep) {
if (scrubber.reserved) {
// cancel scrub if it is still in scheduling,
Expand Down

0 comments on commit 454c4cb

Please sign in to comment.