]> git.apps.os.sepia.ceph.com Git - ceph.git/commit
mds: relax certain asserts in mdlog replay thread 55639/head
authorVenky Shankar <vshankar@redhat.com>
Wed, 14 Feb 2024 05:37:51 +0000 (00:37 -0500)
committerVenky Shankar <vshankar@redhat.com>
Mon, 4 Mar 2024 01:35:00 +0000 (20:35 -0500)
commit90393de9690b3e2234f7bd0ed0fb91c39e15e818
tree2c72f5b60862bd981a0d2a92246dcdd897e8a87a
parent7280a2412d6d9bed5e72ec5c9881bc7c2ef81975
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>
src/mds/MDLog.cc