Skip to content

Commit

Permalink
cephfs_mirror: check if init in progress before calling FSMirror::is_…
Browse files Browse the repository at this point in the history
…failed()

Fixes the crash:
```
std::scoped_lock<std::mutex>::scoped_lock (__m=..., this=<optimized out>, this=<optimized out>, __m=...) at /usr/include/c++/11/mutex:655
cephfs::mirror::MirrorWatcher::is_failed (this=0x0) at /usr/src/debug/ceph-19.0.0-1578.g3d482f42.el9.x86_64/src/tools/cephfs_mirror/MirrorWatcher.h:56
cephfs::mirror::FSMirror::is_failed (this=0x557478284340) at /usr/src/debug/ceph-19.0.0-1578.g3d482f42.el9.x86_64/src/tools/cephfs_mirror/FSMirror.h:52
cephfs::mirror::Mirror::update_fs_mirrors (this=0x5574773c3e60) at /usr/src/debug/ceph-19.0.0-1578.g3d482f42.el9.x86_64/src/tools/cephfs_mirror/Mirror.cc:515

```

Fixes: https://tracker.ceph.com/issues/64751
Signed-off-by: Jos Collin <jcollin@redhat.com>
  • Loading branch information
joscollin committed Mar 28, 2024
1 parent 87a931c commit c89aa17
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 1 deletion.
7 changes: 7 additions & 0 deletions src/tools/cephfs_mirror/FSMirror.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,13 @@ class FSMirror {
return m_addrs;
}

bool get_init_finished() {
if (m_on_init_finish == nullptr) {
return true;
}
return false;
}

// admin socket helpers
void mirror_status(Formatter *f);

Expand Down
4 changes: 3 additions & 1 deletion src/tools/cephfs_mirror/Mirror.cc
Original file line number Diff line number Diff line change
Expand Up @@ -556,7 +556,9 @@ void Mirror::update_fs_mirrors() {
{
std::scoped_lock locker(m_lock);
for (auto &[filesystem, mirror_action] : m_mirror_actions) {
auto failed_restart = mirror_action.fs_mirror && mirror_action.fs_mirror->is_failed() &&
bool failed = (mirror_action.fs_mirror && mirror_action.fs_mirror->get_init_finished())?
mirror_action.fs_mirror->is_failed(): false;
auto failed_restart = failed &&
(failed_interval > 0 && (mirror_action.fs_mirror->get_failed_ts() - now) > failed_interval);
auto blocklisted_restart = mirror_action.fs_mirror && mirror_action.fs_mirror->is_blocklisted() &&
(blocklist_interval > 0 && (mirror_action.fs_mirror->get_blocklisted_ts() - now) > blocklist_interval);
Expand Down

0 comments on commit c89aa17

Please sign in to comment.