<< realm->get_newest_seq() << " on " << *realm << dendl;
auto snap = make_message<MClientSnap>(CEPH_SNAP_OP_UPDATE);
snap->bl = mds->server->get_snap_trace(client, realm);
- for (const auto& child : realm->open_children)
- snap->split_realms.push_back(child->inode->ino());
updates.emplace(std::piecewise_construct, std::forward_as_tuple(client), std::forward_as_tuple(snap));
} else {
dout(10) << "finish_snaprealm_reconnect client." << client << " up to date"
case MSG_MDS_DENTRYUNLINK:
handle_dentry_unlink(ref_cast<MDentryUnlink>(m));
break;
- case MSG_MDS_DENTRYUNLINK_ACK:
- handle_dentry_unlink_ack(ref_cast<MDentryUnlinkAck>(m));
- break;
-
case MSG_MDS_FRAGMENTNOTIFY:
handle_fragment_notify(ref_cast<MMDSFragmentNotify>(m));
// success.
if (mds->logger) mds->logger->inc(l_mds_traverse_hit);
dout(10) << "path_traverse finish on snapid " << snapid << dendl;
- if (mdr)
+ if (mdr)
ceph_assert(mdr->snapid == snapid);
if (flags & MDS_TRAVERSE_RDLOCK_SNAP)
if (mdr->is_batch_head()) {
mdr->release_batch_op()->forward(who);
} else {
- mds->forward_message_mds(mdr->release_client_request(), who);
+ mds->forward_message_mds(mdr, who);
}
if (mds->logger) mds->logger->inc(l_mds_forward);
} else if (mdr->internal_op >= 0) {
// UNLINK
-void MDCache::send_dentry_unlink(CDentry *dn, CDentry *straydn,
- MDRequestRef& mdr, bool unlinking)
+void MDCache::send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequestRef& mdr)
{
dout(10) << __func__ << " " << *dn << dendl;
// share unlink news with replicas
CInode *strayin = straydn->get_linkage()->get_inode();
strayin->encode_snap_blob(snapbl);
}
-
- if (unlinking) {
- ceph_assert(!straydn);
- dn->replica_unlinking_ref = 0;
- }
for (set<mds_rank_t>::iterator it = replicas.begin();
it != replicas.end();
++it) {
rejoin_gather.count(*it)))
continue;
- auto unlink = make_message<MDentryUnlink>(dn->get_dir()->dirfrag(),
- dn->get_name(), unlinking);
+ auto unlink = make_message<MDentryUnlink>(dn->get_dir()->dirfrag(), dn->get_name());
if (straydn) {
encode_replica_stray(straydn, *it, unlink->straybl);
unlink->snapbl = snapbl;
}
mds->send_message_mds(unlink, *it);
- if (unlinking) {
- dn->replica_unlinking_ref++;
- dn->get(CDentry::PIN_WAITUNLINKSTATE);
- }
- }
-
- if (unlinking && dn->replica_unlinking_ref) {
- dn->add_waiter(CDentry::WAIT_UNLINK_STATE, new C_MDS_RetryRequest(this, mdr));
}
}
// straydn
CDentry *straydn = nullptr;
CInode *strayin = nullptr;
-
if (m->straybl.length())
decode_replica_stray(straydn, &strayin, m->straybl, mds_rank_t(m->get_source().num()));
- boost::intrusive_ptr<MDentryUnlinkAck> ack;
- CDentry::linkage_t *dnl;
- CDentry *dn;
- CInode *in;
- bool hadrealm;
-
CDir *dir = get_dirfrag(m->get_dirfrag());
if (!dir) {
dout(7) << __func__ << " don't have dirfrag " << m->get_dirfrag() << dendl;
- if (m->is_unlinking())
- goto ack;
} else {
- dn = dir->lookup(m->get_dn());
+ CDentry *dn = dir->lookup(m->get_dn());
if (!dn) {
dout(7) << __func__ << " don't have dentry " << *dir << " dn " << m->get_dn() << dendl;
- if (m->is_unlinking())
- goto ack;
} else {
dout(7) << __func__ << " on " << *dn << dendl;
-
- if (m->is_unlinking()) {
- dn->state_set(CDentry::STATE_UNLINKING);
- goto ack;
- }
-
- dnl = dn->get_linkage();
+ CDentry::linkage_t *dnl = dn->get_linkage();
// open inode?
if (dnl->is_primary()) {
- in = dnl->get_inode();
+ CInode *in = dnl->get_inode();
dn->dir->unlink_inode(dn);
ceph_assert(straydn);
straydn->dir->link_primary_inode(straydn, in);
in->first = straydn->first;
// update subtree map?
- if (in->is_dir()) {
+ if (in->is_dir())
adjust_subtree_after_rename(in, dir, false);
- }
if (m->snapbl.length()) {
- hadrealm = (in->snaprealm ? true : false);
+ bool hadrealm = (in->snaprealm ? true : false);
in->decode_snap_blob(m->snapbl);
ceph_assert(in->snaprealm);
if (!hadrealm)
if (in->is_any_caps() &&
!in->state_test(CInode::STATE_EXPORTINGCAPS))
migrator->export_caps(in);
-
+
straydn = NULL;
} else {
ceph_assert(!straydn);
dn->dir->unlink_inode(dn);
}
ceph_assert(dnl->is_null());
- dn->state_clear(CDentry::STATE_UNLINKING);
-
- MDSContext::vec finished;
- dn->take_waiting(CDentry::WAIT_UNLINK_FINISH, finished);
- mds->queue_waiters(finished);
-
}
}
trim_dentry(straydn, ex);
send_expire_messages(ex);
}
- return;
-
-ack:
- ack = make_message<MDentryUnlinkAck>(m->get_dirfrag(), m->get_dn());
- mds->send_message(ack, m->get_connection());
}
-void MDCache::handle_dentry_unlink_ack(const cref_t<MDentryUnlinkAck> &m)
-{
- CDir *dir = get_dirfrag(m->get_dirfrag());
- if (!dir) {
- dout(7) << __func__ << " don't have dirfrag " << m->get_dirfrag() << dendl;
- } else {
- CDentry *dn = dir->lookup(m->get_dn());
- if (!dn) {
- dout(7) << __func__ << " don't have dentry " << *dir << " dn " << m->get_dn() << dendl;
- } else {
- dout(7) << __func__ << " on " << *dn << " ref "
- << dn->replica_unlinking_ref << " -> "
- << dn->replica_unlinking_ref - 1 << dendl;
- dn->replica_unlinking_ref--;
- if (!dn->replica_unlinking_ref) {
- MDSContext::vec finished;
- dn->take_waiting(CDentry::WAIT_UNLINK_STATE, finished);
- mds->queue_waiters(finished);
- }
- dn->put(CDentry::PIN_WAITUNLINKSTATE);
- }
- }
-}
std::string_view path,
std::string_view tag,
bool force, bool recursive, bool repair,
- Formatter *f, Context *fin)
+ bool scrub_mdsdir, Formatter *f, Context *fin)
{
dout(10) << __func__ << " " << path << dendl;
}
C_MDS_EnqueueScrub *cs = new C_MDS_EnqueueScrub(tag_str, f, fin);
- cs->header = std::make_shared<ScrubHeader>(tag_str, is_internal, force, recursive, repair);
+ cs->header = std::make_shared<ScrubHeader>(tag_str, is_internal, force,
+ recursive, repair, scrub_mdsdir);
mdr->internal_op_finish = cs;
enqueue_scrub_work(mdr);