From a8cb0fcb16d695745c9875807e1774951f05635f Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Mon, 11 Oct 2021 16:45:16 +0800 Subject: [PATCH] client: improve the code of setattr for atime/mtime When the Fw caps is issued and increasing the atime/mtime, we can buffer the atime/mtime. And when the Fs caps is issued and they are not changing we can just ignore them. In case when recovering the atime/mtime maybe decreased, no matter the Fsw caps are issued, always send the request immediatelly. Signed-off-by: Xiubo Li (cherry picked from commit d3d1be4c62a8358569f0fea3a9ac17475c1e173b) --- src/client/Client.cc | 66 +++++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 4261ba140ee0e..13dc52051b27b 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -7709,20 +7709,60 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, } } - if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) { - if (mask & (CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME)) { - if (mask & CEPH_SETATTR_MTIME) - in->mtime = utime_t(stx->stx_mtime); - if (mask & CEPH_SETATTR_ATIME) - in->atime = utime_t(stx->stx_atime); + if (mask & CEPH_SETATTR_MTIME) { + if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) { + in->mtime = utime_t(stx->stx_mtime); + in->ctime = ceph_clock_now(); + in->cap_dirtier_uid = perms.uid(); + in->cap_dirtier_gid = perms.gid(); + in->time_warp_seq++; + in->mark_caps_dirty(CEPH_CAP_FILE_EXCL); + mask &= ~CEPH_SETATTR_MTIME; + } else if (in->caps_issued_mask(CEPH_CAP_FILE_WR) && + utime_t(stx->stx_mtime) > in->mtime) { + in->mtime = utime_t(stx->stx_mtime); + in->ctime = ceph_clock_now(); + in->cap_dirtier_uid = perms.uid(); + in->cap_dirtier_gid = perms.gid(); + in->mark_caps_dirty(CEPH_CAP_FILE_WR); + mask &= ~CEPH_SETATTR_MTIME; + } else if (!in->caps_issued_mask(CEPH_CAP_FILE_SHARED) || + in->mtime != utime_t(stx->stx_mtime)) { + args.setattr.mtime = utime_t(stx->stx_mtime); + inode_drop |= CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_RD | + CEPH_CAP_FILE_WR; + } else { + mask &= ~CEPH_SETATTR_MTIME; + } + } + + if (mask & CEPH_SETATTR_ATIME) { + if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) { + in->atime = utime_t(stx->stx_atime); in->ctime = ceph_clock_now(); in->cap_dirtier_uid = perms.uid(); in->cap_dirtier_gid = perms.gid(); in->time_warp_seq++; in->mark_caps_dirty(CEPH_CAP_FILE_EXCL); - mask &= ~(CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME); + mask &= ~CEPH_SETATTR_ATIME; + } else if (in->caps_issued_mask(CEPH_CAP_FILE_WR) && + utime_t(stx->stx_atime) > in->atime) { + in->atime = utime_t(stx->stx_atime); + in->ctime = ceph_clock_now(); + in->cap_dirtier_uid = perms.uid(); + in->cap_dirtier_gid = perms.gid(); + in->mark_caps_dirty(CEPH_CAP_FILE_WR); + mask &= ~CEPH_SETATTR_ATIME; + } else if (!in->caps_issued_mask(CEPH_CAP_FILE_SHARED) || + in->atime != utime_t(stx->stx_atime)) { + args.setattr.atime = utime_t(stx->stx_atime); + inode_drop |= CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_RD | + CEPH_CAP_FILE_WR; + } else { + mask &= ~CEPH_SETATTR_ATIME; } } + if (!mask) { in->change_attr++; return 0; @@ -7739,19 +7779,7 @@ force_request: req->head.args = args; req->inode_drop = inode_drop; - - if (mask & CEPH_SETATTR_MTIME) { - req->head.args.setattr.mtime = utime_t(stx->stx_mtime); - req->inode_drop |= CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_RD | - CEPH_CAP_FILE_WR; - } - if (mask & CEPH_SETATTR_ATIME) { - req->head.args.setattr.atime = utime_t(stx->stx_atime); - req->inode_drop |= CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_RD | - CEPH_CAP_FILE_WR; - } req->head.args.setattr.mask = mask; - req->regetattr_mask = mask; int res = make_request(req, perms, inp); -- 2.39.5