diff options
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 21 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.h | 3 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-entry.c | 20 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heald.c | 57 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heald.h | 6 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.h | 1 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/pump.c | 39 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 3 | 
8 files changed, 68 insertions, 82 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index 57d069ddc..5ea7bcc2f 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -1243,10 +1243,12 @@ afr_sh_missing_entries_lookup_done (call_frame_t *frame, xlator_t *this,          afr_private_t   *priv = NULL;          ia_type_t       ia_type = IA_INVAL;          int32_t         nsources = 0; +        loc_t           *loc = NULL;          local = frame->local;          sh = &local->self_heal;          priv = this->private; +        loc = &local->loc;          if (op_ret < 0) {                  if (op_errno == EIO) @@ -1281,6 +1283,8 @@ afr_sh_missing_entries_lookup_done (call_frame_t *frame, xlator_t *this,          if (sh->gfid_sh_success_cbk)                  sh->gfid_sh_success_cbk (frame, this);          sh->type = sh->buf[sh->source].ia_type; +        if (uuid_is_null (loc->inode->gfid)) +                uuid_copy (loc->gfid, sh->buf[sh->source].ia_gfid);          sh_missing_entries_create (frame, this);          return;  out: @@ -1846,6 +1850,7 @@ afr_sh_post_nb_entrylk_conflicting_sh_cbk (call_frame_t *frame, xlator_t *this)          if (int_lock->lock_op_ret < 0) {                  gf_log (this->name, GF_LOG_INFO,                          "Non blocking entrylks failed."); +                sh->op_failed = -1;                  afr_sh_missing_entries_done (frame, this);          } else { @@ -2084,9 +2089,9 @@ afr_self_heal (call_frame_t *frame, xlator_t *this, inode_t *inode)          int32_t          op_errno = 0;          int              ret = 0;          afr_self_heal_t *orig_sh = NULL; - -        call_frame_t *sh_frame = NULL; -        afr_local_t  *sh_local = NULL; +        call_frame_t    *sh_frame = NULL; +        afr_local_t     *sh_local = NULL; +        loc_t           *loc   = NULL;          local = frame->local;          orig_sh = &local->self_heal; @@ -2189,6 +2194,13 @@ afr_self_heal (call_frame_t *frame, xlator_t *this, inode_t *inode)                  GF_ASSERT (!uuid_is_null (sh->sh_gfid_req));                  afr_self_heal_gfids (sh_frame, this);          } else { +                loc = &sh_local->loc; +                if (uuid_is_null (loc->inode->gfid) && uuid_is_null (loc->gfid)) { +                        if (!uuid_is_null (inode->gfid)) +                                GF_ASSERT (!uuid_compare (inode->gfid, +                                           sh->sh_gfid_req)); +                        uuid_copy (loc->gfid, sh->sh_gfid_req); +                }                  gf_log (this->name, GF_LOG_TRACE,                          "proceeding to metadata check on %s",                          local->loc.path); @@ -2256,7 +2268,7 @@ afr_self_heal_type_for_transaction (afr_transaction_type type)  }  int -afr_build_child_loc (xlator_t *this, loc_t *child, loc_t *parent, char *name) +afr_build_child_loc (xlator_t *this, loc_t *child, loc_t *parent, char *name, uuid_t gfid)  {          int   ret = -1; @@ -2290,6 +2302,7 @@ afr_build_child_loc (xlator_t *this, loc_t *child, loc_t *parent, char *name)                  ret = -1;                  goto out;          } +        uuid_copy (child->gfid, gfid);          ret = 0;  out: diff --git a/xlators/cluster/afr/src/afr-self-heal-common.h b/xlators/cluster/afr/src/afr-self-heal-common.h index bc0dcd78c..da02bfdcf 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.h +++ b/xlators/cluster/afr/src/afr-self-heal-common.h @@ -124,7 +124,8 @@ typedef int                         xlator_t *this, int32_t op_ret, int32_t op_errno,                         dict_t *xattr);  int -afr_build_child_loc (xlator_t *this, loc_t *child, loc_t *parent, char *name); +afr_build_child_loc (xlator_t *this, loc_t *child, loc_t *parent, char *name, +                     uuid_t gfid);  int  afr_impunge_frame_create (call_frame_t *frame, xlator_t *this,                            int active_source, int ret_child, mode_t entry_mode, diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c index 98ef82fe5..f87de0c1f 100644 --- a/xlators/cluster/afr/src/afr-self-heal-entry.c +++ b/xlators/cluster/afr/src/afr-self-heal-entry.c @@ -177,6 +177,11 @@ afr_sh_entry_erase_pending (call_frame_t *frame, xlator_t *this)          sh = &local->self_heal;          priv = this->private; +        if (sh->entries_skipped) { +                need_unwind = 1; +                sh->op_failed = _gf_true; +                goto out; +        }          afr_sh_pending_to_delta (priv, sh->xattr, sh->delta_matrix, sh->success,                                   priv->child_count, AFR_ENTRY_TRANSACTION); @@ -224,6 +229,7 @@ afr_sh_entry_erase_pending (call_frame_t *frame, xlator_t *this)          }          GF_FREE (erase_xattr); +out:          if (need_unwind)                  afr_sh_entry_finish (frame, this); @@ -721,7 +727,8 @@ afr_sh_entry_expunge_entry (call_frame_t *frame, xlator_t *this,          expunge_sh->active_source = active_src;          expunge_sh->entrybuf = entry->d_stat; -        ret = afr_build_child_loc (this, &expunge_local->loc, &local->loc, name); +        ret = afr_build_child_loc (this, &expunge_local->loc, &local->loc, +                                   name, entry->d_stat.ia_gfid);          if (ret != 0) {                  op_errno = EINVAL;                  goto out; @@ -1706,8 +1713,13 @@ afr_sh_entry_common_lookup_done (call_frame_t *impunge_frame, xlator_t *this,                  afr_update_gfid_from_iatts (gfid, impunge_sh->buf,                                              impunge_sh->success_children,                                              priv->child_count); -                if (uuid_is_null (gfid)) -                        uuid_generate (gfid); +                if (uuid_is_null (gfid)) { +                        sh->entries_skipped = _gf_true; +                        gf_log (this->name, GF_LOG_INFO, "%s: Skipping entry " +                                "self-heal because of gfid absence", +                                impunge_local->loc.path); +                        goto done; +                }                  afr_sh_common_lookup (impunge_frame, this, &impunge_local->loc,                                        afr_sh_entry_common_lookup_done, gfid,                                        AFR_LOOKUP_FAIL_CONFLICTS | @@ -1776,7 +1788,7 @@ afr_sh_entry_impunge_entry (call_frame_t *frame, xlator_t *this,          impunge_local = impunge_frame->local;          ret = afr_build_child_loc (this, &impunge_local->loc, &local->loc, -                                   entry->d_name); +                                   entry->d_name, entry->d_stat.ia_gfid);          if (ret != 0) {                  op_errno = ENOMEM;                  goto out; diff --git a/xlators/cluster/afr/src/afr-self-heald.c b/xlators/cluster/afr/src/afr-self-heald.c index d0cd2f02d..c75b7fa92 100644 --- a/xlators/cluster/afr/src/afr-self-heald.c +++ b/xlators/cluster/afr/src/afr-self-heald.c @@ -27,7 +27,7 @@  #include "afr-self-heal-common.h"  static int -_crawl_directory (loc_t *loc, pid_t pid, uuid_t gfid); +_crawl_directory (loc_t *loc, pid_t pid);  static int  get_pathinfo_host (char *pathinfo, char *hostname, size_t size)  { @@ -85,20 +85,6 @@ out:  }  inline void -afr_generate_gfid_on_empty (uuid_t gfid) -{ -        if (uuid_is_null (gfid)) -                uuid_generate (gfid); -} - -inline void -afr_empty_gfid_on_set (uuid_t gfid, int lookup_status, struct iatt *iatt) -{ -        if (lookup_status || !uuid_compare (gfid, iatt->ia_gfid)) -                uuid_clear (gfid); -} - -inline void  afr_fill_loc_info (loc_t *loc, struct iatt *iatt, struct iatt *parent)  {          afr_update_loc_gfids (loc, iatt, parent); @@ -107,7 +93,7 @@ afr_fill_loc_info (loc_t *loc, struct iatt *iatt, struct iatt *parent)  static int  _perform_self_heal (xlator_t *this, loc_t *parentloc, gf_dirent_t *entries, -                    uuid_t gfid, off_t *offset, pid_t pid) +                    off_t *offset, pid_t pid)  {          gf_dirent_t      *entry = NULL;          gf_dirent_t      *tmp = NULL; @@ -115,57 +101,45 @@ _perform_self_heal (xlator_t *this, loc_t *parentloc, gf_dirent_t *entries,          struct iatt      parent = {0};;          int              ret = 0;          loc_t            entry_loc = {0}; -        dict_t           *xattr_req = NULL; - -        xattr_req = dict_new (); -        if (!xattr_req) { -                ret = -1; -                goto out; -        }          list_for_each_entry_safe (entry, tmp, &entries->list, list) {                  *offset = entry->d_off;                  if (IS_ENTRY_CWD (entry->d_name) ||                      IS_ENTRY_PARENT (entry->d_name))                          continue; - -                ret = dict_reset (xattr_req); -                if (ret) -                        goto out; +                if (uuid_is_null (entry->d_stat.ia_gfid)) { +                        gf_log (this->name, GF_LOG_WARNING, "%s/%s: No " +                                "gfid present skipping", +                                parentloc->path, entry->d_name); +                        continue; +                }                  loc_wipe (&entry_loc); -                ret = afr_build_child_loc (this, &entry_loc, -                                           parentloc, entry->d_name); +                ret = afr_build_child_loc (this, &entry_loc, parentloc, +                                           entry->d_name, entry->d_stat.ia_gfid);                  if (ret)                          goto out; -                afr_generate_gfid_on_empty (gfid); -                ret = afr_set_dict_gfid (xattr_req, gfid); -                if (ret) -                        goto out;                  gf_log (this->name, GF_LOG_DEBUG, "lookup %s", entry_loc.path); -                ret = syncop_lookup (this, &entry_loc, xattr_req, +                ret = syncop_lookup (this, &entry_loc, NULL,                                       &iatt, NULL, &parent); -                afr_empty_gfid_on_set (gfid, ret, &iatt);                  //Don't fail the crawl if lookup fails as it                  //could be because of split-brain                  if (ret || (!IA_ISDIR (iatt.ia_type)))                          continue;                  afr_fill_loc_info (&entry_loc, &iatt, &parent); -                ret = _crawl_directory (&entry_loc, pid, gfid); +                ret = _crawl_directory (&entry_loc, pid);          }          ret = 0;  out: -        if (xattr_req) -                dict_unref (xattr_req);          if (entry_loc.path)                  loc_wipe (&entry_loc);          return ret;  }  static int -_crawl_directory (loc_t *loc, pid_t pid, uuid_t gfid) +_crawl_directory (loc_t *loc, pid_t pid)  {          xlator_t        *this = NULL;          afr_private_t   *priv = NULL; @@ -217,7 +191,7 @@ _crawl_directory (loc_t *loc, pid_t pid, uuid_t gfid)                  if (list_empty (&entries.list))                          goto out; -                ret = _perform_self_heal (this, loc, &entries, gfid, &offset, pid); +                ret = _perform_self_heal (this, loc, &entries, &offset, pid);                  gf_dirent_free (&entries);                  free_entries = _gf_false;          } @@ -382,7 +356,6 @@ afr_crawl_directory (xlator_t *this, pid_t pid)          loc_t            loc = {0};          gf_boolean_t     crawl = _gf_false;          int             ret = 0; -        uuid_t          gfid = {0};          priv = this->private;          shd = &priv->shd; @@ -409,7 +382,7 @@ afr_crawl_directory (xlator_t *this, pid_t pid)          afr_build_root_loc (priv->root_inode, &loc);          while (crawl) { -                ret = _crawl_directory (&loc, pid, gfid); +                ret = _crawl_directory (&loc, pid);                  if (ret)                          gf_log (this->name, GF_LOG_ERROR, "Crawl failed");                  else diff --git a/xlators/cluster/afr/src/afr-self-heald.h b/xlators/cluster/afr/src/afr-self-heald.h index d5f9552c1..6eb119b07 100644 --- a/xlators/cluster/afr/src/afr-self-heald.h +++ b/xlators/cluster/afr/src/afr-self-heald.h @@ -38,12 +38,6 @@ void afr_build_root_loc (inode_t *inode, loc_t *loc);  int afr_set_root_gfid (dict_t *dict);  inline void -afr_generate_gfid_on_empty (uuid_t gfid); - -inline void -afr_empty_gfid_on_set (uuid_t gfid, int lookup_status, struct iatt *iatt); - -inline void  afr_fill_loc_info (loc_t *loc, struct iatt *iatt, struct iatt *parent);  #endif /* __AFR_SELF_HEALD_H__ */ diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 45b09f7dd..e1f13b376 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -227,6 +227,7 @@ typedef struct {          mode_t impunging_entry_mode;          const char *linkname; +        gf_boolean_t entries_skipped;          int   op_failed; diff --git a/xlators/cluster/afr/src/pump.c b/xlators/cluster/afr/src/pump.c index aeb2ea760..007daa6f1 100644 --- a/xlators/cluster/afr/src/pump.c +++ b/xlators/cluster/afr/src/pump.c @@ -323,7 +323,7 @@ pump_save_file_stats (xlator_t *this, const char *path)  }  static int -gf_pump_traverse_directory (loc_t *loc, uuid_t gfid) +gf_pump_traverse_directory (loc_t *loc)  {          xlator_t        *this              = NULL;          fd_t            *fd                = NULL; @@ -337,15 +337,8 @@ gf_pump_traverse_directory (loc_t *loc, uuid_t gfid)  	dict_t          *xattr_rsp         = NULL;          int             ret                = 0;          gf_boolean_t    is_directory_empty = _gf_true; -        dict_t          *xattr_req         = NULL;          gf_boolean_t    free_entries       = _gf_false; -        xattr_req = dict_new (); -        if (!xattr_req) { -                ret = -1; -                goto out; -        } -          INIT_LIST_HEAD (&entries.list);          this = THIS; @@ -382,9 +375,17 @@ gf_pump_traverse_directory (loc_t *loc, uuid_t gfid)                          gf_log (this->name, GF_LOG_DEBUG,                                  "found readdir entry=%s", entry->d_name); +                        offset = entry->d_off; +                        if (uuid_is_null (entry->d_stat.ia_gfid)) { +                                gf_log (this->name, GF_LOG_WARNING, "%s/%s: No " +                                        "gfid present skipping", +                                        loc->path, entry->d_name); +                                continue; +                        }                          loc_wipe (&entry_loc); -                        ret = afr_build_child_loc (this, &entry_loc, -                                                   loc, entry->d_name); +                        ret = afr_build_child_loc (this, &entry_loc, loc, +                                                   entry->d_name, +                                                   entry->d_stat.ia_gfid);                          if (ret)                                  goto out; @@ -397,17 +398,9 @@ gf_pump_traverse_directory (loc_t *loc, uuid_t gfid)                                              entry_loc.path,                                              iatt.ia_ino); -                                    afr_generate_gfid_on_empty (gfid); -                                    ret = dict_reset (xattr_req); -                                    if (ret) -                                            goto out; -                                    ret = afr_set_dict_gfid (xattr_req, gfid); -                                    if (ret) -                                            goto out; -                                    ret = syncop_lookup (this, &entry_loc, xattr_req, +                                    ret = syncop_lookup (this, &entry_loc, NULL,                                                           &iatt, &xattr_rsp, &parent); -                                    afr_empty_gfid_on_set (gfid, ret, &iatt);                                      if (ret) {                                              gf_log (this->name, GF_LOG_ERROR,                                                      "%s: lookup failed", @@ -434,11 +427,10 @@ gf_pump_traverse_directory (loc_t *loc, uuid_t gfid)                                                      gf_log (this->name, GF_LOG_TRACE,                                                              "entering dir=%s",                                                              entry->d_name); -                                                    gf_pump_traverse_directory (&entry_loc, gfid); +                                                    gf_pump_traverse_directory (&entry_loc);                                              }                                      }                              } -                        offset = entry->d_off;                  }                  gf_dirent_free (&entries); @@ -456,8 +448,6 @@ gf_pump_traverse_directory (loc_t *loc, uuid_t gfid)          }  out: -        if (xattr_req) -                dict_unref (xattr_req);          if (entry_loc.path)                  loc_wipe (&entry_loc);          if (free_entries) @@ -626,7 +616,6 @@ pump_task (void *data)  	struct iatt iatt, parent;  	dict_t *xattr_rsp = NULL;          dict_t *xattr_req = NULL; -        uuid_t gfid = {0};          int ret = -1; @@ -666,7 +655,7 @@ pump_task (void *data)                  goto out;          } -        gf_pump_traverse_directory (&loc, gfid); +        gf_pump_traverse_directory (&loc);          pump_complete_migration (this);  out: diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 0998eef0d..49f3bc7be 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -260,6 +260,7 @@ unlock:  selfheal:          FRAME_SU_DO (frame, dht_local_t); +        uuid_copy (local->loc.gfid, local->gfid);          ret = dht_selfheal_directory (frame, dht_lookup_selfheal_cbk,                                        &local->loc, layout);  out: @@ -3296,6 +3297,8 @@ dht_mkdir_hashed_cbk (call_frame_t *frame, void *cookie,          local->call_cnt = conf->subvolume_cnt - 1; +        if (uuid_is_null (local->loc.gfid)) +                uuid_copy (local->loc.gfid, stbuf->ia_gfid);          if (local->call_cnt == 0) {                  dht_selfheal_directory (frame, dht_mkdir_selfheal_cbk,                                          &local->loc, layout);  | 
