From: Jason Dillaman Date: Thu, 7 Apr 2016 21:34:37 +0000 (-0400) Subject: journal: possible race condition during live replay X-Git-Tag: v10.2.0~42^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=11a9722b451dbcbf115ad282eb1f861477f6f23a;p=ceph.git journal: possible race condition during live replay When two objects are being actively watched, it was possible for the watch context to complete before the second watch was associated. Fixes: http://tracker.ceph.com/issues/15352 Signed-off-by: Jason Dillaman --- diff --git a/src/journal/JournalPlayer.cc b/src/journal/JournalPlayer.cc index 0d6b1776ac49f..0244d9ad37da2 100644 --- a/src/journal/JournalPlayer.cc +++ b/src/journal/JournalPlayer.cc @@ -535,16 +535,18 @@ void JournalPlayer::schedule_watch() { // poll first splay offset and active splay offset since // new records should only appear in those two objects C_Watch *ctx = new C_Watch(this); - ObjectPlayerPtr object_player = get_object_player(); - object_player->watch(ctx, m_watch_interval); + ObjectPlayerPtr object_player = get_object_player(); uint8_t splay_width = m_journal_metadata->get_splay_width(); if (object_player->get_object_number() % splay_width != 0) { ++ctx->pending_fetches; - object_player = m_object_players.begin()->second.begin()->second; - object_player->watch(ctx, m_watch_interval); + ObjectPlayerPtr first_object_player = + m_object_players.begin()->second.begin()->second; + first_object_player->watch(ctx, m_watch_interval); } + + object_player->watch(ctx, m_watch_interval); m_watch_scheduled = true; } diff --git a/src/journal/ObjectPlayer.cc b/src/journal/ObjectPlayer.cc index db49d46ade278..c299792f276e2 100644 --- a/src/journal/ObjectPlayer.cc +++ b/src/journal/ObjectPlayer.cc @@ -32,6 +32,7 @@ ObjectPlayer::~ObjectPlayer() { Mutex::Locker timer_locker(m_timer_lock); Mutex::Locker locker(m_lock); assert(!m_fetch_in_progress); + assert(!m_watch_in_progress); assert(m_watch_ctx == NULL); } }