dout(10) << "standby_trim_segments" << dendl;
uint64_t expire_pos = journaler->get_expire_pos();
dout(10) << " expire_pos=" << expire_pos << dendl;
+
+ mds->mdcache->open_file_table.trim_destroyed_inos(expire_pos);
+
bool removed_segment = false;
while (have_any_segments()) {
LogSegment *seg = get_oldest_segment();
_prefetch_inodes();
} else if (prefetch_state == FILE_INODES) {
prefetch_state = DONE;
+ logseg_destroyed_inos.clear();
+ destroyed_inos_set.clear();
finish_contexts(g_ceph_context, waiting_for_prefetch);
waiting_for_prefetch.clear();
} else {
MDCache *mdcache = mds->mdcache;
+ if (destroyed_inos_set.empty()) {
+ for (auto& it : logseg_destroyed_inos)
+ destroyed_inos_set.insert(it.second.begin(), it.second.end());
+ }
+
for (auto& it : loaded_anchor_map) {
+ if (destroyed_inos_set.count(it.first))
+ continue;
if (it.second.d_type == DT_DIR) {
if (prefetch_state != DIR_INODES)
continue;
}
return true;
}
+
+void OpenFileTable::note_destroyed_inos(uint64_t seq, const vector<inodeno_t>& inos)
+{
+ auto& vec = logseg_destroyed_inos[seq];
+ vec.insert(vec.end(), inos.begin(), inos.end());
+}
+
+void OpenFileTable::trim_destroyed_inos(uint64_t seq)
+{
+ auto p = logseg_destroyed_inos.begin();
+ while (p != logseg_destroyed_inos.end()) {
+ if (p->first >= seq)
+ break;
+ logseg_destroyed_inos.erase(p++);
+ }
+}
bool should_log_open(CInode *in);
+ void note_destroyed_inos(uint64_t seq, const vector<inodeno_t>& inos);
+ void trim_destroyed_inos(uint64_t seq);
+
protected:
MDSRank *mds;
void _open_ino_finish(inodeno_t ino, int r);
void _prefetch_inodes();
+ std::map<uint64_t, vector<inodeno_t> > logseg_destroyed_inos;
+ std::set<inodeno_t> destroyed_inos_set;
+
friend class C_IO_OFT_Load;
friend class C_IO_OFT_Save;
friend class C_OFT_OpenInoFinish;
}
// destroyed inodes
- for (vector<inodeno_t>::iterator p = destroyed_inodes.begin();
- p != destroyed_inodes.end();
- ++p) {
- CInode *in = mds->mdcache->get_inode(*p);
- if (in) {
- dout(10) << "EMetaBlob.replay destroyed " << *p << ", dropping " << *in << dendl;
- CDentry *parent = in->get_parent_dn();
- mds->mdcache->remove_inode(in);
- if (parent) {
- dout(10) << "EMetaBlob.replay unlinked from dentry " << *parent << dendl;
- assert(parent->get_linkage()->is_null());
+ if (!destroyed_inodes.empty()) {
+ for (vector<inodeno_t>::iterator p = destroyed_inodes.begin();
+ p != destroyed_inodes.end();
+ ++p) {
+ CInode *in = mds->mdcache->get_inode(*p);
+ if (in) {
+ dout(10) << "EMetaBlob.replay destroyed " << *p << ", dropping " << *in << dendl;
+ CDentry *parent = in->get_parent_dn();
+ mds->mdcache->remove_inode(in);
+ if (parent) {
+ dout(10) << "EMetaBlob.replay unlinked from dentry " << *parent << dendl;
+ assert(parent->get_linkage()->is_null());
+ }
+ } else {
+ dout(10) << "EMetaBlob.replay destroyed " << *p << ", not in cache" << dendl;
}
- } else {
- dout(10) << "EMetaBlob.replay destroyed " << *p << ", not in cache" << dendl;
}
+ mds->mdcache->open_file_table.note_destroyed_inos(logseg->seq, destroyed_inodes);
}
// client requests