If the mds restarts without successfully logging a max size
cap update, the client waits indefinitely in Client::get_caps
on the waitfor_caps list. So when the client gets an mds map
indicating a new active mds has replaced a down mds, we need to
kick the caps update request. This patch mimics the behavior
in the kernel by setting the wanted_max_size
and requested_max_size to 0 and wakes up the waiters.
Fixes #4582.
Signed-off-by: Sam Lang <sam.lang@inktank.com>
kick_requests(p->second, false);
kick_flushing_caps(p->second);
signal_cond_list(p->second->waiting_for_open);
+ kick_maxsize_requests(p->second);
+ wake_inode_waiters(p->second);
}
connect_mds_targets(p->first);
}
}
}
+void Client::kick_maxsize_requests(MetaSession *session)
+{
+ xlist<Cap*>::iterator iter = session->caps.begin();
+ while (!iter.end()){
+ (*iter)->inode->requested_max_size = 0;
+ (*iter)->inode->wanted_max_size = 0;
+ signal_cond_list((*iter)->inode->waitfor_caps);
+ ++iter;
+ }
+}
+
void SnapRealm::build_snap_context()
{
set<snapid_t> snaps;
void flush_caps();
void flush_caps(Inode *in, MetaSession *session);
void kick_flushing_caps(MetaSession *session);
+ void kick_maxsize_requests(MetaSession *session);
int get_caps(Inode *in, int need, int want, int *have, loff_t endoff);
void maybe_update_snaprealm(SnapRealm *realm, snapid_t snap_created, snapid_t snap_highwater,