diff options
Diffstat (limited to 'xlators/cluster')
| -rw-r--r-- | xlators/cluster/ec/src/ec-heal.c | 60 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-helpers.h | 3 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec.c | 5 | 
3 files changed, 68 insertions, 0 deletions
diff --git a/xlators/cluster/ec/src/ec-heal.c b/xlators/cluster/ec/src/ec-heal.c index 10dc9f158e7..1a353b9b2e7 100644 --- a/xlators/cluster/ec/src/ec-heal.c +++ b/xlators/cluster/ec/src/ec-heal.c @@ -2552,3 +2552,63 @@ fail:      if (func)              func (frame, NULL, this, -1, err, 0, 0, 0, NULL);  } + +int +ec_replace_heal_done (int ret, call_frame_t *heal, void *opaque) +{ +        ec_t *ec = opaque; + +        gf_msg_debug (ec->xl->name, 0, +                "getxattr on bricks is done ret %d", ret); +        return 0; +} + +int32_t +ec_replace_heal (ec_t *ec, inode_t *inode) +{ +        loc_t        loc = {0}; +        int          ret = 0; + +        loc.inode = inode_ref (inode); +        gf_uuid_copy (loc.gfid, inode->gfid); +        ret = syncop_getxattr (ec->xl, &loc, NULL, EC_XATTR_HEAL, +                               NULL, NULL); +        if (ret < 0) +                gf_msg_debug (ec->xl->name, 0, +                        "Heal failed for replace brick ret = %d", ret); + +        loc_wipe (&loc); +        return ret; +} + +int32_t +ec_replace_brick_heal_wrap (void  *opaque) +{ +         ec_t *ec = opaque; +         inode_table_t   *itable = NULL; +         int32_t         ret     = -1; + +         if (ec->xl->itable) +                 itable = ec->xl->itable; +         else +                 goto out; +         ret = ec_replace_heal (ec, itable->root); +out: +         return ret; +} + +int32_t +ec_launch_replace_heal (ec_t *ec) +{ +	int ret = -1; + +        if (!ec) +                return ret; +        ret = synctask_new (ec->xl->ctx->env, ec_replace_brick_heal_wrap, +                            ec_replace_heal_done, NULL, ec); +        if (ret < 0) { +                gf_msg_debug (ec->xl->name, 0, +                        "Heal failed for replace brick ret = %d", ret); +        } +        return ret; +} diff --git a/xlators/cluster/ec/src/ec-helpers.h b/xlators/cluster/ec/src/ec-helpers.h index 14243df54f3..1f39da2c09f 100644 --- a/xlators/cluster/ec/src/ec-helpers.h +++ b/xlators/cluster/ec/src/ec-helpers.h @@ -62,6 +62,9 @@ ec_filter_internal_xattrs (dict_t *xattr);  gf_boolean_t  ec_is_data_fop (glusterfs_fop_t fop); + +int32_t +ec_launch_replace_heal (ec_t *ec);  /*  gf_boolean_t  ec_is_metadata_fop (glusterfs_fop_t fop); diff --git a/xlators/cluster/ec/src/ec.c b/xlators/cluster/ec/src/ec.c index 0dd94dcd542..e8acc2303b9 100644 --- a/xlators/cluster/ec/src/ec.c +++ b/xlators/cluster/ec/src/ec.c @@ -513,6 +513,11 @@ unlock:          if (propagate) {                  error = default_notify (this, event, data);          } + +        if (ec->shd.iamshd && +            ec->xl_notify_count == ec->nodes) { +                ec_launch_replace_heal (ec); +        }  out:          return error;  }  | 
