Skip to content

Commit

Permalink
osd/ReplicatedPG: make handle_watch_timeout no-op if !active
Browse files Browse the repository at this point in the history
During on_change, we clean up old events on the obcs.  This can
include a queued watch timeout:

 3: (ReplicatedPG::handle_watch_timeout(std::shared_ptr<Watch>)+0x125) [0x7f1fc21fe375]
 4: (HandleDelayedWatchTimeout::finish(int)+0xd3) [0x7f1fc213e2e3]
 5: (Context::complete(int)+0x9) [0x7f1fc20ead29]
 6: (ReplicatedPG::finish_degraded_object(hobject_t const&)+0x354) [0x7f1fc22429e4]
 7: (ReplicatedPG::on_change(ObjectStore::Transaction*)+0x2ba) [0x7f1fc224353a]
 8: (PG::start_peering_interval(std::shared_ptr<OSDMap const>, std::vector<int, std::allocator<int> > const&, int, std::vector<int, std::allocator<int> > const&, int, ObjectStore::Transaction*)+0x7bd) [0x7f1fc219a0bd]

In this case, handle_watch_timeout should not assume that we are
active and primary.

Fixes: http://tracker.ceph.com/issues/15391
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 4b0e39e)
  • Loading branch information
liewegas authored and Vicente-Cheng committed Apr 20, 2016
1 parent e219e85 commit e20df80
Showing 1 changed file with 4 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/osd/ReplicatedPG.cc
Expand Up @@ -7704,6 +7704,10 @@ void ReplicatedPG::handle_watch_timeout(WatchRef watch)
ObjectContextRef obc = watch->get_obc(); // handle_watch_timeout owns this ref
dout(10) << "handle_watch_timeout obc " << obc << dendl;

if (!is_active()) {
dout(10) << "handle_watch_timeout not active, no-op" << dendl;
return;
}
if (is_degraded_or_backfilling_object(obc->obs.oi.soid)) {
callbacks_for_degraded_object[obc->obs.oi.soid].push_back(
watch->get_delayed_cb()
Expand Down

0 comments on commit e20df80

Please sign in to comment.