Skip to content

Commit

Permalink
Merge pull request #15217 from badone/wip-async-sleep-timer-fix
Browse files Browse the repository at this point in the history
osd: Move scrub sleep timer to osdservice

Reviewed-by: Josh Durgin <jdurgin@redhat.com>
  • Loading branch information
liewegas committed Jun 2, 2017
2 parents 6e406ba + f110a82 commit b98ad7c
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 26 deletions.
14 changes: 14 additions & 0 deletions src/osd/OSD.cc
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,9 @@ OSDService::OSDService(OSD *osd) :
snap_sleep_lock("OSDService::snap_sleep_lock"),
snap_sleep_timer(
osd->client_messenger->cct, snap_sleep_lock, false /* relax locking */),
scrub_sleep_lock("OSDService::scrub_sleep_lock"),
scrub_sleep_timer(
osd->client_messenger->cct, scrub_sleep_lock, false /* relax locking */),
snap_reserver(&reserver_finisher,
cct->_conf->osd_max_trimming_pgs),
recovery_lock("OSDService::recovery_lock"),
Expand Down Expand Up @@ -549,6 +552,11 @@ void OSDService::shutdown()
snap_sleep_timer.shutdown();
}

{
Mutex::Locker l(scrub_sleep_lock);
scrub_sleep_timer.shutdown();
}

osdmap = OSDMapRef();
next_osdmap = OSDMapRef();
}
Expand All @@ -565,6 +573,7 @@ void OSDService::init()
watch_timer.init();
agent_timer.init();
snap_sleep_timer.init();
scrub_sleep_timer.init();

agent_thread.create("osd_srv_agent");

Expand Down Expand Up @@ -3717,6 +3726,11 @@ PG *OSD::_lookup_lock_pg(spg_t pgid)
return pg;
}

PG *OSD::lookup_lock_pg(spg_t pgid)
{
return _lookup_lock_pg(pgid);
}

PG *OSD::_lookup_lock_pg_with_map_lock_held(spg_t pgid)
{
assert(pg_map.count(pgid));
Expand Down
8 changes: 8 additions & 0 deletions src/osd/OSD.h
Original file line number Diff line number Diff line change
Expand Up @@ -963,6 +963,9 @@ class OSDService {
Mutex snap_sleep_lock;
SafeTimer snap_sleep_timer;

Mutex scrub_sleep_lock;
SafeTimer scrub_sleep_timer;

AsyncReserver<spg_t> snap_reserver;
void queue_for_snap_trim(PG *pg);

Expand Down Expand Up @@ -2023,6 +2026,11 @@ class OSD : public Dispatcher,

PG *_lookup_lock_pg_with_map_lock_held(spg_t pgid);
PG *_lookup_lock_pg(spg_t pgid);

public:
PG *lookup_lock_pg(spg_t pgid);

protected:
PG *_open_lock_pg(OSDMapRef createmap,
spg_t pg, bool no_lockdep_check=false);
enum res_result {
Expand Down
53 changes: 31 additions & 22 deletions src/osd/PG.cc
Original file line number Diff line number Diff line change
Expand Up @@ -326,9 +326,7 @@ PG::PG(OSDService *o, OSDMapRef curmap,
peer_features(CEPH_FEATURES_SUPPORTED_DEFAULT),
acting_features(CEPH_FEATURES_SUPPORTED_DEFAULT),
upacting_features(CEPH_FEATURES_SUPPORTED_DEFAULT),
last_epoch(0),
scrub_sleep_lock("PG::scrub_sleep_lock"),
scrub_sleep_timer(o->cct, scrub_sleep_lock, false /* relax locking */)
last_epoch(0)
{
#ifdef PG_DEBUG_REFS
osd->add_pgid(p, this);
Expand All @@ -344,8 +342,6 @@ PG::PG(OSDService *o, OSDMapRef curmap,
PG::~PG()
{
pgstate_history.set_pg_in_destructor();
Mutex::Locker l(scrub_sleep_lock);
scrub_sleep_timer.shutdown();
#ifdef PG_DEBUG_REFS
osd->remove_pgid(info.pgid, this);
#endif
Expand Down Expand Up @@ -2799,8 +2795,6 @@ void PG::init(
dirty_info = true;
dirty_big_info = true;
write_if_dirty(*t);

scrub_sleep_timer.init();
}

#pragma GCC diagnostic ignored "-Wpragmas"
Expand Down Expand Up @@ -4207,24 +4201,39 @@ void PG::scrub(epoch_t queued, ThreadPool::TPHandle &handle)
{
if (cct->_conf->osd_scrub_sleep > 0 &&
(scrubber.state == PG::Scrubber::NEW_CHUNK ||
scrubber.state == PG::Scrubber::INACTIVE) && scrubber.needs_sleep) {
scrubber.state == PG::Scrubber::INACTIVE) &&
scrubber.needs_sleep) {
ceph_assert(!scrubber.sleeping);
dout(20) << __func__ << " state is INACTIVE|NEW_CHUNK, sleeping" << dendl;

// Do an async sleep so we don't block the op queue
auto scrub_requeue_callback = new FunctionContext([this](int r) {
lock();
scrubber.sleeping = false;
scrubber.needs_sleep = false;
dout(20) << __func__ << " slept for "
<< ceph_clock_now() - scrubber.sleep_start
<< ", re-queuing scrub" << dendl;
scrub_queued = false;
requeue_scrub();
scrubber.sleep_start = utime_t();
unlock();
});
Mutex::Locker l(scrub_sleep_lock);
scrub_sleep_timer.add_event_after(cct->_conf->osd_scrub_sleep, scrub_requeue_callback);
OSDService *osds = osd;
spg_t pgid = get_pgid();
int state = scrubber.state;
auto scrub_requeue_callback =
new FunctionContext([osds, pgid, state](int r) {
PG *pg = osds->osd->lookup_lock_pg(pgid);
if (pg == nullptr) {
lgeneric_dout(osds->osd->cct, 20)
<< "scrub_requeue_callback: Could not find "
<< "PG " << pgid << " can't complete scrub requeue after sleep"
<< dendl;
return;
}
pg->scrubber.sleeping = false;
pg->scrubber.needs_sleep = false;
lgeneric_dout(pg->cct, 20)
<< "scrub_requeue_callback: slept for "
<< ceph_clock_now() - pg->scrubber.sleep_start
<< ", re-queuing scrub with state " << state << dendl;
pg->scrub_queued = false;
pg->requeue_scrub();
pg->scrubber.sleep_start = utime_t();
pg->unlock();
});
Mutex::Locker l(osd->scrub_sleep_lock);
osd->scrub_sleep_timer.add_event_after(cct->_conf->osd_scrub_sleep,
scrub_requeue_callback);
scrubber.sleeping = true;
scrubber.sleep_start = ceph_clock_now();
return;
Expand Down
4 changes: 0 additions & 4 deletions src/osd/PG.h
Original file line number Diff line number Diff line change
Expand Up @@ -942,7 +942,6 @@ class PG : public DoutPrefixProvider {
public:
void clear_primary_state();

public:
bool is_actingbackfill(pg_shard_t osd) const {
return actingbackfill.count(osd);
}
Expand Down Expand Up @@ -2197,9 +2196,6 @@ class PG : public DoutPrefixProvider {

epoch_t last_epoch;

Mutex scrub_sleep_lock;
SafeTimer scrub_sleep_timer;

public:
const spg_t& get_pgid() const { return pg_id; }

Expand Down

0 comments on commit b98ad7c

Please sign in to comment.