diff options
| author | M. Mohan Kumar <mohan@in.ibm.com> | 2013-11-13 22:44:42 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-11-13 11:38:55 -0800 | 
| commit | 6ec9c4599e96de9dcae9426eae6bb1dde4dc7549 (patch) | |
| tree | 7a698cd3cbff3e1e6cff5b643da672515cc2754b | |
| parent | 48c40e1a42efe1b59126406084821947d139dd0e (diff) | |
bd: Add BD support to other xlators
Make changes to distributed xlator to work with BD xlator. Unlike files,
a block device can't be removed when its opened. So some part of the
code were moved down to avoid this situation. Also before truncating a
BD file its BD_XATTR should be set otherwise truncate will result in
truncating posix file. So file is created with needed BD_XATTR and
truncate is invoked. Also enables BD xlator in stripe volume type.
Change-Id: If127516e261fac5fc5b137e7fe33e100bc92acc0
BUG: 1028672
Signed-off-by: M. Mohan Kumar <mohan@in.ibm.com>
Reviewed-on: http://review.gluster.org/5235
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
| -rw-r--r-- | libglusterfs/src/glusterfs.h | 4 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 31 | ||||
| -rw-r--r-- | xlators/cluster/stripe/src/stripe.c | 58 | 
3 files changed, 67 insertions, 26 deletions
diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index 474631e3ff9..a2fd48db570 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -88,6 +88,8 @@  #define GF_READDIR_SKIP_DIRS       "readdir-filter-directories" +#define BD_XATTR_KEY             "user.glusterfs" +  #define XATTR_IS_PATHINFO(x)  (strncmp (x, GF_XATTR_PATHINFO_KEY,       \                                          strlen (GF_XATTR_PATHINFO_KEY)) == 0)  #define XATTR_IS_NODE_UUID(x) (strncmp (x, GF_XATTR_NODE_UUID_KEY,      \ @@ -95,6 +97,8 @@  #define XATTR_IS_LOCKINFO(x) (strncmp (x, GF_XATTR_LOCKINFO_KEY,        \                                         strlen (GF_XATTR_LOCKINFO_KEY)) == 0) +#define XATTR_IS_BD(x) (strncmp (x, BD_XATTR_KEY, strlen (BD_XATTR_KEY)) == 0) +  #define GF_XATTR_LINKINFO_KEY   "trusted.distribute.linkinfo"  #define GFID_XATTR_KEY          "trusted.gfid"  #define VIRTUAL_GFID_XATTR_KEY_STR  "glusterfs.gfid.string" diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 56e90f69866..bcb19f23e96 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -243,7 +243,7 @@ out:  static inline int  __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struct iatt *stbuf, -                                 dict_t *dict, fd_t **dst_fd) +                                 dict_t *dict, fd_t **dst_fd, dict_t *xattr)  {          xlator_t    *this = NULL;          int          ret  = -1; @@ -307,6 +307,12 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc                  goto out;          } +        ret = syncop_fsetxattr (to, fd, xattr, 0); +        if (ret == -1) +                gf_log (this->name, GF_LOG_WARNING, +                        "%s: failed to set xattr on %s (%s)", +                        loc->path, to->name, strerror (errno)); +          ret = syncop_ftruncate (to, fd, stbuf->ia_size);          if (ret < 0)                  gf_log (this->name, GF_LOG_ERROR, @@ -723,9 +729,16 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,                  goto out;          } +        /* TODO: move all xattr related operations to fd based operations */ +        ret = syncop_listxattr (from, loc, &xattr); +        if (ret == -1) +                gf_log (this->name, GF_LOG_WARNING, +                        "%s: failed to get xattr from %s (%s)", +                        loc->path, from->name, strerror (errno)); +          /* create the destination, with required modes/xattr */          ret = __dht_rebalance_create_dst_file (to, from, loc, &stbuf, -                                               dict, &dst_fd); +                                               dict, &dst_fd, xattr);          if (ret)                  goto out; @@ -742,6 +755,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,                  goto out;          } +          ret = syncop_fstat (from, src_fd, &stbuf);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, "failed to lookup %s on %s (%s)", @@ -771,19 +785,6 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,                  goto out;          } -        /* TODO: move all xattr related operations to fd based operations */ -        ret = syncop_listxattr (from, loc, &xattr); -        if (ret == -1) -                gf_log (this->name, GF_LOG_WARNING, -                        "%s: failed to get xattr from %s (%s)", -                        loc->path, from->name, strerror (errno)); - -        ret = syncop_setxattr (to, loc, xattr, 0); -        if (ret == -1) -                gf_log (this->name, GF_LOG_WARNING, -                        "%s: failed to set xattr on %s (%s)", -                        loc->path, to->name, strerror (errno)); -          /* TODO: Sync the locks */          ret = syncop_fsync (to, dst_fd, 0); diff --git a/xlators/cluster/stripe/src/stripe.c b/xlators/cluster/stripe/src/stripe.c index d366b352c5b..69b510e231e 100644 --- a/xlators/cluster/stripe/src/stripe.c +++ b/xlators/cluster/stripe/src/stripe.c @@ -4465,6 +4465,37 @@ stripe_setxattr_cbk (call_frame_t *frame, void *cookie,          return 0;  } +#ifdef HAVE_BD_XLATOR +int +stripe_is_bd (dict_t *this, char *key, data_t *value, void *data) +{ +        gf_boolean_t *is_bd = data; + +        if (data == NULL) +                return 0; + +        if (XATTR_IS_BD (key)) +            *is_bd = _gf_true; + +        return 0; +} + +inline gf_boolean_t +stripe_setxattr_is_bd (dict_t *dict) +{ +        gf_boolean_t is_bd = _gf_false; + +        if (dict == NULL) +                goto out; + +        dict_foreach (dict, stripe_is_bd, &is_bd); +out: +        return is_bd; +} +#else +#define stripe_setxattr_is_bd(dict) _gf_false +#endif +  int  stripe_setxattr (call_frame_t *frame, xlator_t *this,                   loc_t *loc, dict_t *dict, int flags, dict_t *xdata) @@ -4474,6 +4505,7 @@ stripe_setxattr (call_frame_t *frame, xlator_t *this,          stripe_private_t *priv     = NULL;          stripe_local_t   *local    = NULL;          int               i        = 0; +        gf_boolean_t      is_bd    = _gf_false;          VALIDATE_OR_GOTO (frame, err);          VALIDATE_OR_GOTO (this, err); @@ -4496,11 +4528,15 @@ stripe_setxattr (call_frame_t *frame, xlator_t *this,          local->wind_count = priv->child_count;          local->op_ret = local->op_errno = 0; +        is_bd = stripe_setxattr_is_bd (dict); +          /**           * Set xattrs for directories on all subvolumes. Additionally -         * this power is only given to a special client. +         * this power is only given to a special client. Bd xlator +         * also needs xattrs for regular files (ie LVs)           */ -        if ((frame->root->pid == GF_CLIENT_PID_GSYNCD) && IA_ISDIR (loc->inode->ia_type)) { +        if (((frame->root->pid == GF_CLIENT_PID_GSYNCD) && +             IA_ISDIR (loc->inode->ia_type)) || is_bd) {                  for (i = 0; i < priv->child_count; i++, trav = trav->next) {                          STACK_WIND (frame, stripe_setxattr_cbk,                                      trav->xlator, trav->xlator->fops->setxattr, @@ -4531,21 +4567,21 @@ stripe_fsetxattr_cbk (call_frame_t *frame, void *cookie,  int -stripe_is_lockinfo (dict_t *this, -                    char *key, -                    data_t *value, -                    void *data) +stripe_is_special_key (dict_t *this, +                       char *key, +                       data_t *value, +                       void *data)  { -        gf_boolean_t *is_lockinfo = NULL; +        gf_boolean_t *is_special = NULL;          if (data == NULL) {                  goto out;          } -        is_lockinfo = data; +        is_special = data; -        if (XATTR_IS_LOCKINFO (key)) -                *is_lockinfo = _gf_true; +        if (XATTR_IS_LOCKINFO (key) || XATTR_IS_BD (key)) +                *is_special = _gf_true;  out:          return 0; @@ -4622,7 +4658,7 @@ stripe_fsetxattr_is_special (dict_t *dict)                  goto out;          } -        dict_foreach (dict, stripe_is_lockinfo, &is_spl); +        dict_foreach (dict, stripe_is_special_key, &is_spl);  out:          return is_spl;  | 
