if (o->is_dirty())
o->mark_clean();
+ o->xlist_open_file.remove_myself();
+
// remove from inode map
inode_map.erase(o->vino());
}
+/*
+ * remove any items from logsegment open_file lists that don't have
+ * any caps
+ */
+void MDCache::reconnect_clean_open_file_lists()
+{
+ dout(10) << "reconnect_clean_open_file_lists" << dendl;
+
+ for (map<loff_t,LogSegment*>::iterator p = mds->mdlog->segments.begin();
+ p != mds->mdlog->segments.end();
+ p++) {
+ LogSegment *ls = p->second;
+
+ xlist<CInode*>::iterator q = ls->open_files.begin();
+ while (!q.end()) {
+ CInode *in = *q;
+ ++q;
+ if (!in->is_any_caps()) {
+ dout(10) << " unlisting capless inode " << *in << dendl;
+ in->xlist_open_file.remove_myself();
+ }
+ }
+ }
+}
+
+
+
void MDCache::rejoin_import_cap(CInode *in, int client, ceph_mds_cap_reconnect& icr, int frommds)
{
dout(10) << "rejoin_import_cap for client" << client << " from mds" << frommds
ESubtreeMap *create_subtree_map();
+ // [reconnect]
+ void reconnect_clean_open_file_lists();
+
protected:
// [rejoin]
set<int> rejoin_gather; // nodes from whom i need a rejoin
dout(1) << "reconnect_done" << dendl;
request_state(MDSMap::STATE_REJOIN); // move to rejoin state
+ mdcache->reconnect_clean_open_file_lists();
+
/*
if (mdsmap->get_num_in_mds() == 1 &&
mdsmap->get_num_mds(MDSMap::STATE_FAILED) == 0) { // just me!
for (xlist<CInode*>::iterator p = open_files.begin(); !p.end(); ++p) {
CInode *in = *p;
dout(20) << "try_to_expire requeueing open file " << *in << dendl;
+ assert(in->is_any_caps());
if (!le) le = new EOpen(mds->mdlog);
le->add_clean_inode(in);
ls->open_files.push_back(&in->xlist_open_file);