diff options
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 3 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 7 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 41 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-shared.c | 4 | 
4 files changed, 35 insertions, 20 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 8b4fd5cf37b..c4718997681 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -4172,6 +4172,9 @@ dht_setxattr (call_frame_t *frame, xlator_t *this,                          goto err;                  } +                if (gf_uuid_is_null (local->loc.pargfid)) +                        gf_uuid_copy (local->loc.pargfid, local->loc.parent->gfid); +                  methods->migration_get_dst_subvol(this, local);                  if (!local->rebalance.target_node) { diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index f982bf6ac1a..786db020427 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -542,9 +542,6 @@ struct gf_defrag_info_ {          int32_t                      current_thread_count;          pthread_cond_t               df_wakeup_thread; -        /* Hard link handle requirement */ -        synclock_t                   link_lock; -          /* lock migration flag */          gf_boolean_t                 lock_migration_enabled; @@ -645,6 +642,10 @@ struct dht_conf {          gf_boolean_t    lock_migration_enabled;          gf_lock_t       lock; + +        /* Hard link handle requirement for migration triggered from client*/ +        synclock_t      link_lock; +  };  typedef struct dht_conf dht_conf_t; diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index a1266502d63..ead75abc2a7 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -495,7 +495,7 @@ out:  static int  __check_file_has_hardlink (xlator_t *this, loc_t *loc,                             struct iatt *stbuf, dict_t *xattrs, int flags, -                           gf_defrag_info_t *defrag, int *fop_errno) +                           gf_defrag_info_t *defrag, dht_conf_t *conf, int *fop_errno)  {         int ret = 0; @@ -506,10 +506,10 @@ __check_file_has_hardlink (xlator_t *this, loc_t *loc,         if (stbuf->ia_nlink > 1) {                  /* support for decomission */                  if (flags == GF_DHT_MIGRATE_HARDLINK) { -                        synclock_lock (&defrag->link_lock); +                        synclock_lock (&conf->link_lock);                          ret = gf_defrag_handle_hardlink                                  (this, loc, xattrs, stbuf, fop_errno); -                        synclock_unlock (&defrag->link_lock); +                        synclock_unlock (&conf->link_lock);                          /*                          Returning zero will force the file to be remigrated.                          Checkout gf_defrag_handle_hardlink for more information. @@ -546,7 +546,8 @@ __check_file_has_hardlink (xlator_t *this, loc_t *loc,  static int  __is_file_migratable (xlator_t *this, loc_t *loc,                        struct iatt *stbuf, dict_t *xattrs, int flags, -                                gf_defrag_info_t *defrag, int *fop_errno) +                      gf_defrag_info_t *defrag, dht_conf_t *conf, +                      int *fop_errno)  {          int ret = -1;          int lock_count = 0; @@ -561,7 +562,7 @@ __is_file_migratable (xlator_t *this, loc_t *loc,                  goto out;          } -        if (!defrag->lock_migration_enabled) { +        if (!conf->lock_migration_enabled) {                  ret = dict_get_int32 (xattrs, GLUSTERFS_POSIXLK_COUNT,                                        &lock_count);                  if (ret) { @@ -588,7 +589,7 @@ __is_file_migratable (xlator_t *this, loc_t *loc,          /* Check if file has hardlink*/          ret = __check_file_has_hardlink (this, loc, stbuf, xattrs, -                                         flags, defrag, fop_errno); +                                         flags, defrag, conf, fop_errno);  out:          return ret;  } @@ -1493,11 +1494,19 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,          fd_t                    *linkto_fd              = NULL;          gf_boolean_t            ignore_failure          = _gf_false; + +        /* If defrag is NULL, it should be assumed that migration is triggered +         * from client */          defrag = conf->defrag; -        if (!defrag) + +        /* migration of files from clients is restricted to non-tiered clients +         * for now */ +        if (!defrag && dht_is_tier_xlator (this)) { +                ret = ENOTSUP;                  goto out; +        } -        if (defrag->tier_conf.is_tier) +        if (defrag && defrag->tier_conf.is_tier)                  log_level = GF_LOG_TRACE;          gf_log (this->name, @@ -1526,7 +1535,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,          /* Do not migrate file in case lock migration is not enabled on the           * volume*/ -        if (!defrag->lock_migration_enabled) { +        if (!conf->lock_migration_enabled) {                  ret = dict_set_int32 (dict,                                   GLUSTERFS_POSIXLK_COUNT, sizeof(int32_t));                  if (ret) { @@ -1582,7 +1591,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,          src_ia_prot = stbuf.ia_prot;          /* Check if file can be migrated */ -        ret = __is_file_migratable (this, loc, &stbuf, xattr_rsp, flag, defrag, +        ret = __is_file_migratable (this, loc, &stbuf, xattr_rsp, flag, defrag, conf,                                      fop_errno);          if (ret) {                  if (ret == -2) @@ -1702,7 +1711,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,          /* Check again if file has hardlink */          ret = __check_file_has_hardlink (this, loc, &stbuf, xattr_rsp, -                                         flag, defrag, fop_errno); +                                         flag, defrag, conf, fop_errno);          if (ret) {                  if (ret == -2)                          ret = 0; @@ -1714,7 +1723,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,          /* All I/O happens in this function */ -        if (defrag->cmd == GF_DEFRAG_CMD_START_TIER) { +        if (defrag && defrag->cmd == GF_DEFRAG_CMD_START_TIER) {                  ret = __tier_migrate_data (defrag, from, to, src_fd, dst_fd,                                                      stbuf.ia_size,                                                      file_has_holes, fop_errno); @@ -1773,7 +1782,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,          /* Take meta lock  */ -        if (defrag->lock_migration_enabled) { +        if (conf->lock_migration_enabled) {                  meta_dict = dict_new ();                  if (!meta_dict) {                          gf_msg (this->name, GF_LOG_ERROR, 0, @@ -1821,7 +1830,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,                  }          } -        if (!defrag->lock_migration_enabled) { +        if (!conf->lock_migration_enabled) {                  plock.l_type = F_WRLCK;                  plock.l_start = 0;                  plock.l_len = 0; @@ -2019,7 +2028,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,          }          /* store size of previous migrated file  */ -        if (defrag->tier_conf.is_tier) { +        if (defrag && defrag->tier_conf.is_tier) {                  if (from != TIER_HASHED_SUBVOL) {                          defrag->tier_conf.st_last_promoted_size = stbuf.ia_size;                  } else { @@ -2129,7 +2138,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,  metaunlock: -        if (defrag->lock_migration_enabled && meta_locked) { +        if (conf->lock_migration_enabled && meta_locked) {                  dict_del (meta_dict, GF_META_LOCK_KEY); diff --git a/xlators/cluster/dht/src/dht-shared.c b/xlators/cluster/dht/src/dht-shared.c index 96b9699f228..f84b40a8d91 100644 --- a/xlators/cluster/dht/src/dht-shared.c +++ b/xlators/cluster/dht/src/dht-shared.c @@ -241,6 +241,8 @@ dht_fini (xlator_t *this)                  GF_FREE (conf->subvolume_status); +                synclock_destroy (&conf->link_lock); +                  if (conf->lock_pool)                          mem_pool_destroy (conf->lock_pool); @@ -678,6 +680,7 @@ dht_init (xlator_t *this)          LOCK_INIT (&conf->subvolume_lock);          LOCK_INIT (&conf->layout_lock);          LOCK_INIT (&conf->lock); +        synclock_init (&conf->link_lock, SYNC_LOCK_DEFAULT);          /* We get the commit-hash to set only for rebalance process */          if (dict_get_uint32 (this->options, @@ -733,7 +736,6 @@ dht_init (xlator_t *this)                  defrag->wakeup_crawler = 0; -                synclock_init (&defrag->link_lock, SYNC_LOCK_DEFAULT);                  pthread_mutex_init (&defrag->dfq_mutex, 0);                  pthread_cond_init  (&defrag->parallel_migration_cond, 0);                  pthread_cond_init  (&defrag->rebalance_crawler_alarm, 0);  | 
