choose_lock_states_and_reconnect_caps();
- identify_files_to_recover(rejoin_recover_q, rejoin_check_q);
+ identify_files_to_recover();
rejoin_send_acks();
// signal completion of fetches, rejoin_gather_finish, etc.
dout(10) << "open_snap_parents - all open" << dendl;
do_delayed_cap_imports();
- start_files_to_recover(rejoin_recover_q, rejoin_check_q);
assert(rejoin_done != NULL);
rejoin_done->complete(0);
rejoin_done = NULL;
* called after recovery to recover file sizes for previously opened (for write)
* files. that is, those where max_size > size.
*/
-void MDCache::identify_files_to_recover(vector<CInode*>& recover_q, vector<CInode*>& check_q)
+void MDCache::identify_files_to_recover()
{
dout(10) << "identify_files_to_recover" << dendl;
for (ceph::unordered_map<vinodeno_t,CInode*>::iterator p = inode_map.begin();
if (recover) {
in->auth_pin(&in->filelock);
in->filelock.set_state(LOCK_PRE_SCAN);
- recover_q.push_back(in);
-
+ rejoin_recover_q.push_back(in);
+
// make sure past parents are open/get opened
SnapRealm *realm = in->find_snaprealm();
check_realm_past_parents(realm);
} else {
- check_q.push_back(in);
+ rejoin_check_q.push_back(in);
}
}
}
-void MDCache::start_files_to_recover(vector<CInode*>& recover_q, vector<CInode*>& check_q)
+void MDCache::start_files_to_recover()
{
- for (vector<CInode*>::iterator p = check_q.begin(); p != check_q.end(); ++p) {
- CInode *in = *p;
+ for (CInode *in : rejoin_check_q) {
mds->locker->check_inode_max_size(in);
}
- for (vector<CInode*>::iterator p = recover_q.begin(); p != recover_q.end(); ++p) {
- CInode *in = *p;
+ rejoin_check_q.clear();
+ for (CInode *in : rejoin_recover_q) {
mds->locker->file_recover(&in->filelock);
}
+ if (!rejoin_recover_q.empty()) {
+ rejoin_recover_q.clear();
+ do_file_recover();
+ }
}
void MDCache::do_file_recover()
// File size recovery
private:
RecoveryQueue recovery_queue;
- void identify_files_to_recover(vector<CInode*>& recover_q, vector<CInode*>& check_q);
- void start_files_to_recover(vector<CInode*>& recover_q, vector<CInode*>& check_q);
+ void identify_files_to_recover();
public:
+ void start_files_to_recover();
void do_file_recover();
void queue_file_recover(CInode *in);
void _queued_file_recover_cow(CInode *in, MutationRef& mut);
{
dout(1) << "clientreplay_start" << dendl;
finish_contexts(g_ceph_context, waiting_for_replay); // kick waiters
+ mdcache->start_files_to_recover();
queue_one_replay();
}
mdcache->clean_open_file_lists();
mdcache->export_remaining_imported_caps();
finish_contexts(g_ceph_context, waiting_for_replay); // kick waiters
+ mdcache->start_files_to_recover();
mdcache->reissue_all_caps();