diff options
| -rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 34 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-rebalance.c | 1 | 
2 files changed, 28 insertions, 7 deletions
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 30febceb6af..7ac80e76580 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -1078,17 +1078,24 @@ gf_defrag_migrate_data (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,          while ((ret = syncop_readdirp (this, fd, 131072, offset, NULL,                                         &entries)) != 0) { -                if (ret < 0) -                        break; + +                if (ret < 0) { + +                        gf_log (this->name, GF_LOG_ERROR, "Readdir returned %s." +                                " Aborting migrate-data", +                                strerror(readdir_operrno)); +                        goto out; +                }                  /* Need to keep track of ENOENT errno, that means, there is no                     need to send more readdirp() */                  readdir_operrno = errno; -                free_entries = _gf_true; -                  if (list_empty (&entries.list))                          break; + +                free_entries = _gf_true; +                  list_for_each_entry_safe (entry, tmp, &entries.list, list) {                          if (defrag->defrag_status != GF_DEFRAG_STATUS_STARTED) {                                  ret = 1; @@ -1265,6 +1272,7 @@ gf_defrag_fix_layout (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,          dict_t                  *dict           = NULL;          off_t                    offset         = 0;          struct iatt              iatt           = {0,}; +        int                      readdirp_errno = 0;          ret = syncop_lookup (this, loc, NULL, &iatt, NULL, NULL);          if (ret) { @@ -1300,12 +1308,22 @@ gf_defrag_fix_layout (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,          while ((ret = syncop_readdirp (this, fd, 131072, offset, NULL,                  &entries)) != 0)          { -                if ((ret < 0) || (ret && (errno == ENOENT))) -                        break; -                free_entries = _gf_true; + +                if (ret < 0) { +                        gf_log (this->name, GF_LOG_ERROR, "Readdir returned %s" +                                ". Aborting fix-layout",strerror(errno)); +                        goto out; +                } + +                /* Need to keep track of ENOENT errno, that means, there is no +                   need to send more readdirp() */ +                readdirp_errno = errno;                  if (list_empty (&entries.list))                          break; + +                free_entries = _gf_true; +                  list_for_each_entry_safe (entry, tmp, &entries.list, list) {                          if (defrag->defrag_status != GF_DEFRAG_STATUS_STARTED) {                                  ret = 1; @@ -1381,6 +1399,8 @@ gf_defrag_fix_layout (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,                  gf_dirent_free (&entries);                  free_entries = _gf_false;                  INIT_LIST_HEAD (&entries.list); +                if (readdirp_errno == ENOENT) +                        break;          }          ret = 0; diff --git a/xlators/mgmt/glusterd/src/glusterd-rebalance.c b/xlators/mgmt/glusterd/src/glusterd-rebalance.c index b63f4643bee..eac3255ce4a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-rebalance.c +++ b/xlators/mgmt/glusterd/src/glusterd-rebalance.c @@ -304,6 +304,7 @@ glusterd_handle_defrag_start (glusterd_volinfo_t *volinfo, char *op_errstr,                           "--xlator-option",                           "*replicate*.metadata-self-heal=off",                           "--xlator-option", "*replicate*.entry-self-heal=off", +                         "--xlator-option", "*replicate*.readdir-failover=off",                           NULL);          runner_add_arg (&runner, "--xlator-option");          runner_argprintf ( &runner, "*dht.rebalance-cmd=%d",cmd);  | 
