diff options
| author | N Balachandran <nbalacha@redhat.com> | 2019-04-10 14:28:55 +0530 | 
|---|---|---|
| committer | N Balachandran <nbalacha@redhat.com> | 2019-05-09 17:40:25 +0530 | 
| commit | ab296b5be79ac2859072fd89cda32715f2ac57a5 (patch) | |
| tree | 738c72ec567557a0c14944fc0cead8937f61671d | |
| parent | 7f780f30e5b1c54702a2bf4f5624bac7b8912eee (diff) | |
cluster/dht: Refactor dht lookup functions
Part 2: Modify dht_revalidate_cbk to call
dht_selfheal_directory instead of separate calls
to heal attrs and xattrs.
Change-Id: Id41ac6c4220c2c35484812bbfc6157fc3c86b142
fixes: bz#1707393
Signed-off-by: N Balachandran <nbalacha@redhat.com>
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 104 | 
1 files changed, 30 insertions, 74 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 984789e50e9..bc8de94a7ca 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -1364,7 +1364,6 @@ dht_lookup_dir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          if (local->inode == NULL)              local->inode = inode_ref(inode); -        /* This could be a problem */          dht_iatt_merge(this, &local->stbuf, stbuf);          dht_iatt_merge(this, &local->postparent, postparent); @@ -1508,8 +1507,6 @@ dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      int is_dir = 0;      int is_linkfile = 0;      int follow_link = 0; -    call_frame_t *copy = NULL; -    dht_local_t *copy_local = NULL;      char gfid[GF_UUID_BUF_SIZE] = {0};      uint32_t vol_commit_hash = 0;      xlator_t *subvol = NULL; @@ -1537,17 +1534,16 @@ dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      gf_uuid_unparse(local->loc.gfid, gfid); +    gf_msg_debug(this->name, op_errno, +                 "%s: revalidate lookup on %s returned op_ret %d", +                 local->loc.path, prev->name, op_ret); +      LOCK(&frame->lock);      {          if (gf_uuid_is_null(local->gfid)) {              memcpy(local->gfid, local->loc.gfid, 16);          } -        gf_msg_debug(this->name, op_errno, -                     "revalidate lookup of %s " -                     "returned with op_ret %d", -                     local->loc.path, op_ret); -          if (op_ret == -1) {              local->op_errno = op_errno; @@ -1579,6 +1575,8 @@ dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,                                   local->loc.path);                      local->need_lookup_everywhere = 1; +                } else if (IA_ISDIR(local->loc.inode->ia_type)) { +                    local->need_selfheal = 1;                  }              } @@ -1637,15 +1635,16 @@ dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,                      (local->stbuf.ia_uid != stbuf->ia_uid) ||                      is_permission_different(&local->stbuf.ia_prot,                                              &stbuf->ia_prot)) { -                    local->need_selfheal = 1; +                    local->need_attrheal = 1;                  }              }              if (!dict_get(xattr, conf->mds_xattr_key)) {                  gf_msg_debug(this->name, 0, -                             "internal xattr %s is not present" -                             " on path %s gfid is %s ", -                             conf->mds_xattr_key, local->loc.path, gfid); +                             "%s: internal xattr %s is not present" +                             " on subvol %s(gfid is %s)", +                             local->loc.path, conf->mds_xattr_key, prev->name, +                             gfid);              } else {                  check_mds = dht_dict_get_array(xattr, conf->mds_xattr_key,                                                 mds_xattr_val, 1, &errst); @@ -1733,71 +1732,28 @@ unlock:              local->need_xattr_heal = 0;          if (IA_ISDIR(local->stbuf.ia_type)) { -            /* Code to update all extended attributed from hashed -               subvol to local->xattr and call heal code to heal -               custom xattr from hashed subvol to non-hashed subvol -            */ -            if (local->need_xattr_heal && (local->mds_xattr)) { -                dht_dir_set_heal_xattr(this, local, local->xattr, -                                       local->mds_xattr, NULL, NULL); -                dict_unref(local->mds_xattr); -                local->mds_xattr = NULL; -                local->need_xattr_heal = 0; -                ret = dht_dir_xattr_heal(this, local); -                if (ret) -                    gf_msg(this->name, GF_LOG_ERROR, ret, -                           DHT_MSG_DIR_XATTR_HEAL_FAILED, -                           "xattr heal failed for directory %s " -                           " gfid %s ", -                           local->loc.path, gfid); -            } else { -                /* Call function to save hashed subvol on inode -                   ctx if internal mds xattr is not present and -                   all subvols are up -                */ -                if (inode && !__is_root_gfid(inode->gfid) && (!local->op_ret)) -                    (void)dht_common_mark_mdsxattr(frame, NULL, 1); -            } -        } -        if (local->need_selfheal) { -            local->need_selfheal = 0; -            if (!__is_root_gfid(inode->gfid)) { -                gf_uuid_copy(local->gfid, local->mds_stbuf.ia_gfid); -                local->stbuf.ia_gid = local->mds_stbuf.ia_gid; -                local->stbuf.ia_uid = local->mds_stbuf.ia_uid; -                local->stbuf.ia_prot = local->mds_stbuf.ia_prot; -            } else { -                gf_uuid_copy(local->gfid, local->stbuf.ia_gfid); -                local->stbuf.ia_gid = local->prebuf.ia_gid; -                local->stbuf.ia_uid = local->prebuf.ia_uid; -                local->stbuf.ia_prot = local->prebuf.ia_prot; -            } +            if (!__is_root_gfid(local->loc.inode->gfid) && +                (!dict_get(local->xattr, conf->mds_xattr_key))) +                local->need_selfheal = 1; -            copy = create_frame(this, this->ctx->pool); -            if (copy) { -                copy_local = dht_local_init(copy, &local->loc, NULL, 0); -                if (!copy_local) { -                    DHT_STACK_DESTROY(copy); -                    goto cont; -                } -                copy_local->stbuf = local->stbuf; -                copy_local->mds_stbuf = local->mds_stbuf; -                copy_local->mds_subvol = local->mds_subvol; -                copy->local = copy_local; -                FRAME_SU_DO(copy, dht_local_t); -                ret = synctask_new(this->ctx->env, dht_dir_attr_heal, -                                   dht_dir_attr_heal_done, copy, copy); -                if (ret) { -                    gf_msg(this->name, GF_LOG_ERROR, ENOMEM, -                           DHT_MSG_DIR_ATTR_HEAL_FAILED, -                           "Synctask creation failed to heal attr " -                           "for path %s gfid %s ", -                           local->loc.path, local->gfid); -                    DHT_STACK_DESTROY(copy); +            if (dht_needs_selfheal(frame, this)) { +                if (!__is_root_gfid(local->loc.inode->gfid)) { +                    local->stbuf.ia_gid = local->mds_stbuf.ia_gid; +                    local->stbuf.ia_uid = local->mds_stbuf.ia_uid; +                    local->stbuf.ia_prot = local->mds_stbuf.ia_prot; +                } else { +                    local->stbuf.ia_gid = local->prebuf.ia_gid; +                    local->stbuf.ia_uid = local->prebuf.ia_uid; +                    local->stbuf.ia_prot = local->prebuf.ia_prot;                  } + +                layout = local->layout; +                dht_selfheal_directory(frame, dht_lookup_selfheal_cbk, +                                       &local->loc, layout); +                return 0;              }          } -    cont: +          if (local->layout_mismatch) {              /* Found layout mismatch in the directory, need to                 fix this in the inode context */ @@ -1813,7 +1769,7 @@ unlock:              dht_layout_unref(this, local->layout);              local->layout = NULL; -            /* We know that current cached subvol is no more +            /* We know that current cached subvol is no longer                 valid, get the new one */              local->cached_subvol = NULL;              if (local->xattr_req) {  | 
