提交 eb65b919 编写于 作者: Y Yan, Zheng 提交者: Ilya Dryomov

ceph: avoid updating mds_wanted too frequently

user space may open/close single file frequently. It's not good
to send a clientcaps message to mds for each open/close syscall.
Signed-off-by: NYan, Zheng <zyan@redhat.com>
上级 7c94ba27
...@@ -1184,6 +1184,13 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, ...@@ -1184,6 +1184,13 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
delayed = 1; delayed = 1;
} }
ci->i_ceph_flags &= ~(CEPH_I_NODELAY | CEPH_I_FLUSH); ci->i_ceph_flags &= ~(CEPH_I_NODELAY | CEPH_I_FLUSH);
if (want & ~cap->mds_wanted) {
/* user space may open/close single file frequently.
* This avoids droping mds_wanted immediately after
* requesting new mds_wanted.
*/
__cap_set_timeouts(mdsc, ci);
}
cap->issued &= retain; /* drop bits we don't want */ cap->issued &= retain; /* drop bits we don't want */
if (cap->implemented & ~cap->issued) { if (cap->implemented & ~cap->issued) {
...@@ -2485,15 +2492,14 @@ static int try_get_cap_refs(struct ceph_inode_info *ci, int need, int want, ...@@ -2485,15 +2492,14 @@ static int try_get_cap_refs(struct ceph_inode_info *ci, int need, int want,
goto out_unlock; goto out_unlock;
} }
mds_wanted = __ceph_caps_mds_wanted(ci); mds_wanted = __ceph_caps_mds_wanted(ci);
if ((mds_wanted & need) != need) { if (need & ~(mds_wanted & need)) {
dout("get_cap_refs %p caps were dropped" dout("get_cap_refs %p caps were dropped"
" (session killed?)\n", inode); " (session killed?)\n", inode);
*err = -ESTALE; *err = -ESTALE;
ret = 1; ret = 1;
goto out_unlock; goto out_unlock;
} }
if ((mds_wanted & file_wanted) == if (!(file_wanted & ~mds_wanted))
(file_wanted & (CEPH_CAP_FILE_RD|CEPH_CAP_FILE_WR)))
ci->i_ceph_flags &= ~CEPH_I_CAP_DROPPED; ci->i_ceph_flags &= ~CEPH_I_CAP_DROPPED;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册