diff options
| author | shishir gowda <sgowda@redhat.com> | 2012-12-12 17:54:57 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2012-12-17 12:46:31 -0500 | 
| commit | 8d9a6685068edaf93d08af91932f14072afc2978 (patch) | |
| tree | 580418b12394ef9eba68d9d06a0fa24a7951ebf6 | |
| parent | 6cd78bb644a2ee1fb34185b5a86002ef4c536173 (diff) | |
cluster/dht: Add "afr.readdir-failover=off" option the rebalance process
By failing over readdir (default behaviour), rebalance could get duplicate
files, as readdir would re-read from offset 0. Rebalance should not attempt
to migrate these files again.
Additionally, we need to handle these cases as failure in rebalance crawl.
BUG: 859387
Change-Id: I77c5c14176bb4d9e593efd6d4739fbc8233bd0c5
Signed-off-by: shishir gowda <sgowda@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/1991
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Tested-by: Vijay Bellur <vbellur@redhat.com>
| -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);  | 
