From 44d19304a9170ecdeda6b2b5ef586b38bfa50024 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 7 Jun 2011 20:46:42 -0700 Subject: [PATCH] mds: journal open srci frags on srci import (master) If we are importing the renamed inode, and it is a directory, journal a list of all open dirfrags (currently, this is actually all frags) so that we can open them up during journal replay. Signed-off-by: Sage Weil --- src/mds/Server.cc | 15 ++++++++++++++- src/mds/events/EMetaBlob.h | 6 +++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 877505ccedc39..332eb2cb24219 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -5186,8 +5186,21 @@ void Server::_rename_prepare(MDRequest *mdr, version_t oldpv; if (srcdn->is_auth()) oldpv = srci->get_projected_version(); - else + else { oldpv = _rename_prepare_import(mdr, srcdn, client_map_bl); + + // note which dirfrags have child subtrees in the journal + // event, so that we can open those (as bounds) during replay. + if (srci->is_dir()) { + list ls; + srci->get_dirfrags(ls); + for (list::iterator p = ls.begin(); p != ls.end(); ++p) { + CDir *dir = *p; + metablob->renamed_dir_frags.push_back(dir->get_frag()); + } + dout(10) << " noting renamed dir open frags " << metablob->renamed_dir_frags << dendl; + } + } pi = srci->project_inode(); // project snaprealm if srcdnl->is_primary // & srcdnl->snaprealm pi->version = mdr->more()->pvmap[destdn] = destdn->pre_dirty(oldpv); diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h index 3eee2d0243ff3..313c60404cceb 100644 --- a/src/mds/events/EMetaBlob.h +++ b/src/mds/events/EMetaBlob.h @@ -354,6 +354,7 @@ private: inodeno_t opened_ino; public: inodeno_t renamed_dirino; + list renamed_dir_frags; private: // ino (pre)allocation. may involve both inotable AND session state. @@ -395,6 +396,7 @@ private: ::encode(destroyed_inodes, bl); ::encode(client_reqs, bl); ::encode(renamed_dirino, bl); + ::encode(renamed_dir_frags, bl); } void decode(bufferlist::iterator &bl) { __u8 struct_v; @@ -428,8 +430,10 @@ private: r.pop_front(); } } - if (struct_v >= 3) + if (struct_v >= 3) { ::decode(renamed_dirino, bl); + ::decode(renamed_dir_frags, bl); + } } -- 2.39.5