diff options
| author | Santosh Kumar Pradhan <spradhan@redhat.com> | 2013-10-28 12:46:37 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-11-14 16:07:02 -0800 | 
| commit | e479660d9dd8bf7017c7dc78ccfa6edd9c51ec7a (patch) | |
| tree | 96d4e58b53bef4fddb9455a21deff47ab841a75d /xlators/mgmt/glusterd/src | |
| parent | 2990befa4cf9219f33b21b6c50d3e2afa4b7461b (diff) | |
gNFS: RFE for NFS connection behavior
Implement reconfigure() for NFS xlator so that volume set/reset wont
restart the NFS server process. But few options can not be reconfigured
dynamically e.g. nfs.mem-factor, nfs.port etc which needs NFS to be
restarted.
Change-Id: Ic586fd55b7933c0a3175708d8c41ed0475d74a1c
BUG: 1027409
Signed-off-by: Santosh Kumar Pradhan <spradhan@redhat.com>
Reviewed-on: http://review.gluster.org/6236
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 92 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 6 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 48 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.h | 2 | 
4 files changed, 148 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index f0445cf0b..515c23a8c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -3834,6 +3834,11 @@ glusterd_reconfigure_nfs ()          int             ret             = -1;          gf_boolean_t    identical       = _gf_false; +        /* +         * Check both OLD and NEW volfiles, if they are SAME by size +         * and cksum i.e. "character-by-character". If YES, then +         * NOTHING has been changed, just return. +         */          ret = glusterd_check_nfs_volfile_identical (&identical);          if (ret)                  goto out; @@ -3843,6 +3848,31 @@ glusterd_reconfigure_nfs ()                  goto out;          } +        /* +         * They are not identical. Find out if the topology is changed +         * OR just the volume options. If just the options which got +         * changed, then inform the xlator to reconfigure the options. +         */ +        identical = _gf_false; /* RESET the FLAG */ +        ret = glusterd_check_nfs_topology_identical (&identical); +        if (ret) +                goto out; + +        /* Topology is not changed, but just the options. But write the +         * options to NFS volfile, so that NFS will be reconfigured. +         */ +        if (identical) { +                ret = glusterd_create_nfs_volfile(); +                if (ret == 0) {/* Only if above PASSES */ +                        ret = glusterd_fetchspec_notify (THIS); +                } +                goto out; +        } + +        /* +         * NFS volfile's topology has been changed. NFS server needs +         * to be RESTARTED to ACT on the changed volfile. +         */          ret = glusterd_check_generate_start_nfs ();  out: @@ -6365,6 +6395,68 @@ glusterd_defrag_volume_status_update (glusterd_volinfo_t *volinfo,  }  int +glusterd_check_topology_identical (const char *filename1, +                                   const char *filename2, +                                   gf_boolean_t *identical) +{ +        int                     ret = -1; /* FAILURE */ +        xlator_t                *this = NULL; +        FILE                    *fp1 = NULL; +        FILE                    *fp2 = NULL; +        glusterfs_graph_t       *grph1 = NULL; +        glusterfs_graph_t       *grph2 = NULL; + +        if ((!filename1) || (!filename2) || (!identical)) +                goto out; + +        this = THIS; + +        errno = 0; /* RESET the errno */ + +        /* fopen() the volfile1 to create the graph */ +        fp1 = fopen (filename1, "r"); +        if (fp1 == NULL) { +                gf_log (this->name, GF_LOG_ERROR, "fopen() on file: %s failed " +                        "(%s)", filename1, strerror (errno)); +                goto out; +        } + +        /* fopen() the volfile2 to create the graph */ +        fp2 = fopen (filename2, "r"); +        if (fp2 == NULL) { +                gf_log (this->name, GF_LOG_ERROR, "fopen() on file: %s failed " +                        "(%s)", filename2, strerror (errno)); +                goto out; +        } + +        /* create the graph for filename1 */ +        grph1 = glusterfs_graph_construct(fp1); +        if (grph1 == NULL) +                goto out; + +        /* create the graph for filename2 */ +        grph2 = glusterfs_graph_construct(fp2); +        if (grph2 == NULL) +                goto out; + +        /* compare the graph topology */ +        *identical = is_graph_topology_equal(grph1, grph2); +        ret = 0; /* SUCCESS */ +out: +        if (fp1) +                fclose(fp1); +        if (fp2) +                fclose(fp2); +        if (grph1) +                glusterfs_graph_destroy(grph1); +        if (grph2) +                glusterfs_graph_destroy(grph2); + +        gf_log (this->name, GF_LOG_DEBUG, "Returning with %d", ret); +        return ret; +} + +int  glusterd_check_files_identical (char *filename1, char *filename2,                                  gf_boolean_t *identical)  { diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index 024675c7f..57120fe39 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -456,6 +456,12 @@ glusterd_defrag_volume_status_update (glusterd_volinfo_t *volinfo,  int  glusterd_check_files_identical (char *filename1, char *filename2,                                  gf_boolean_t *identical); + +int +glusterd_check_topology_identical (const char *filename1, +                                   const char *filename2, +                                   gf_boolean_t *identical); +  void  glusterd_volinfo_reset_defrag_stats (glusterd_volinfo_t *volinfo);  int diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index 6af52abe2..0de71a49a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -3440,6 +3440,54 @@ out:  }  int +glusterd_check_nfs_topology_identical (gf_boolean_t *identical) +{ +        char            nfsvol[PATH_MAX]        = {0,}; +        char            tmpnfsvol[PATH_MAX]     = {0,}; +        glusterd_conf_t *conf                   = NULL; +        xlator_t        *this                   = THIS; +        int             ret                     = -1; +        int             tmpclean                = 0; +        int             tmpfd                   = -1; + +        if ((!identical) || (!this) || (!this->private)) +                goto out; + +        conf = (glusterd_conf_t *) this->private; + +        /* Fetch the original NFS volfile */ +        glusterd_get_nodesvc_volfile ("nfs", conf->workdir, +                                      nfsvol, sizeof (nfsvol)); + +        /* Create the temporary NFS volfile */ +        snprintf (tmpnfsvol, sizeof (tmpnfsvol), "/tmp/gnfs-XXXXXX"); +        tmpfd = mkstemp (tmpnfsvol); +        if (tmpfd < 0) { +                gf_log (this->name, GF_LOG_WARNING, +                                    "Unable to create temp file %s: (%s)", +                                    tmpnfsvol, strerror (errno)); +                goto out; +        } + +        tmpclean = 1; /* SET the flag to unlink() tmpfile */ + +        ret = glusterd_create_global_volfile (build_nfs_graph, +                                              tmpnfsvol, NULL); +        if (ret) +                goto out; + +        /* Compare the topology of volfiles */ +        ret = glusterd_check_topology_identical (nfsvol, tmpnfsvol, +                                                 identical); +out: +        if (tmpfd >= 0) +                close (tmpfd); +        if (tmpclean) +                unlink (tmpnfsvol); +        return ret; +} + +int  glusterd_check_nfs_volfile_identical (gf_boolean_t *identical)  {          char            nfsvol[PATH_MAX]        = {0,}; diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.h b/xlators/mgmt/glusterd/src/glusterd-volgen.h index 31bfe980d..2d31c4040 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.h +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.h @@ -144,6 +144,8 @@ char*  glusterd_get_trans_type_rb (gf_transport_type ttype);  int  glusterd_check_nfs_volfile_identical (gf_boolean_t *identical); +int +glusterd_check_nfs_topology_identical (gf_boolean_t *identical);  uint32_t  glusterd_get_op_version_for_key (char *key);  | 
