From d9f957a5cda55adcdba5db28689aeb344d10e413 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Mon, 11 Jul 2016 10:51:13 +0800 Subject: [PATCH] mds: fix incorrect "unconnected snaprealm xxx" warning If a snaprealm has no child/parent snaprelam, and the snaprealm inode is not in the cache while client reconnects. The snaprealm does not get properly removed from MDCache::reconnected_snaplrealm. This causes incorrect "unconnected snaprealm xxx" warning Signed-off-by: Yan, Zheng (cherry picked from commit 85e687de876ca7e0174734ba81130949c4ab6a40) --- src/mds/MDCache.cc | 17 +++++++++++------ src/mds/MDCache.h | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index fe59bea2e49ca..f4e122505f212 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -5349,12 +5349,21 @@ bool MDCache::process_imported_caps() return false; } -void MDCache::check_realm_past_parents(SnapRealm *realm) +void MDCache::check_realm_past_parents(SnapRealm *realm, bool reconnect) { // are this realm's parents fully open? if (realm->have_past_parents_open()) { dout(10) << " have past snap parents for realm " << *realm << " on " << *realm->inode << dendl; + if (reconnect) { + // finish off client snaprealm reconnects? + auto p = reconnected_snaprealms.find(realm->inode->ino()); + if (p != reconnected_snaprealms.end()) { + for (auto q = p->second.begin(); q != p->second.end(); ++q) + finish_snaprealm_reconnect(q->first, realm, q->second); + reconnected_snaprealms.erase(p); + } + } } else { if (!missing_snap_parents.count(realm->inode)) { dout(10) << " MISSING past snap parents for realm " << *realm @@ -5436,7 +5445,7 @@ void MDCache::choose_lock_states_and_reconnect_caps() SnapRealm *realm = in->find_snaprealm(); - check_realm_past_parents(realm); + check_realm_past_parents(realm, realm == in->snaprealm); if (p != reconnected_caps.end()) { bool missing_snap_parent = false; @@ -6119,10 +6128,6 @@ void MDCache::identify_files_to_recover() in->auth_pin(&in->filelock); in->filelock.set_state(LOCK_PRE_SCAN); rejoin_recover_q.push_back(in); - - // make sure past parents are open/get opened - SnapRealm *realm = in->find_snaprealm(); - check_realm_past_parents(realm); } else { rejoin_check_q.push_back(in); } diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 54e8c4199af2d..c93b7f4c4ff0f 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -606,7 +606,7 @@ public: void do_delayed_cap_imports(); void rebuild_need_snapflush(CInode *head_in, SnapRealm *realm, client_t client, snapid_t snap_follows); - void check_realm_past_parents(SnapRealm *realm); + void check_realm_past_parents(SnapRealm *realm, bool reconnect); void open_snap_parents(); bool open_undef_inodes_dirfrags(); -- 2.39.5