diff options
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 81 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 4 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 52 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.h | 2 | 
4 files changed, 138 insertions, 1 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 0f77350c181..8e28a7a1b3c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -3181,6 +3181,28 @@ glusterd_reconfigure_shd ()  }  int +glusterd_reconfigure_nfs () +{ +        int             ret             = -1; +        gf_boolean_t    identical       = _gf_false; + +        ret = glusterd_check_nfs_volfile_identical (&identical); +        if (ret) +                goto out; + +        if (identical) { +                ret = 0; +                goto out; +        } + +        ret = glusterd_check_generate_start_nfs (); + +out: +        return ret; +} + + +int  glusterd_check_generate_start_nfs ()  {          int ret = 0; @@ -3304,7 +3326,7 @@ int  glusterd_nodesvcs_handle_reconfigure (glusterd_volinfo_t *volinfo)  {          return glusterd_nodesvcs_batch_op (volinfo, -                                           glusterd_check_generate_start_nfs, +                                           glusterd_reconfigure_nfs,                                             glusterd_reconfigure_shd);  } @@ -5459,3 +5481,60 @@ glusterd_defrag_volume_status_update (glusterd_volinfo_t *volinfo,          return ret;  } + +int +glusterd_check_files_identical (char *filename1, char *filename2, +                                gf_boolean_t *identical) +{ +        int                     ret = -1; +        struct stat             buf1 = {0,}; +        struct stat             buf2 = {0,}; +        uint32_t                cksum1 = 0; +        uint32_t                cksum2 = 0; +        xlator_t                *this = NULL; + +        GF_ASSERT (filename1); +        GF_ASSERT (filename2); +        GF_ASSERT (identical); + +        this = THIS; + +        ret = stat (filename1, &buf1); + +        if (ret) { +                gf_log (this->name, GF_LOG_ERROR, "stat on file: %s failed " +                        "(%s)", filename1, strerror (errno)); +                goto out; +        } + +        ret = stat (filename2, &buf2); + +        if (ret) { +                gf_log (this->name, GF_LOG_ERROR, "stat on file: %s failed " +                        "(%s)", filename2, strerror (errno)); +                goto out; +        } + +        if (buf1.st_size != buf2.st_size) { +                *identical = _gf_false; +                goto out; +        } + +        ret = get_checksum_for_path (filename1, &cksum1); +        if (ret) +                goto out; + + +        ret = get_checksum_for_path (filename2, &cksum2); +        if (ret) +                goto out; + +        if (cksum1 != cksum2) +                *identical = _gf_false; +        else +                *identical = _gf_true; + +out: +        gf_log (this->name, GF_LOG_DEBUG, "Returning with %d", ret); +        return ret; +} diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index 0213f0a1dfe..7b71f05a459 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -438,4 +438,8 @@ glusterd_validate_volume_id (dict_t *op_dict, glusterd_volinfo_t *volinfo);  int  glusterd_defrag_volume_status_update (glusterd_volinfo_t *volinfo,                                        dict_t *rsp_dict); + +int +glusterd_check_files_identical (char *filename1, char *filename2, +                                gf_boolean_t *identical);  #endif diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index 7639607dc53..043f6146b21 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -3345,6 +3345,58 @@ out:  }  int +glusterd_check_nfs_volfile_identical (gf_boolean_t *identical) +{ +        char            nfsvol[PATH_MAX]        = {0,}; +        char            tmpnfsvol[PATH_MAX]     = {0,}; +        glusterd_conf_t *conf                   = NULL; +        xlator_t        *this                   = NULL; +        int             ret                     = -1; +        int             need_unlink             = 0; +        int             tmp_fd                  = -1; + +        this = THIS; + +        GF_ASSERT (this); +        GF_ASSERT (identical); + +        conf = this->private; + +        glusterd_get_nodesvc_volfile ("nfs", conf->workdir, +                                      nfsvol, sizeof (nfsvol)); + +        snprintf (tmpnfsvol, sizeof (tmpnfsvol), "/tmp/gnfs-XXXXXX"); + +        tmp_fd = mkstemp (tmpnfsvol); +        if (tmp_fd < 0) { +                gf_log ("", GF_LOG_WARNING, "Unable to create temp file %s: " +                                "(%s)", tmpnfsvol, strerror (errno)); +                goto out; +        } + +        need_unlink = 1; + +        ret = glusterd_create_global_volfile (build_nfs_graph, +                                              tmpnfsvol, NULL); +        if (ret) +                goto out; + +        ret = glusterd_check_files_identical (nfsvol, tmpnfsvol, +                                              identical); +        if (ret) +                goto out; + +out: +        if (need_unlink) +                unlink (tmpnfsvol); + +        if (tmp_fd >= 0) +                close (tmp_fd); + +        return ret; +} + +int  glusterd_delete_volfile (glusterd_volinfo_t *volinfo,                           glusterd_brickinfo_t *brickinfo)  { diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.h b/xlators/mgmt/glusterd/src/glusterd-volgen.h index feb1796c9bb..9e8370c9428 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.h +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.h @@ -96,4 +96,6 @@ int generate_brick_volfiles (glusterd_volinfo_t *volinfo);  int glusterd_get_volopt_content (gf_boolean_t xml_out);  char*  glusterd_get_trans_type_rb (gf_transport_type ttype); +int +glusterd_check_nfs_volfile_identical (gf_boolean_t *identical);  #endif  | 
