Message ID | 20220310143419.14284-1-vshankar@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | ceph: allow `ceph.dir.rctime' xattr to be updatable | expand |
On 3/10/22 10:34 PM, Venky Shankar wrote: > `rctime' has been a pain point in cephfs due to its buggy > nature - inconsistent values reported and those sorts. > Fixing rctime is non-trivial needing an overall redesign > of the entire nested statistics infrastructure. > > As a workaround, PR > > http://github.com/ceph/ceph/pull/37938 > > allows this extended attribute to be manually set. This allows > users to "fixup" inconsistency rctime values. While this sounds > messy, its probably the wisest approach allowing users/scripts > to workaround buggy rctime values. > > The above PR enables Ceph MDS to allow manually setting > rctime extended attribute with the corresponding user-land > changes. We may as well allow the same to be done via kclient > for parity. > > Signed-off-by: Venky Shankar <vshankar@redhat.com> > --- > fs/ceph/xattr.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c > index afec84088471..8c2dc2c762a4 100644 > --- a/fs/ceph/xattr.c > +++ b/fs/ceph/xattr.c > @@ -366,6 +366,14 @@ static ssize_t ceph_vxattrcb_auth_mds(struct ceph_inode_info *ci, > } > #define XATTR_RSTAT_FIELD(_type, _name) \ > XATTR_NAME_CEPH(_type, _name, VXATTR_FLAG_RSTAT) > +#define XATTR_RSTAT_FIELD_UPDATABLE(_type, _name) \ > + { \ > + .name = CEPH_XATTR_NAME(_type, _name), \ > + .name_size = sizeof (CEPH_XATTR_NAME(_type, _name)), \ > + .getxattr_cb = ceph_vxattrcb_ ## _type ## _ ## _name, \ > + .exists_cb = NULL, \ > + .flags = VXATTR_FLAG_RSTAT, \ > + } > #define XATTR_LAYOUT_FIELD(_type, _name, _field) \ > { \ > .name = CEPH_XATTR_NAME2(_type, _name, _field), \ > @@ -404,7 +412,7 @@ static struct ceph_vxattr ceph_dir_vxattrs[] = { > XATTR_RSTAT_FIELD(dir, rsubdirs), > XATTR_RSTAT_FIELD(dir, rsnaps), > XATTR_RSTAT_FIELD(dir, rbytes), > - XATTR_RSTAT_FIELD(dir, rctime), > + XATTR_RSTAT_FIELD_UPDATABLE(dir, rctime), > { > .name = "ceph.dir.pin", > .name_size = sizeof("ceph.dir.pin"), LGTM. Reviewed-by: Xiubo Li <xiubli@redhat.com>
On Thu, 2022-03-10 at 09:34 -0500, Venky Shankar wrote: > `rctime' has been a pain point in cephfs due to its buggy > nature - inconsistent values reported and those sorts. > Fixing rctime is non-trivial needing an overall redesign > of the entire nested statistics infrastructure. > > As a workaround, PR > > http://github.com/ceph/ceph/pull/37938 > > allows this extended attribute to be manually set. This allows > users to "fixup" inconsistency rctime values. While this sounds > messy, its probably the wisest approach allowing users/scripts > to workaround buggy rctime values. > > The above PR enables Ceph MDS to allow manually setting > rctime extended attribute with the corresponding user-land > changes. We may as well allow the same to be done via kclient > for parity. > > Signed-off-by: Venky Shankar <vshankar@redhat.com> > --- > fs/ceph/xattr.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c > index afec84088471..8c2dc2c762a4 100644 > --- a/fs/ceph/xattr.c > +++ b/fs/ceph/xattr.c > @@ -366,6 +366,14 @@ static ssize_t ceph_vxattrcb_auth_mds(struct ceph_inode_info *ci, > } > #define XATTR_RSTAT_FIELD(_type, _name) \ > XATTR_NAME_CEPH(_type, _name, VXATTR_FLAG_RSTAT) > +#define XATTR_RSTAT_FIELD_UPDATABLE(_type, _name) \ > + { \ > + .name = CEPH_XATTR_NAME(_type, _name), \ > + .name_size = sizeof (CEPH_XATTR_NAME(_type, _name)), \ > + .getxattr_cb = ceph_vxattrcb_ ## _type ## _ ## _name, \ > + .exists_cb = NULL, \ > + .flags = VXATTR_FLAG_RSTAT, \ > + } > #define XATTR_LAYOUT_FIELD(_type, _name, _field) \ > { \ > .name = CEPH_XATTR_NAME2(_type, _name, _field), \ > @@ -404,7 +412,7 @@ static struct ceph_vxattr ceph_dir_vxattrs[] = { > XATTR_RSTAT_FIELD(dir, rsubdirs), > XATTR_RSTAT_FIELD(dir, rsnaps), > XATTR_RSTAT_FIELD(dir, rbytes), > - XATTR_RSTAT_FIELD(dir, rctime), > + XATTR_RSTAT_FIELD_UPDATABLE(dir, rctime), > { > .name = "ceph.dir.pin", > .name_size = sizeof("ceph.dir.pin"), Thanks Venky, looks good. Merged into testing branch.
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index afec84088471..8c2dc2c762a4 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c @@ -366,6 +366,14 @@ static ssize_t ceph_vxattrcb_auth_mds(struct ceph_inode_info *ci, } #define XATTR_RSTAT_FIELD(_type, _name) \ XATTR_NAME_CEPH(_type, _name, VXATTR_FLAG_RSTAT) +#define XATTR_RSTAT_FIELD_UPDATABLE(_type, _name) \ + { \ + .name = CEPH_XATTR_NAME(_type, _name), \ + .name_size = sizeof (CEPH_XATTR_NAME(_type, _name)), \ + .getxattr_cb = ceph_vxattrcb_ ## _type ## _ ## _name, \ + .exists_cb = NULL, \ + .flags = VXATTR_FLAG_RSTAT, \ + } #define XATTR_LAYOUT_FIELD(_type, _name, _field) \ { \ .name = CEPH_XATTR_NAME2(_type, _name, _field), \ @@ -404,7 +412,7 @@ static struct ceph_vxattr ceph_dir_vxattrs[] = { XATTR_RSTAT_FIELD(dir, rsubdirs), XATTR_RSTAT_FIELD(dir, rsnaps), XATTR_RSTAT_FIELD(dir, rbytes), - XATTR_RSTAT_FIELD(dir, rctime), + XATTR_RSTAT_FIELD_UPDATABLE(dir, rctime), { .name = "ceph.dir.pin", .name_size = sizeof("ceph.dir.pin"),
`rctime' has been a pain point in cephfs due to its buggy nature - inconsistent values reported and those sorts. Fixing rctime is non-trivial needing an overall redesign of the entire nested statistics infrastructure. As a workaround, PR http://github.com/ceph/ceph/pull/37938 allows this extended attribute to be manually set. This allows users to "fixup" inconsistency rctime values. While this sounds messy, its probably the wisest approach allowing users/scripts to workaround buggy rctime values. The above PR enables Ceph MDS to allow manually setting rctime extended attribute with the corresponding user-land changes. We may as well allow the same to be done via kclient for parity. Signed-off-by: Venky Shankar <vshankar@redhat.com> --- fs/ceph/xattr.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)