diff options
| author | shishirng <shishirng@gluster.com> | 2012-01-18 15:29:15 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2012-02-19 01:31:19 -0800 | 
| commit | 7ba1e1ed45cee56ef51b9c04df99c976546d5d04 (patch) | |
| tree | d3e4121729d51852a120ba5f067aa8a64f39b624 /xlators/mgmt/glusterd/src/glusterd-utils.c | |
| parent | 061d70e8195d082043b071118333b7e3173fa3ec (diff) | |
cluster/dht: Rebalance will be a new glusterfs process
rebalance will not use any maintainance clients. It is replaced by syncops,
with the volfile. Brickop (communication between glusterd<->glusterfs process)
is used for status and stop commands.
Dept-first traversal of dir is maintained, but data is migrated as and when
encounterd.
fix-layout (dir)
do
        Complete migrate-data of dir
        fix-layout (subdir)
done
Rebalance state is saved in the vol file, for restart-ability.
A disconnect event and pidfile state determine the defrag-status
Signed-off-by: shishirng <shishirng@gluster.com>
Change-Id: Iec6c80c84bbb2142d840242c28db3d5f5be94d01
BUG: 763844
Reviewed-on: http://review.gluster.com/2540
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-utils.c')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 54 | 
1 files changed, 54 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 42924a5f68a..9ec9e16f18d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -2016,6 +2016,15 @@ glusterd_import_volinfo (dict_t *vols, int count,                  goto out;          } +        memset (key, 0, sizeof (key)); +        snprintf (key, sizeof (key), "volume%d.rebalance", count); +        ret = dict_get_uint32 (vols, key, &new_volinfo->defrag_cmd); +        if (ret) { +                snprintf (msg, sizeof (msg), "%s missing in payload for %s", +                          key, volname); +                goto out; +        } +          uuid_parse (volume_id_str, new_volinfo->volume_id);          memset (key, 0, sizeof (key)); @@ -2438,6 +2447,7 @@ glusterd_pending_node_get_rpc (glusterd_pending_node_t *pending_node)          struct rpc_clnt *rpc = NULL;          glusterd_brickinfo_t    *brickinfo = NULL;          nodesrv_t               *shd       = NULL; +        glusterd_volinfo_t      *volinfo   = NULL;          GF_VALIDATE_OR_GOTO (THIS->name, pending_node, out);          GF_VALIDATE_OR_GOTO (THIS->name, pending_node->node, out); @@ -2449,6 +2459,11 @@ glusterd_pending_node_get_rpc (glusterd_pending_node_t *pending_node)                  shd       = pending_node->node;                  rpc       = shd->rpc; +        } else if (pending_node->type == GD_NODE_REBALANCE) { +                volinfo = pending_node->node; +                if (volinfo->defrag) +                        rpc = volinfo->defrag->rpc; +          } else {                  GF_ASSERT (0);          } @@ -4811,3 +4826,42 @@ glusterd_get_client_filepath (char *filepath, glusterd_volinfo_t *volinfo,                  snprintf (filepath, PATH_MAX, "%s/%s-fuse.vol",                            path, volinfo->volname);  } + +int +glusterd_volume_defrag_restart (glusterd_volinfo_t *volinfo, char *op_errstr, +                              size_t len, int cmd, defrag_cbk_fn_t cbk) +{ +        glusterd_conf_t         *priv                   = NULL; +        char                     pidfile[PATH_MAX]; +        int                      ret                    = -1; +        pid_t                    pid; + +        priv = THIS->private; +        if (!priv) +                return ret; + +        GLUSTERD_GET_DEFRAG_PID_FILE(pidfile, volinfo, priv); + +        if (!glusterd_is_service_running (pidfile, &pid)) { +                glusterd_handle_defrag_start (volinfo, op_errstr, len, cmd, +                                              cbk); +        } + +        return ret; +} + +int +glusterd_restart_rebalance (glusterd_conf_t *conf) +{ +        glusterd_volinfo_t       *volinfo = NULL; +        int                      ret = 0; +        char                     op_errstr[256]; + +        list_for_each_entry (volinfo, &conf->volumes, vol_list) { +                if (!volinfo->defrag_cmd) +                        continue; +                glusterd_volume_defrag_restart (volinfo, op_errstr, 256, +                                                volinfo->defrag_cmd, NULL); +        } +        return ret; +}  | 
