if (!waiting_on_dentry.empty()) {
for (const auto &p : waiting_on_dentry) {
- auto &e = dentry_waiters[p.first];
- for (const auto &waiter : p.second) {
- e.push_back(waiter);
- }
+ std::copy(p.second.begin(), p.second.end(),
+ std::back_inserter(dentry_waiters[p.first]));
}
waiting_on_dentry.clear();
put(PIN_DNWAITER);
if (f->waiting_on_dentry.empty())
f->get(PIN_DNWAITER);
- auto &e = f->waiting_on_dentry[p.first];
- for (const auto &waiter : p.second) {
- e.push_back(waiter);
- }
+ std::copy(p.second.begin(), p.second.end(),
+ std::back_inserter(f->waiting_on_dentry[p.first]));
}
// FIXME: handle dirty old rstat
if (!dentry_waiters.empty()) {
get(PIN_DNWAITER);
for (const auto &p : dentry_waiters) {
- auto &e = waiting_on_dentry[p.first];
- for (const auto &waiter : p.second) {
- e.push_back(waiter);
- }
+ std::copy(p.second.begin(), p.second.end(),
+ std::back_inserter(waiting_on_dentry[p.first]));
}
}
<< " [" << first << "," << last << "] found waiter on snap "
<< it->first.snapid
<< " on " << *this << dendl;
- for (const auto &waiter : it->second) {
- ls.push_back(waiter);
- }
+ std::copy(it->second.begin(), it->second.end(), std::back_inserter(ls));
waiting_on_dentry.erase(it++);
}
put(PIN_DNWAITER);
}
-void CDir::take_sub_waiting(MDSContext::vec& ls)
-{
- dout(10) << __func__ << dendl;
- if (!waiting_on_dentry.empty()) {
- for (const auto &p : waiting_on_dentry) {
- for (const auto &waiter : p.second) {
- ls.push_back(waiter);
- }
- }
- waiting_on_dentry.clear();
- put(PIN_DNWAITER);
- }
-}
-
-
-
void CDir::add_waiter(uint64_t tag, MDSContext *c)
{
// hierarchical?
for (const auto &p : waiting_on_dentry) {
dout(10) << "take_waiting dentry " << p.first.name
<< " snap " << p.first.snapid << " on " << *this << dendl;
- for (const auto &waiter : p.second) {
- ls.push_back(waiter);
- }
+ std::copy(p.second.begin(), p.second.end(), std::back_inserter(ls));
}
waiting_on_dentry.clear();
put(PIN_DNWAITER);
}
void add_dentry_waiter(std::string_view dentry, snapid_t snap, MDSContext *c);
void take_dentry_waiting(std::string_view dentry, snapid_t first, snapid_t last, MDSContext::vec& ls);
- void take_sub_waiting(MDSContext::vec& ls); // dentry or ino
void add_waiter(uint64_t mask, MDSContext *c) override;
void take_waiting(uint64_t mask, MDSContext::vec& ls) override; // may include dentry waiters
onfinish = new C_MDC_RetryDiscoverPath2(this, base, snap, want_path);
base->add_waiter(CDir::WAIT_SINGLEAUTH, onfinish);
return;
- } else if (from == mds->get_nodeid()) {
- MDSContext::vec finished;
- base->take_sub_waiting(finished);
- mds->queue_waiters(finished);
- return;
}
if ((path_locked && want_path.depth() == 1) ||
} else if (m->is_flag_error_dn()) {
frag_t fg = cur->pick_dirfrag(m->get_error_dentry());
CDir *dir = cur->get_dirfrag(fg);
- if (dir) {
- if (dir->is_auth()) {
- dir->take_sub_waiting(finished);
- } else {
- dir->take_dentry_waiting(m->get_error_dentry(), m->get_wanted_snapid(),
- m->get_wanted_snapid(), error);
- }
+ if (dir && !dir->is_auth()) {
+ dir->take_dentry_waiting(m->get_error_dentry(), m->get_wanted_snapid(),
+ m->get_wanted_snapid(), error);
}
}