Skip to content

Commit

Permalink
client: improve the code of setattr for atime/mtime
Browse files Browse the repository at this point in the history
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 <xiubli@redhat.com>
  • Loading branch information
lxbsz committed Oct 11, 2021
1 parent 5df62e4 commit 3a8e870
Showing 1 changed file with 43 additions and 19 deletions.
62 changes: 43 additions & 19 deletions src/client/Client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7614,20 +7614,56 @@ 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;
}
}

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;
}
}

if (!mask) {
in->change_attr++;
return 0;
Expand All @@ -7644,19 +7680,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask,

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);
Expand Down

0 comments on commit 3a8e870

Please sign in to comment.