diff options
Diffstat (limited to 'xlators/cluster/dht/src')
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 1 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-selfheal.c | 199 | 
2 files changed, 12 insertions, 188 deletions
diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 87f60cac3d9..96f7726bc04 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -308,6 +308,7 @@ struct dht_local {                  uint32_t                overlaps_cnt;                  uint32_t                down;                  uint32_t                misc; +                uint32_t                missing_cnt;                  dht_selfheal_dir_cbk_t  dir_cbk;                  dht_selfheal_layout_t   healer;                  dht_need_heal_t         should_heal; diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c index 49540a04c9e..6425bdc506e 100644 --- a/xlators/cluster/dht/src/dht-selfheal.c +++ b/xlators/cluster/dht/src/dht-selfheal.c @@ -364,7 +364,8 @@ dht_should_heal_layout (call_frame_t *frame, dht_layout_t **heal,          ret = dht_layout_anomalies (frame->this, &local->loc, *ondisk,                                      &local->selfheal.hole_cnt,                                      &local->selfheal.overlaps_cnt, -                                    NULL, &local->selfheal.down, +                                    &local->selfheal.missing_cnt, +                                    &local->selfheal.down,                                      &local->selfheal.misc, NULL);          if (ret < 0) @@ -1022,115 +1023,6 @@ dht_layout_index_from_conf (dht_layout_t *layout, xlator_t *xlator)          return i;  } - -static int -dht_selfheal_dir_xattr_for_nameless_lookup (call_frame_t *frame, loc_t *loc, -                                            dht_layout_t  *layout) -{ -        dht_local_t     *local = NULL; -        int             missing_xattr = 0; -        int             i = 0; -        xlator_t        *this = NULL; -        dht_conf_t      *conf = NULL; -        dht_layout_t    *dummy = NULL; -        int             j = 0; - -        local = frame->local; -        this = frame->this; -        conf = this->private; - -        for (i = 0; i < layout->cnt; i++) { -                if (layout->list[i].err != -1 || !layout->list[i].stop) { -                        /* err != -1 would mean xattr present on the directory -                           or the directory is non existent. -                           !layout->list[i].stop would mean layout absent -                        */ - -                        continue; -                } -                missing_xattr++; -        } - -        /* Also account for subvolumes with no-layout. Used for zero'ing out -           the layouts and for setting quota key's if present */ - -        /* Send  where either the subvol is not part of layout, -         * or it is part of the layout but error is non-zero but error -         * is not equal to -1 or ENOENT. -         */ - -        for (i = 0; i < conf->subvolume_cnt; i++) { -                if (dht_is_subvol_part_of_layout (layout, conf->subvolumes[i]) -                    == _gf_false) { -                        missing_xattr++; -                        continue; -                } - -                j = dht_layout_index_from_conf (layout, conf->subvolumes[i]); - -                if ((j != -1) && (layout->list[j].err != -1) && -                   (layout->list[j].err != 0) && -                   (layout->list[j].err != ENOENT)) { -                        missing_xattr++; -                } - -        } - - -        gf_msg_trace (this->name, 0, -                      "%d subvolumes missing xattr for %s", -                      missing_xattr, loc->path); - -        if (missing_xattr == 0) { -                dht_selfheal_dir_finish (frame, this, 0, 1); -                return 0; -        } - -        local->call_cnt = missing_xattr; - -        if (gf_log_get_loglevel () >= GF_LOG_DEBUG) -                dht_log_new_layout_for_dir_selfheal (this, loc, layout); - -        for (i = 0; i < layout->cnt; i++) { -                if (layout->list[i].err != -1 || !layout->list[i].stop) -                        continue; - -                dht_selfheal_dir_xattr_persubvol (frame, loc, layout, i, NULL); - -                if (--missing_xattr == 0) -                        break; -        } - -        dummy = dht_layout_new (this, 1); -        if (!dummy) -                goto out; - -        for (i = 0; i < conf->subvolume_cnt && missing_xattr; i++) { -              if (dht_is_subvol_part_of_layout (layout, conf->subvolumes[i]) -                  == _gf_false) { -                        dht_selfheal_dir_xattr_persubvol (frame, loc, dummy, 0, -                                                          conf->subvolumes[i]); -                        missing_xattr--; -                        continue; -              } - -                j = dht_layout_index_from_conf (layout, conf->subvolumes[i]); - -                if ((j != -1) && (layout->list[j].err != -1) && -                    (layout->list[j].err != ENOENT) && -                    (layout->list[j].err != 0)) { -                        dht_selfheal_dir_xattr_persubvol (frame, loc, dummy, 0, -                                                          conf->subvolumes[i]); -                        missing_xattr--; -                } -        } - -        dht_layout_unref (this, dummy); -out: -        return 0; - -} -  int  dht_selfheal_dir_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                                int op_ret, int op_errno, struct iatt *statpre, @@ -2303,7 +2195,8 @@ dht_selfheal_directory (call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,          dht_layout_anomalies (this, loc, layout,                                &local->selfheal.hole_cnt,                                &local->selfheal.overlaps_cnt, -                              NULL, &local->selfheal.down, +                              &local->selfheal.missing_cnt, +                              &local->selfheal.down,                                &local->selfheal.misc, NULL);          down     = local->selfheal.down; @@ -2332,14 +2225,14 @@ dht_selfheal_directory (call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,          dht_layout_sort_volname (layout);          local->heal_layout = _gf_true; -        ret = dht_selfheal_dir_getafix (frame, loc, layout); -        if (ret == -1) { -                gf_msg (this->name, GF_LOG_INFO, 0, -                        DHT_MSG_DIR_SELFHEAL_FAILED, -                        "Directory selfheal failed: " -                        "Unable to form layout for directory %s", -                        loc->path); +        /* Ignore return value as it can be inferred from result of +         * dht_layout_anomalies +         */ +        dht_selfheal_dir_getafix (frame, loc, layout); + +        if (!(local->selfheal.hole_cnt || local->selfheal.overlaps_cnt || +              local->selfheal.missing_cnt)) {                  local->heal_layout = _gf_false;          } @@ -2359,76 +2252,6 @@ sorry_no_fix:  }  int -dht_selfheal_directory_for_nameless_lookup (call_frame_t *frame, -                                            dht_selfheal_dir_cbk_t dir_cbk, -                                            loc_t *loc, dht_layout_t *layout) -{ -        dht_local_t     *local  = NULL; -        uint32_t        down    = 0; -        uint32_t        misc    = 0; -        int             ret     = 0; -        xlator_t        *this   = NULL; - -        local = frame->local; -        this = frame->this; -        dht_layout_anomalies (this, loc, layout, -                              &local->selfheal.hole_cnt, -                              &local->selfheal.overlaps_cnt, -                              NULL, &local->selfheal.down, -                              &local->selfheal.misc, NULL); - -        down     = local->selfheal.down; -        misc     = local->selfheal.misc; - -        local->selfheal.dir_cbk = dir_cbk; -        local->selfheal.layout = dht_layout_ref (this, layout); - -        if (down) { -                gf_msg (this->name, GF_LOG_WARNING, 0, -                        DHT_MSG_SUBVOL_DOWN_ERROR, -                        "%d subvolumes down -- not fixing", down); -                ret = 0; -                goto sorry_no_fix; -        } - -        if (misc) { -                gf_msg (this->name, GF_LOG_WARNING, 0, -                        DHT_MSG_SUBVOL_ERROR, -                        "%d subvolumes have unrecoverable errors", misc); -                ret = 0; -                goto sorry_no_fix; -        } - -        dht_layout_sort_volname (layout); -        ret = dht_selfheal_dir_getafix (frame, loc, layout); - -        if (ret == -1) { -                gf_msg (this->name, GF_LOG_WARNING, 0, -                        DHT_MSG_LAYOUT_FORM_FAILED, -                        "not able to form layout for the directory"); -                goto sorry_no_fix; -        } - -        ret = dht_selfheal_layout_lock (frame, layout, _gf_false, -                                     dht_selfheal_dir_xattr_for_nameless_lookup, -                                        dht_should_heal_layout); - -        if (ret < 0) { -                goto sorry_no_fix; -        } - -        return 0; - -sorry_no_fix: -        /* TODO: need to put appropriate local->op_errno */ -        dht_selfheal_dir_finish (frame, this, ret, 1); - -        return 0; - - -} - -int  dht_selfheal_restore (call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,                        loc_t *loc, dht_layout_t *layout)  {  | 
