- optimize remove wrt recovery pushes?
userspace client
-- handle session STALE
-- time out caps, wake up waiters on renewal
- - link caps with mds session
-- fix lease validation to check session ttl
- clean up client mds session vs mdsmap behavior?
-- clean up on session close
- - hose all caps
- - kick any requests
- stop using mds's inode_t?
- fix readdir vs fragment race by keeping a separate frag pos, and ignoring dentries below it
case CEPH_SESSION_CLOSE:
mds_sessions.erase(from);
mount_cond.Signal();
- // FIXME: kick requests (hard) so that they are redirected. or fail.
+ remove_session_caps(from);
+ kick_requests(from, true);
break;
case CEPH_SESSION_RENEWCAPS:
case CEPH_SESSION_STALE:
mds_sessions[from].was_stale = true;
+ renew_caps(from);
break;
default:
assert(0);
delete m;
}
-
void Client::send_request(MetaRequest *request, int mds)
{
MClientRequest *r = request->request;
r->set_retry_attempt(request->retry_attempt);
r->set_dentry_wanted();
}
+ else
+ request->retry_attempt++;
request->request = 0;
r->set_mdsmap_epoch(mdsmap->get_epoch());
// kick requests?
if (frommds >= 0 &&
mdsmap->get_state(frommds) == MDSMap::STATE_ACTIVE) {
- kick_requests(frommds);
+ kick_requests(frommds, false);
//failed_mds.erase(from);
}
}
-void Client::kick_requests(int mds)
+void Client::kick_requests(int mds, bool signal)
{
dout(10) << "kick_requests for mds" << mds << dendl;
p != mds_requests.end();
++p)
if (p->second->mds.count(mds)) {
- p->second->retry_attempt++; // inc retry counter
- send_request(p->second, mds);
+ if (signal) {
+ p->second->caller_cond->Signal();
+ }
+ else {
+ send_request(p->second, mds);
+ }
}
}
remove_cap(in, in->caps.begin()->first);
}
+void Client::remove_session_caps(int mds_num) {
+ MDSSession* mds = &mds_sessions[mds_num];
+ while (mds->caps.size())
+ remove_cap((*mds->caps.begin())->inode, mds_num);
+}
+
void Client::mark_caps_dirty(Inode *in, int caps)
{
dout(10) << "mark_caps_dirty " << *in << " " << ccap_string(in->dirty_caps) << " -> "
}
}
-void Client::renew_caps(const int session) {
- dout(10) << "renew_caps(session number)" << dendl;
- mds_sessions[session].last_cap_renew_request = g_clock.now();
+void Client::renew_caps(const int mds) {
+ dout(10) << "renew_caps mds" << mds << dendl;
+ mds_sessions[mds].last_cap_renew_request = g_clock.now();
messenger->send_message(new MClientSession(CEPH_SESSION_REQUEST_RENEWCAPS),
- mdsmap->get_inst(session));
+ mdsmap->get_inst(mds));
}
}
// or requests
- kick_requests(mds);
+ //kick_requests(mds, false);
}
else
objecter->ms_handle_remote_reset(addr, last);
int use_mds=-1);
int choose_target_mds(MClientRequest *req);
void send_request(MetaRequest *request, int mds);
- void kick_requests(int mds);
+ void kick_requests(int mds, bool signal);
void handle_client_request_forward(MClientRequestForward *reply);
void handle_client_reply(MClientReply *reply);
int flags);
void remove_cap(Inode *in, int mds);
void remove_all_caps(Inode *in);
+ void remove_session_caps(int mds_num);
void mark_caps_dirty(Inode *in, int caps);
void maybe_update_snaprealm(SnapRealm *realm, snapid_t snap_created, snapid_t snap_highwater,