<< " (" << cpp_strerror(r) << ") for " << *in << dendl;
in->mdcache->logger->inc(l_mdc_uninline_write_failed);
ceph_assert(in->get_scrub_header());
- in->get_scrub_header()->record_uninline_status(in->ino(), r);
+ std::string path;
+ in->make_path_string(path);
+ in->get_scrub_header()->record_uninline_status(in->ino(), r, path);
in->uninline_finished();
mds->server->respond_to_request(mdr, r);
return;
}
unsigned get_num_pending() const { return num_pending; }
- void record_uninline_status(_inodeno_t ino, int e) {
+ void record_uninline_status(_inodeno_t ino, int e, std::string_view path) {
if (uninline_failed_info.find(e) == uninline_failed_info.end()) {
uninline_failed_info[e] = std::vector<_inodeno_t>();
}
auto& v = uninline_failed_info.at(e);
v.push_back(ino);
+ paths[ino] = path;
}
std::unordered_map<int, std::vector<_inodeno_t>>& get_uninline_failed_info() {
return uninline_failed_info;
}
+ std::unordered_map<_inodeno_t, std::string>& get_paths() {
+ return paths;
+ }
+
protected:
const std::string tag;
bool is_tag_internal;
unsigned num_pending = 0;
// errno -> [ino1, ino2, ino3, ...]
std::unordered_map<int, std::vector<_inodeno_t>> uninline_failed_info;
+ std::unordered_map<_inodeno_t, std::string> paths;
};
typedef std::shared_ptr<ScrubHeader> ScrubHeaderRef;
bool any_repaired = false;
std::set<std::string> scrubbing_tags;
std::unordered_map<std::string, unordered_map<int, std::vector<_inodeno_t>>> uninline_failed_meta_info;
+ std::unordered_map<_inodeno_t, std::string> paths;
for (auto it = scrubbing_map.begin(); it != scrubbing_map.end(); ) {
auto& header = it->second;
auto& ufi = header->get_uninline_failed_info();
uninline_failed_meta_info[it->first] = ufi;
ufi.clear();
+ paths.merge(header->get_paths());
+ ceph_assert(header->get_paths().size() == 0);
scrubbing_map.erase(it++);
} else {
++it;
auto ack = make_message<MMDSScrubStats>(scrub_epoch,
std::move(scrubbing_tags),
std::move(uninline_failed_meta_info),
+ std::move(paths),
clear_stack);
mdcache->mds->send_message_mds(ack, 0);
for (auto& [scrub_tag, errno_map] : m->get_uninline_failed_meta_info()) {
stat.uninline_failed_meta_info[scrub_tag] = errno_map;
}
+ stat.paths.insert(m->get_paths().begin(), m->get_paths().end());;
}
}
}
for (mds_rank_t rank = 0; rank < (mds_rank_t)mds_scrub_stats.size(); rank++) {
auto& ufmi = mds_scrub_stats[rank].uninline_failed_meta_info;
+ auto& paths = mds_scrub_stats[rank].paths;
for (const auto& [scrub_tag, errno_ino_vec_map] : ufmi) {
for (const auto& [errno_, ino_vec] : errno_ino_vec_map) {
for (auto ino : ino_vec) {
- std::string path;
- auto in = mdcache->get_inode(ino);
- ceph_assert(in);
- in->make_path_string(path);
- mds->damage_table.notify_uninline_failed(ino, rank, errno_, scrub_tag, path);
+ mds->damage_table.notify_uninline_failed(ino, rank, errno_, scrub_tag, paths[ino]);
}
}
}
ufmi.clear();
+ paths.clear();
}
}
any_repaired = true;
auto& ufmi = mds_scrub_stats[0].uninline_failed_meta_info;
ufmi[it->first] = header->get_uninline_failed_info();
+ mds_scrub_stats[0].paths.merge(header->get_paths());
move_uninline_failures_to_damage_table();
scrubbing_map.erase(it++);
} else {
std::set<std::string> scrubbing_tags;
bool aborting = false;
std::unordered_map<std::string, std::unordered_map<int, std::vector<_inodeno_t>>> uninline_failed_meta_info;
+ std::unordered_map<_inodeno_t, std::string> paths;
};
std::vector<scrub_stat_t> mds_scrub_stats;
const std::unordered_map<std::string, std::unordered_map<int, std::vector<_inodeno_t>>>& get_uninline_failed_meta_info() const {
return uninline_failed_meta_info;
}
+ const std::unordered_map<_inodeno_t, std::string>& get_paths() const {
+ return paths;
+ }
void encode_payload(uint64_t features) override {
using ceph::encode;
encode(ino_vec, payload);
}
}
+ count = (int)paths.size();
+ encode(count, payload);
+ for (auto& [ino, path] : paths) {
+ encode(ino, payload);
+ encode(path, payload);
+ }
}
void decode_uninline_failed_info(ceph::bufferlist::const_iterator& p) {
using ceph::decode;
}
uninline_failed_meta_info[tag] = std::move(uninline_failed_info);
}
+ int count = 0;
+ decode(count, p);
+ while (count--) {
+ _inodeno_t ino;
+ std::string path;
+ decode(ino, p);
+ decode(path, p);
+ paths[ino] = path;
+ }
}
protected:
epoch(e), scrubbing_tags(tags), update_scrubbing(true), aborting(abrt) {}
MMDSScrubStats(unsigned e, const std::set<std::string>& tags,
std::unordered_map<std::string, std::unordered_map<int, std::vector<_inodeno_t>>>&& ufmi,
- bool abrt = false) :
+ std::unordered_map<_inodeno_t, std::string>&& paths_, bool abrt = false) :
MMDSOp(MSG_MDS_SCRUB_STATS, HEAD_VERSION, COMPAT_VERSION),
epoch(e), scrubbing_tags(tags), update_scrubbing(true), aborting(abrt),
- uninline_failed_meta_info(std::move(ufmi)) {}
+ uninline_failed_meta_info(std::move(ufmi)), paths(std::move(paths_)) {}
~MMDSScrubStats() override {}
private:
bool aborting = false;
// <tag, <error_code, [ino1, ino2, ...]>>
std::unordered_map<std::string, std::unordered_map<int, std::vector<_inodeno_t>>> uninline_failed_meta_info;
+ std::unordered_map<_inodeno_t, std::string> paths;
template<class T, typename... Args>
friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);