[LU-5296] lod_attr_set() skips attr_set on osp objects incorrectly Created: 04/Jul/14  Updated: 01/Oct/14  Resolved: 10/Jul/14

Status: Resolved
Project: Lustre
Component/s: None
Affects Version/s: Lustre 2.6.0
Fix Version/s: Lustre 2.6.0

Type: Bug Priority: Critical
Reporter: Niu Yawei (Inactive) Assignee: Niu Yawei (Inactive)
Resolution: Fixed Votes: 0
Labels: HB

Issue Links:
Related
is related to LU-4690 sanity test_4: Expect error removing ... Resolved
is related to LU-4515 Test failure sanity-quota test_34: Us... Resolved
Severity: 3
Rank (Obsolete): 14780

 Description   

This is a regression introduced by fix of LU-4690 "lod: separate master object with master stripe" (http://review.whamcloud.com/9511 commit 60e07b972114df24105a3a1bfa7365892f72a4a7).

In lod_attr_set():

        for (i = 0; i < lo->ldo_stripenr; i++) {
                LASSERT(lo->ldo_stripe[i]);
+               if (dt_object_exists(lo->ldo_stripe[i]) == 0)
+                       continue;
                rc = dt_attr_set(env, lo->ldo_stripe[i], attr, handle, capa);
                if (rc) {
                        CERROR("failed declaration: %d\n", rc);

Since dt_object_exists() always return false for the osp object (for OST object), any attr_set to osp object will be skipped mistakenly, and chown/chgrp won't set UID/GID to OST objects at the end.

As per Di's suggestion, we'd add additional IS_DIR checking here.



 Comments   
Comment by Niu Yawei (Inactive) [ 04/Jul/14 ]

http://review.whamcloud.com/10989

Comment by Niu Yawei (Inactive) [ 04/Jul/14 ]

Actually, current osp thread can't handle exceptions gracefully, I opened another ticket to track the problem there. See LU-5297.

Comment by Alex Zhuravlev [ 04/Jul/14 ]

then it's probably better remove this check from LOD ?

Comment by Niu Yawei (Inactive) [ 04/Jul/14 ]

then it's probably better remove this check from LOD ?

I think DNE relies on that check for dir object. Di, any comment on this? Thanks.

Comment by Andreas Dilger [ 04/Jul/14 ]

How does this relate to LU-5006 "chown/chgrp doesn't work for files created by lfs setstripe"?

Comment by Andreas Dilger [ 04/Jul/14 ]

What is the impact of this bug? Does it mean that quota will be incorrect during normal usage? Is it causing test failures?

Comment by Andreas Dilger [ 04/Jul/14 ]

I see in further investigation that this would be causing sanity-quota test_34 failures, but because of LU-4515 this test was being skipped. I've merged the patch from LU-4515 to re-enable test_34 into http://review.whamcloud.com/10989 and increased the priority of this patch to critical so that it will land for 2.6.0.

Comment by Di Wang [ 05/Jul/14 ]

I think DNE relies on that check for dir object. Di, any comment on this? Thanks.

Hmm, If you remove dt_object_exists here then you need move attr_set after real sub-stripes is created in mdd_object_create(), probably something like

diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c
index d85dfef..b7efe22 100644
--- a/lustre/mdd/mdd_dir.c
+++ b/lustre/mdd/mdd_dir.c
@@ -1834,7 +1834,7 @@ static int mdd_object_initialize(const struct lu_env *env,
                                 struct lu_attr *attr, struct thandle *handle,
                                 const struct md_op_spec *spec)
 {
-        int rc;
+        int rc = 0;
         ENTRY;
 
         /*
@@ -1845,7 +1845,6 @@ static int mdd_object_initialize(const struct lu_env *env,
          *  (2) maybe, the child attributes should be set in OSD when creation.
          */
 
-       rc = mdd_attr_set_internal(env, child, attr, handle, 0);
        /* arguments are supposed to stay the same */
        if (S_ISDIR(attr->la_mode)) {
                 /* Add "." and ".." for newly created dir */
@@ -2187,6 +2186,9 @@ static int mdd_object_create(const struct lu_env *env, struct mdd_object *pobj,
                        GOTO(err_destroy, rc);
        }
 
+       rc = mdd_attr_set_internal(env, son, attr, handle, 0);
+       if (rc != 0)
+               GOTO(err_destroy, rc);
 #ifdef CONFIG_FS_POSIX_ACL
        if (def_acl_buf != NULL && def_acl_buf->lb_len > 0 &&
            S_ISDIR(attr->la_mode)) {
Comment by Niu Yawei (Inactive) [ 07/Jul/14 ]

How does this relate to LU-5006 "chown/chgrp doesn't work for files created by lfs setstripe"?

This is not related to that one.

What is the impact of this bug? Does it mean that quota will be incorrect during normal usage? Is it causing test failures?

Quota will be incorrect after chown/chgrp. s-q test-34 will fail.

I see in further investigation that this would be causing sanity-quota test_34 failures, but because of LU-4515 this test was being skipped. I've merged the patch from LU-4515 to re-enable test_34 into http://review.whamcloud.com/10989 and increased the priority of this patch to critical so that it will land for 2.6.0.

Thank you for doing this. Andreas.

Comment by Alex Zhuravlev [ 07/Jul/14 ]

wouldn't it better to remove this attr_set() - we're creating a new object and we do specify attributes for the creation. iirc, we do additional attr_set because it was easy for MDD to initialize ACL/i_mode, but this case demonstrates some issues..

Comment by Niu Yawei (Inactive) [ 07/Jul/14 ]

wouldn't it better to remove this attr_set() - we're creating a new object and we do specify attributes for the creation. iirc, we do additional attr_set because it was easy for MDD to initialize ACL/i_mode, but this case demonstrates some issues..

Alex, we are talking about chown/chgrp case but not creation here.

Comment by Alex Zhuravlev [ 07/Jul/14 ]

sorry, the monday is my only possible excuse..

Comment by Alex Zhuravlev [ 07/Jul/14 ]

hmm, but if we don't have original attr_set() in create path, then we don't this check as well?

Comment by Jodi Levi (Inactive) [ 10/Jul/14 ]

Patch landed to Master.

Generated at Sat Feb 10 01:50:15 UTC 2024 using Jira 9.4.14#940014-sha1:734e6822bbf0d45eff9af51f82432957f73aa32c.