Merge pull request #45407 from vshankar/wip-54046

mds: include encoded stray inode when sending dentry unlink message to replicas

Reviewed-by: Venky Shankar <vshankar@redhat.com>
This commit is contained in:
Venky Shankar 2022-04-25 19:48:57 +05:30 committed by GitHub
commit 132d0cb79f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 6 deletions

View File

@ -10940,7 +10940,7 @@ void MDCache::decode_replica_inode(CInode *&in, bufferlist::const_iterator& p, C
void MDCache::encode_replica_stray(CDentry *straydn, mds_rank_t who, bufferlist& bl)
{
ceph_assert(straydn->get_num_auth_pins());
ENCODE_START(1, 1, bl);
ENCODE_START(2, 1, bl);
uint64_t features = mds->mdsmap->get_up_features();
encode_replica_inode(get_myin(), who, bl, features);
encode_replica_dir(straydn->get_dir()->inode->get_parent_dn()->get_dir(), who, bl);
@ -10948,15 +10948,18 @@ void MDCache::encode_replica_stray(CDentry *straydn, mds_rank_t who, bufferlist&
encode_replica_inode(straydn->get_dir()->inode, who, bl, features);
encode_replica_dir(straydn->get_dir(), who, bl);
encode_replica_dentry(straydn, who, bl);
if (!straydn->get_projected_linkage()->is_null()) {
encode_replica_inode(straydn->get_projected_linkage()->get_inode(), who, bl, features);
}
ENCODE_FINISH(bl);
}
void MDCache::decode_replica_stray(CDentry *&straydn, const bufferlist &bl, mds_rank_t from)
void MDCache::decode_replica_stray(CDentry *&straydn, CInode **in, const bufferlist &bl, mds_rank_t from)
{
MDSContext::vec finished;
auto p = bl.cbegin();
DECODE_START(1, p);
DECODE_START(2, p);
CInode *mdsin = nullptr;
decode_replica_inode(mdsin, p, NULL, finished);
CDir *mdsdir = nullptr;
@ -10969,6 +10972,9 @@ void MDCache::decode_replica_stray(CDentry *&straydn, const bufferlist &bl, mds_
decode_replica_dir(straydir, p, strayin, from, finished);
decode_replica_dentry(straydn, p, straydir, finished);
if (struct_v >= 2 && in) {
decode_replica_inode(*in, p, straydn, finished);
}
if (!finished.empty())
mds->queue_waiters(finished);
DECODE_FINISH(p);
@ -11200,8 +11206,9 @@ void MDCache::handle_dentry_unlink(const cref_t<MDentryUnlink> &m)
{
// straydn
CDentry *straydn = nullptr;
CInode *strayin = nullptr;
if (m->straybl.length())
decode_replica_stray(straydn, m->straybl, mds_rank_t(m->get_source().num()));
decode_replica_stray(straydn, &strayin, m->straybl, mds_rank_t(m->get_source().num()));
CDir *dir = get_dirfrag(m->get_dirfrag());
if (!dir) {

View File

@ -877,7 +877,7 @@ class MDCache {
void decode_replica_inode(CInode *&in, bufferlist::const_iterator& p, CDentry *dn, MDSContext::vec& finished);
void encode_replica_stray(CDentry *straydn, mds_rank_t who, bufferlist& bl);
void decode_replica_stray(CDentry *&straydn, const bufferlist &bl, mds_rank_t from);
void decode_replica_stray(CDentry *&straydn, CInode **in, const bufferlist &bl, mds_rank_t from);
// -- namespace --
void encode_remote_dentry_link(CDentry::linkage_t *dnl, bufferlist& bl);

View File

@ -2709,7 +2709,7 @@ void Server::handle_peer_request(const cref_t<MMDSPeerRequest> &m)
CDentry *straydn = NULL;
if (m->straybl.length() > 0) {
mdcache->decode_replica_stray(straydn, m->straybl, from);
mdcache->decode_replica_stray(straydn, nullptr, m->straybl, from);
ceph_assert(straydn);
m->straybl.clear();
}