]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commit
mds: relax certain asserts in mdlog replay thread
authorVenky Shankar <vshankar@redhat.com>
Wed, 14 Feb 2024 05:37:51 +0000 (00:37 -0500)
committerVenky Shankar <vshankar@redhat.com>
Thu, 7 Mar 2024 04:40:22 +0000 (10:10 +0530)
commit458d1b75a36575a358ef9eb299da405ff457674f
tree320c4cdc5240737d07f46df1ed293d8dcf5c1058
parent734984e1bcbaa8fac1134a482d2f29ab9ab1f9f2
mds: relax certain asserts in mdlog replay thread

The calls to journaler->is_readable() and journaler->get_error()
in MDLog::_replay_thread() will drop Journaler::lock between
invocations, so, theoretically, its possible that the initial check:

  // loop
  int r = 0;
  while (1) {
    // wait for read?
    while (!journaler->is_readable() &&
       journaler->get_read_pos() < journaler->get_write_pos() &&
       !journaler->get_error()) {
      C_SaferCond readable_waiter;
      journaler->wait_for_readable(&readable_waiter);
      r = readable_waiter.wait();
    }
    if (journaler->get_error()) {
      r = journaler->get_error();
      dout(0) << "_replay journaler got error " << r << ", aborting" << dendl;

journaler->is_readable() returned true, thereby breaking out of
the (inner) while loop and by passing the journaler->get_error()
check, and by the time this hits the next set of checks:

    if (!journaler->is_readable() &&
    journaler->get_read_pos() == journaler->get_write_pos())
      break;

    ceph_assert(journaler->is_readable() || mds->is_daemon_stopping());

It's possible that the journal is unreadable due to some error that
happened during prefetch. In short, these checks are racy.

So, remove these racy assert check along with journaler->is_readable()
check when validating the journal end and rely on the next iteration
of reading the journal for error handling.

Fixes: http://tracker.ceph.com/issues/57048
Signed-off-by: Venky Shankar <vshankar@redhat.com>
(cherry picked from commit 90393de9690b3e2234f7bd0ed0fb91c39e15e818)
src/mds/MDLog.cc