diff options
| author | Pranith K <pranithk@gluster.com> | 2011-03-10 21:49:04 +0000 | 
|---|---|---|
| committer | Vijay Bellur <vijay@dev.gluster.com> | 2011-03-14 03:08:50 -0700 | 
| commit | 05dbcd0cb2415bb218221eccc1e7005645aa318b (patch) | |
| tree | 1cb7324001287a01a70e52cb3617d34c53da69e2 | |
| parent | 5a8edf3fc4deb4713d390690b144342e24659f8c (diff) | |
mgmt/glusterd: remodel glusterd store
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 1754 ()
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1754
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 4 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 29 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-sm.c | 2 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 946 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.h | 18 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 38 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 2 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 2 | 
8 files changed, 681 insertions, 360 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 7635f15546c..293269edab8 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -2699,7 +2699,7 @@ glusterd_friend_hostname_update (glusterd_peerinfo_t *peerinfo,          GF_FREE (peerinfo->hostname);          peerinfo->hostname = new_hostname;          if (store_update) -                ret = glusterd_store_update_peerinfo (peerinfo); +                ret = glusterd_store_peerinfo (peerinfo);  out:          gf_log ("", GF_LOG_DEBUG, "Returning %d", ret);          return ret; @@ -3136,7 +3136,7 @@ glusterd_friend_add (const char *hoststr, int port,          peerinfo->rpc = rpc;          if (!restore) -                ret = glusterd_store_update_peerinfo (peerinfo); +                ret = glusterd_store_peerinfo (peerinfo);          list_add_tail (&peerinfo->uuid_list, &conf->peers); diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index a1bd2b43f8e..5fbf7c845cc 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -2153,10 +2153,9 @@ glusterd_op_create_volume (dict_t *dict, char **op_errstr)                  i++;          }          list_add_tail (&volinfo->vol_list, &priv->volumes); -        volinfo->version++;          volinfo->defrag_status = 0; -        ret = glusterd_store_create_volume (volinfo); +        ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_INCREMENT);          if (ret)                  goto out; @@ -2224,10 +2223,9 @@ glusterd_op_add_brick (dict_t *dict, char **op_errstr)                  goto out;          } -        volinfo->version++;          volinfo->defrag_status = 0; -        ret = glusterd_store_update_volume (volinfo); +        ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_INCREMENT);          if (ret)                  goto out; @@ -3321,7 +3319,6 @@ glusterd_op_replace_brick (dict_t *dict, dict_t *rsp_dict)  			goto out;  		} -		volinfo->version++;  		volinfo->defrag_status = 0;  		ret = glusterd_check_generate_start_nfs (volinfo); @@ -3330,7 +3327,8 @@ glusterd_op_replace_brick (dict_t *dict, dict_t *rsp_dict)                                  "Failed to generate nfs volume file");  		} -		ret = glusterd_store_update_volume (volinfo); +		ret = glusterd_store_volinfo (volinfo, +                                              GLUSTERD_VOLINFO_VER_AC_INCREMENT);  		if (ret)  			goto out; @@ -3462,7 +3460,7 @@ glusterd_options_reset (glusterd_volinfo_t *volinfo)                  goto out;          } -        ret = glusterd_store_update_volume (volinfo); +        ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_INCREMENT);          if (ret)                  goto out; @@ -3884,7 +3882,7 @@ glusterd_set_marker_gsync (char *master, char *value)                  goto out;          } -        ret = glusterd_store_update_volume (volinfo); +        ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_INCREMENT);          if (ret)                  goto out; @@ -4131,7 +4129,7 @@ glusterd_op_set_volume (dict_t *dict)                          }                  } -                ret = glusterd_store_update_volume (volinfo); +                ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_INCREMENT);                  if (ret)                          goto out; @@ -4167,7 +4165,8 @@ glusterd_op_set_volume (dict_t *dict)                                  }                          } -                        ret = glusterd_store_update_volume (volinfo); +                        ret = glusterd_store_volinfo (volinfo, +                                      GLUSTERD_VOLINFO_VER_AC_INCREMENT);                          if (ret)                                  goto out; @@ -4247,10 +4246,9 @@ glusterd_op_remove_brick (dict_t *dict)          if (ret)                  goto out; -        volinfo->version++;          volinfo->defrag_status = 0; -        ret = glusterd_store_update_volume (volinfo); +        ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_INCREMENT);          if (ret)                  goto out; @@ -4331,7 +4329,7 @@ glusterd_op_start_volume (dict_t *dict, char **op_errstr)          glusterd_set_volume_status (volinfo, GLUSTERD_STATUS_STARTED); -        ret = glusterd_store_update_volume (volinfo); +        ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_INCREMENT);          if (ret)                  goto out; @@ -4612,7 +4610,7 @@ glusterd_op_stop_volume (dict_t *dict)          glusterd_set_volume_status (volinfo, GLUSTERD_STATUS_STOPPED); -        ret = glusterd_store_update_volume (volinfo); +        ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_INCREMENT);          if (ret)                  goto out; @@ -4830,7 +4828,8 @@ glusterd_op_stats_volume (dict_t *dict, char **op_errstr,  		goto out;          } -        ret = glusterd_store_update_volume (volinfo); +        ret = glusterd_store_volinfo (volinfo, +                                      GLUSTERD_VOLINFO_VER_AC_INCREMENT);          if (ret)                  goto out; diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.c b/xlators/mgmt/glusterd/src/glusterd-sm.c index 1b136b738f1..a0c25f521b3 100644 --- a/xlators/mgmt/glusterd/src/glusterd-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-sm.c @@ -989,7 +989,7 @@ glusterd_friend_sm ()                                  goto out;                          } -                        ret = glusterd_store_update_peerinfo (peerinfo); +                        ret = glusterd_store_peerinfo (peerinfo);                          glusterd_destroy_friend_event_context (event);                          GF_FREE (event); diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 657083ede6f..bb8b6b17c64 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -54,123 +54,294 @@  #include <dirent.h>  static int32_t -glusterd_store_create_volume_dir (char *volname) +glusterd_store_mkdir (char *path)  { -        int32_t                 ret = -1; -        char                    path[PATH_MAX] = {0,}; -        glusterd_conf_t         *priv = NULL; +        int32_t     ret = -1; -        GF_ASSERT (volname); -        priv = THIS->private; +        ret = mkdir (path, 0777); -        GF_ASSERT (priv); +        if ((-1 == ret) && (EEXIST != errno)) { +                gf_log ("", GF_LOG_ERROR, "mkdir() failed on path %s," +                        "errno: %s", path, strerror (errno)); +        } else { +                ret = 0; +        } -        snprintf (path, 1024, "%s/vols/%s", priv->workdir, -                  volname); +        return ret; +} -        ret = mkdir (path, 0777); +int32_t +glusterd_store_handle_create_on_absence (glusterd_store_handle_t **shandle, +                                         char *path) +{ +        GF_ASSERT (shandle); +        int32_t     ret = 0; -        if (-1 == ret) { -                gf_log ("", GF_LOG_ERROR, "mkdir() failed on path %s," -                        "errno: %d", path, errno); -                goto out; +        if (*shandle == NULL) { +                ret = glusterd_store_handle_new (path, shandle); + +                if (ret) { +                        gf_log ("", GF_LOG_ERROR, "Unable to create store" +                                " handle for path: %s", path); +                } +        } +        return ret; +} + +int32_t +glusterd_store_mkstemp (glusterd_store_handle_t *shandle) +{ +        int     fd = -1; +        char    tmppath[PATH_MAX] = {0,}; + +        GF_ASSERT (shandle); +        GF_ASSERT (shandle->path); + +        snprintf (tmppath, sizeof (tmppath), "%s.tmp", shandle->path); +        fd = open (tmppath, O_RDWR | O_CREAT | O_TRUNC, 0644); +        if (fd <= 0) { +                gf_log ("glusterd", GF_LOG_ERROR, "Failed to open %s, " +                        "error: %s", tmppath, strerror (errno)); +        } + +        return fd; +} + +int32_t +glusterd_store_rename_tmppath (glusterd_store_handle_t *shandle) +{ +        int32_t         ret = -1; +        char            tmppath[PATH_MAX] = {0,}; + +        GF_ASSERT (shandle); +        GF_ASSERT (shandle->path); + +        snprintf (tmppath, sizeof (tmppath), "%s.tmp", shandle->path); +        ret = rename (tmppath, shandle->path); +        if (ret) { +                gf_log ("glusterd", GF_LOG_ERROR, "Failed to mv %s to %s, " +                        "error: %s", tmppath, shandle->path, strerror (errno));          } -out: -        gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret);          return ret;  }  int32_t -glusterd_store_create_brick (glusterd_volinfo_t *volinfo, -                             glusterd_brickinfo_t *brickinfo, int32_t brick_count) +glusterd_store_unlink_tmppath (glusterd_store_handle_t *shandle) +{ +        int32_t         ret = -1; +        char            tmppath[PATH_MAX] = {0,}; + +        GF_ASSERT (shandle); +        GF_ASSERT (shandle->path); + +        snprintf (tmppath, sizeof (tmppath), "%s.tmp", shandle->path); +        ret = unlink (tmppath); +        if (ret && (errno != ENOENT)) { +                gf_log ("glusterd", GF_LOG_ERROR, "Failed to mv %s to %s, " +                        "error: %s", tmppath, shandle->path, strerror (errno)); +        } else { +                ret = 0; +        } + +        return ret; +} + +static void +glusterd_replace_slash_with_hipen (char *str) +{ +        char                    *ptr = NULL; + +        ptr = strchr (str, '/'); + +        while (ptr) { +                *ptr = '-'; +                ptr = strchr (str, '/'); +        } +} + +int32_t +glusterd_store_create_brick_dir (glusterd_volinfo_t *volinfo)  {          int32_t                 ret = -1; +        char                    brickdirpath[PATH_MAX] = {0,};          glusterd_conf_t         *priv = NULL; -        char                    path[PATH_MAX] = {0,}; -        char                    brickpath[PATH_MAX] = {0,}; -        struct  stat            stbuf = {0,}; -        char                    buf[4096] = {0,}; -        char                    *tmppath = NULL; -        char                    *ptr = NULL; -        glusterd_store_handle_t *shandle = NULL; -        char                    tmpbuf[4096] = {0,};          GF_ASSERT (volinfo); -        GF_ASSERT (brickinfo);          priv = THIS->private; +        GF_ASSERT (priv); + +        GLUSTERD_GET_BRICK_DIR (brickdirpath, volinfo, priv); +        ret = glusterd_store_mkdir (brickdirpath); + +        return ret; +} + +static void +glusterd_store_key_vol_brick_set (glusterd_brickinfo_t *brickinfo, +                                char *key_vol_brick, size_t len) +{ +        GF_ASSERT (brickinfo); +        GF_ASSERT (key_vol_brick); +        GF_ASSERT (len >= PATH_MAX); + +        snprintf (key_vol_brick, len, "%s", brickinfo->path); +        glusterd_replace_slash_with_hipen (key_vol_brick); +} + +static void +glusterd_store_brickinfofname_set (glusterd_brickinfo_t *brickinfo, +                                char *brickfname, size_t len) +{ +        char                    key_vol_brick[PATH_MAX] = {0}; + +        GF_ASSERT (brickfname); +        GF_ASSERT (brickinfo); +        GF_ASSERT (len >= PATH_MAX); + +        glusterd_store_key_vol_brick_set (brickinfo, key_vol_brick, +                                        sizeof (key_vol_brick)); +        snprintf (brickfname, len, "%s:%s", brickinfo->hostname, key_vol_brick); +} + +static void +glusterd_store_brickinfopath_set (glusterd_volinfo_t *volinfo, +                              glusterd_brickinfo_t *brickinfo, +                              char *brickpath, size_t len) +{ +        char                    brickfname[PATH_MAX] = {0}; +        char                    brickdirpath[PATH_MAX] = {0,}; +        glusterd_conf_t         *priv = NULL; + +        GF_ASSERT (brickpath); +        GF_ASSERT (brickinfo); +        GF_ASSERT (len >= PATH_MAX); +        priv = THIS->private;          GF_ASSERT (priv); -        GLUSTERD_GET_BRICK_DIR (path, volinfo, priv); +        GLUSTERD_GET_BRICK_DIR (brickdirpath, volinfo, priv); +        glusterd_store_brickinfofname_set (brickinfo, brickfname, +                                        sizeof (brickfname)); +        snprintf (brickpath, len, "%s/%s", brickdirpath, brickfname); +} -        ret = stat (path, &stbuf); +int32_t +glusterd_store_volinfo_brick_fname_write (int vol_fd, +                                         glusterd_brickinfo_t *brickinfo, +                                         int32_t brick_count) +{ +        char                    key[PATH_MAX] = {0,}; +        char                    brickfname[PATH_MAX] = {0,}; +        int32_t                 ret = -1; -        if (ret == -1 && ENOENT == errno) { -                ret = mkdir (path, 0777); -                if (ret) -                        goto out; -        } +        snprintf (key, sizeof (key), "%s-%d", GLUSTERD_STORE_KEY_VOL_BRICK, +                  brick_count); +        glusterd_store_brickinfofname_set (brickinfo, brickfname, +                                        sizeof (brickfname)); +        ret = glusterd_store_save_value (vol_fd, key, brickfname); +        return ret; +} -        tmppath = gf_strdup (brickinfo->path); +int32_t +glusterd_store_create_brick_shandle_on_absence (glusterd_volinfo_t *volinfo, +                                                glusterd_brickinfo_t *brickinfo) +{ +        char                    brickpath[PATH_MAX] = {0,}; +        int32_t                 ret = 0; -        ptr = strchr (tmppath, '/'); +        GF_ASSERT (volinfo); +        GF_ASSERT (brickinfo); -        while (ptr) { -                *ptr = '-'; -                ptr = strchr (tmppath, '/'); -        } +        glusterd_store_brickinfopath_set (volinfo, brickinfo, brickpath, +                                      sizeof (brickpath)); +        ret = glusterd_store_handle_create_on_absence (&brickinfo->shandle, +                                                       brickpath); +        return ret; +} -        snprintf (brickpath, sizeof (brickpath), "%s/%s:%s", -                  path, brickinfo->hostname, tmppath); +int32_t +glusterd_store_brickinfo_write (int fd, glusterd_brickinfo_t *brickinfo) +{ +        char                    value[256] = {0,}; +        int32_t                 ret = 0; + +        GF_ASSERT (brickinfo); +        GF_ASSERT (fd > 0); -        ret = glusterd_store_handle_new (brickpath, &brickinfo->shandle); +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_BRICK_HOSTNAME, +                                         brickinfo->hostname); +        if (ret) +                goto out; +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_BRICK_PATH, +                                         brickinfo->path);          if (ret)                  goto out; -        shandle = brickinfo->shandle; -        shandle->fd = open (brickpath, O_RDWR | O_CREAT | O_APPEND, 0666); +        snprintf (value, sizeof(value), "%d", brickinfo->port); +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_BRICK_PORT, +                                         value); + +out: +        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); +        return ret; +} + +int32_t +glusterd_store_perform_brick_store (glusterd_brickinfo_t *brickinfo) +{ +        int                         fd = -1; +        int32_t                     ret = -1; +        GF_ASSERT (brickinfo); -        if (shandle->fd < 0) { -                gf_log ("", GF_LOG_ERROR, "Open failed on %s", -                        brickpath); +        fd = glusterd_store_mkstemp (brickinfo->shandle); +        if (fd <= 0) {                  ret = -1;                  goto out;          } - -        snprintf (buf, sizeof(buf), "%s=%s\n", -                  GLUSTERD_STORE_KEY_BRICK_HOSTNAME, brickinfo->hostname); -        ret = write (shandle->fd, buf, strlen(buf)); -        if (ret) -                gf_log ("", GF_LOG_TRACE, "failed to write brick->hostname"); -        snprintf (buf, sizeof(buf), "%s=%s\n", -                  GLUSTERD_STORE_KEY_BRICK_PATH, brickinfo->path); -        ret = write (shandle->fd, buf, strlen(buf)); +        ret = glusterd_store_brickinfo_write (fd, brickinfo);          if (ret) -                gf_log ("", GF_LOG_TRACE, "failed to write brick->path"); -        snprintf (buf, sizeof(buf), "%s=%d\n", -                  GLUSTERD_STORE_KEY_BRICK_PORT, brickinfo->port); -        ret = write (shandle->fd, buf, strlen(buf)); -        if (ret) -                gf_log ("", GF_LOG_TRACE, "failed to write brick->port"); +                goto out; -        ret = 0; +        ret = glusterd_store_rename_tmppath (brickinfo->shandle); +out: +        if (ret && (fd > 0)) +                glusterd_store_unlink_tmppath (brickinfo->shandle); +        if (fd > 0) +                close (fd); +        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); +        return ret; +} -        snprintf (buf, sizeof (buf), "%s-%d",GLUSTERD_STORE_KEY_VOL_BRICK, -                  brick_count); -        snprintf (tmpbuf, sizeof (tmpbuf), "%s:%s", brickinfo->hostname, -                  tmppath); -        ret = glusterd_store_save_value (volinfo->shandle, buf, tmpbuf); +int32_t +glusterd_store_brickinfo (glusterd_volinfo_t *volinfo, +                          glusterd_brickinfo_t *brickinfo, int32_t brick_count, +                          int vol_fd) +{ +        int32_t                 ret = -1; -        GF_FREE (tmppath); +        GF_ASSERT (volinfo); +        GF_ASSERT (brickinfo); + +        ret = glusterd_store_volinfo_brick_fname_write (vol_fd, brickinfo, +                                                       brick_count); +        if (ret) +                goto out; + +        ret = glusterd_store_create_brick_dir (volinfo); +        if (ret) +                goto out; + +        ret = glusterd_store_create_brick_shandle_on_absence (volinfo, +                                                              brickinfo); +        if (ret) +                goto out; +        ret = glusterd_store_perform_brick_store (brickinfo);  out: -        if (shandle->fd > 0) { -                close (shandle->fd); -        }          gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret);          return ret;  } @@ -221,8 +392,10 @@ glusterd_store_delete_brick (glusterd_volinfo_t *volinfo,          }  out: -        if (brickinfo->shandle) +        if (brickinfo->shandle) {                  glusterd_store_handle_destroy (brickinfo->shandle); +                brickinfo->shandle = NULL; +        }          gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret);          return ret;  } @@ -275,16 +448,23 @@ out:          return ret;  } -void _setopts (dict_t *this, char *key, data_t *value, void *data) +void _storeopts (dict_t *this, char *key, data_t *value, void *data)  { -        int                      ret = 0; -        glusterd_store_handle_t *shandle = NULL; -        int                      exists = 0; - +        int32_t                      ret = 0; +        int32_t                      exists = 0; +        glusterd_store_handle_t  *shandle = NULL; -        shandle = (glusterd_store_handle_t *) data; +        shandle = (glusterd_store_handle_t*)data;          GF_ASSERT (shandle); +        GF_ASSERT (shandle->fd > 0); +        GF_ASSERT (shandle->path); +        GF_ASSERT (key); +        GF_ASSERT (value && value->data); + +        if ((!shandle) || (shandle->fd <= 0) || (!shandle->path)) +                return; +          if (!key)                  return;          if (!value || !value->data) @@ -300,7 +480,7 @@ void _setopts (dict_t *this, char *key, data_t *value, void *data)                  return;          } -        ret = glusterd_store_save_value (shandle, key, value->data); +        ret = glusterd_store_save_value (shandle->fd, key, (char*)value->data);          if (ret) {                  gf_log ("", GF_LOG_ERROR, "Unable to write into store"                                  " handle for path: %s", shandle->path); @@ -309,102 +489,224 @@ void _setopts (dict_t *this, char *key, data_t *value, void *data)  }  int32_t -glusterd_store_create_volume (glusterd_volinfo_t *volinfo) +glusterd_volume_exclude_options_write (int fd, glusterd_volinfo_t *volinfo)  { -        int32_t                 ret = -1; -        char                    filepath[PATH_MAX] = {0,}; -        char                    buf[4096] = {0,}; -        glusterd_conf_t         *priv = NULL; -        glusterd_brickinfo_t    *brickinfo = NULL; -        int32_t                 brick_count = 0; - +        GF_ASSERT (fd > 0);          GF_ASSERT (volinfo); -        priv = THIS->private; -        GF_ASSERT (priv); - -        ret = glusterd_store_create_volume_dir (volinfo->volname); - -        if (ret) -                goto out; - -        snprintf (filepath, 1024, "%s/%s/%s/%s", priv->workdir, -                  GLUSTERD_VOLUME_DIR_PREFIX, volinfo->volname, -                  GLUSTERD_VOLUME_INFO_FILE); - -        ret = glusterd_store_handle_new (filepath, &volinfo->shandle); - -        if (ret) { -                gf_log ("", GF_LOG_ERROR, "Unable to create store" -                        " handle for path: %s", filepath); -                goto out; -        } +        char                    buf[4096] = {0,}; +        int32_t                 ret = -1;          snprintf (buf, sizeof (buf), "%d", volinfo->type); -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_TYPE, buf); +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_TYPE, buf);          if (ret)                  goto out;          snprintf (buf, sizeof (buf), "%d", volinfo->brick_count); -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_COUNT, buf); +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_COUNT, buf);          if (ret)                  goto out;          snprintf (buf, sizeof (buf), "%d", volinfo->status); -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_STATUS, buf); +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_STATUS, buf);          if (ret)                  goto out; -/*        snprintf (buf, sizeof (buf), "%d", volinfo->port); -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_PORT, buf); -        if (ret) -                goto out; -*/          snprintf (buf, sizeof (buf), "%d", volinfo->sub_count); -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_SUB_COUNT, buf); +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_SUB_COUNT, +                                         buf);          if (ret)                  goto out;          snprintf (buf, sizeof (buf), "%d", volinfo->version); -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_VERSION, buf); +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_VERSION, +                                         buf);          if (ret)                  goto out;          snprintf (buf, sizeof (buf), "%d", volinfo->transport_type); -        ret = glusterd_store_save_value (volinfo->shandle, -                                         GLUSTERD_STORE_KEY_VOL_TRANSPORT, buf); +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_TRANSPORT, +                                         buf);          if (ret)                  goto out; -        ret = glusterd_store_save_value (volinfo->shandle, -                                         GLUSTERD_STORE_KEY_VOL_ID, +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_ID,                                           uuid_utoa (volinfo->volume_id));          if (ret)                  goto out; +out: +        gf_log ("", GF_LOG_ERROR, "Unable to write volume values" +                " for %s", volinfo->volname); +        return ret; +} + +static void +glusterd_store_voldirpath_set (glusterd_volinfo_t *volinfo, char *voldirpath, +                               size_t len) +{ +        glusterd_conf_t         *priv = NULL; + +        GF_ASSERT (volinfo); +        priv = THIS->private; +        GF_ASSERT (priv); + +        snprintf (voldirpath, len, "%s/%s/%s", priv->workdir, +                  GLUSTERD_VOLUME_DIR_PREFIX, volinfo->volname); +} + +static int32_t +glusterd_store_create_volume_dir (glusterd_volinfo_t *volinfo) +{ +        int32_t                 ret = -1; +        char                    voldirpath[PATH_MAX] = {0,}; + +        GF_ASSERT (volinfo); + +        glusterd_store_voldirpath_set (volinfo, voldirpath, +                                       sizeof (voldirpath)); +        ret = glusterd_store_mkdir (voldirpath); +        gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret); +        return ret; +} + +int32_t +glusterd_store_volinfo_write (int fd, glusterd_volinfo_t *volinfo) +{ +        int32_t                         ret = -1; +        glusterd_store_handle_t         *shandle = NULL; +        GF_ASSERT (fd > 0); +        GF_ASSERT (volinfo); +        GF_ASSERT (volinfo->shandle); + +        shandle = volinfo->shandle; +        ret = glusterd_volume_exclude_options_write (fd, volinfo); +        if (ret) +                goto out; + +        shandle->fd = fd; +        dict_foreach (volinfo->dict, _storeopts, shandle); +        shandle->fd = 0; +out: +        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); +        return ret; +} + +static void +glusterd_store_volfpath_set (glusterd_volinfo_t *volinfo, char *volfpath, +                             size_t len) +{ +        char    voldirpath[PATH_MAX] = {0,}; +        GF_ASSERT (volinfo); +        GF_ASSERT (volfpath); +        GF_ASSERT (len >= PATH_MAX); + +        glusterd_store_voldirpath_set (volinfo, voldirpath, +                                       sizeof (voldirpath)); +        snprintf (volfpath, len, "%s/%s", voldirpath, GLUSTERD_VOLUME_INFO_FILE); +} + +int32_t +glusterd_store_create_vol_shandle_on_absence (glusterd_volinfo_t *volinfo) +{ +        char            volfpath[PATH_MAX] = {0}; +        int32_t         ret = 0; + +        GF_ASSERT (volinfo); + +        glusterd_store_volfpath_set (volinfo, volfpath, sizeof (volfpath)); +        ret = glusterd_store_handle_create_on_absence (&volinfo->shandle, +                                                       volfpath); +        return ret; +} + +int32_t +glusterd_store_brickinfos (glusterd_volinfo_t *volinfo, int vol_fd) +{ +        int32_t                 ret = 0; +        glusterd_brickinfo_t    *brickinfo = NULL; +        int32_t                 brick_count = 0; + +        GF_ASSERT (volinfo); +          list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { -                ret = glusterd_store_create_brick (volinfo, brickinfo, -                                                   brick_count); +                ret = glusterd_store_brickinfo (volinfo, brickinfo, +                                            brick_count, vol_fd);                  if (ret)                          goto out;                  brick_count++;          } +out: +        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); +        return ret; +} -        dict_foreach (volinfo->dict, _setopts, volinfo->shandle); +int32_t +glusterd_store_perform_volume_store (glusterd_volinfo_t *volinfo) +{ +        int                         fd = -1; +        int32_t                     ret = -1; +        GF_ASSERT (volinfo); -        ret = 0; +        fd = glusterd_store_mkstemp (volinfo->shandle); +        if (fd <= 0) { +                ret = -1; +                goto out; +        } + +        ret = glusterd_store_volinfo_write (fd, volinfo); +        if (ret) +                goto out; + +        ret = glusterd_store_brickinfos (volinfo, fd); +        if (ret) +                goto out; +        ret = glusterd_store_rename_tmppath (volinfo->shandle);  out: -        if (ret) { -                glusterd_store_delete_volume (volinfo); +        if (ret && (fd > 0)) +                glusterd_store_unlink_tmppath (volinfo->shandle); +        if (fd > 0) +                close (fd); +        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); +        return ret; +} + +void +glusterd_perform_volinfo_version_action (glusterd_volinfo_t *volinfo, +                                         glusterd_volinfo_ver_ac_t ac) +{ +        GF_ASSERT (volinfo); + +        switch (ac) { +        case GLUSTERD_VOLINFO_VER_AC_NONE: +        break; +        case GLUSTERD_VOLINFO_VER_AC_INCREMENT: +                volinfo->version++; +        break;          } +} + +int32_t +glusterd_store_volinfo (glusterd_volinfo_t *volinfo, glusterd_volinfo_ver_ac_t ac) +{ +        int32_t                 ret = -1; + +        GF_ASSERT (volinfo); +        ret = glusterd_store_create_volume_dir (volinfo); +        if (ret) +                goto out; + +        ret = glusterd_store_create_vol_shandle_on_absence (volinfo); +        if (ret) +                goto out; + +        ret = glusterd_store_perform_volume_store (volinfo); +        if (ret) +                goto out; +        glusterd_perform_volinfo_version_action (volinfo, ac); +out:          gf_log ("", GF_LOG_DEBUG, "Returning %d", ret);          return ret; @@ -478,8 +780,10 @@ stat_failed:  out: -        if (volinfo->shandle) +        if (volinfo->shandle) {                  glusterd_store_handle_destroy (volinfo->shandle); +                volinfo->shandle = NULL; +        }          gf_log ("", GF_LOG_DEBUG, "Returning %d", ret);          return ret; @@ -553,26 +857,17 @@ out:  }  int32_t -glusterd_store_save_value (glusterd_store_handle_t *handle, -                           char *key, char *value) +glusterd_store_save_value (int fd, char *key, char *value)  {          int32_t         ret = -1;          char            buf[4096] = {0,}; -        GF_ASSERT (handle); +        GF_ASSERT (fd > 0);          GF_ASSERT (key);          GF_ASSERT (value); -        handle->fd = open (handle->path, O_RDWR | O_APPEND); - -        if (handle->fd < 0) { -                gf_log ("", GF_LOG_ERROR, "Unable to open %s, errno: %d", -                        handle->path, errno); -                goto out; -        } -          snprintf (buf, sizeof (buf), "%s=%s\n", key, value); -        ret = write (handle->fd, buf, strlen (buf)); +        ret = write (fd, buf, strlen (buf));          if (ret < 0) {                  gf_log ("", GF_LOG_CRITICAL, "Unable to store key: %s," @@ -586,11 +881,6 @@ glusterd_store_save_value (glusterd_store_handle_t *handle,  out: -        if (handle->fd > 0) { -                close (handle->fd); -                handle->fd = -1; -        } -          gf_log ("", GF_LOG_DEBUG, "returning: %d", ret);          return ret;  } @@ -600,39 +890,43 @@ glusterd_store_handle_new (char *path, glusterd_store_handle_t **handle)  {          int32_t                 ret = -1;          glusterd_store_handle_t *shandle = NULL; +        int                     fd = -1; +        char                    *spath = NULL;          shandle = GF_CALLOC (1, sizeof (*shandle), gf_gld_mt_store_handle_t);          if (!shandle)                  goto out; -        shandle->path = gf_strdup (path); +        spath = gf_strdup (path); -        if (!shandle->path) +        if (!spath)                  goto out; -        shandle->fd = open (path, O_RDWR | O_CREAT | O_APPEND, 0644); -        if (!shandle->fd) +        fd = open (path, O_RDWR | O_CREAT | O_APPEND, 0644); +        if (fd <= 0) { +                gf_log ("glusterd", GF_LOG_ERROR, "Failed to open file: %s, " +                        "error: %s", path, strerror (errno));                  goto out; +        } +        shandle->path = spath;          *handle = shandle;          ret = 0;  out: +        if (fd > 0) +                close (fd); +          if (ret == -1) { +                if (spath) +                        GF_FREE (spath);                  if (shandle) { -                        if (shandle->path) -                                GF_FREE (shandle->path); -                        if (shandle->fd > 0) -                                close (shandle->fd);                          GF_FREE (shandle);                  } -        } else { -                close (shandle->fd);          }          gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); -          return ret;  } @@ -676,22 +970,6 @@ out:          return ret;  } - -int32_t -glusterd_store_handle_truncate (glusterd_store_handle_t *handle) -{ -        int32_t         ret = -1; - -        GF_ASSERT (handle); -        GF_ASSERT (handle->path); - -        ret = truncate (handle->path, 0); - -        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); - -        return ret; -} -  int32_t  glusterd_store_uuid ()  { @@ -715,9 +993,16 @@ glusterd_store_uuid ()                  }                  priv->handle = handle; +        } else { +                handle = priv->handle;          } -        ret = glusterd_store_save_value (priv->handle, GLUSTERD_STORE_UUID_KEY, +        handle->fd = open (handle->path, O_RDWR | O_CREAT | O_TRUNC, 0644); +        if (handle->fd <= 0) { +                ret = -1; +                goto out; +        } +        ret = glusterd_store_save_value (handle->fd, GLUSTERD_STORE_UUID_KEY,                                           uuid_utoa (priv->uuid));          if (ret) { @@ -728,11 +1013,14 @@ glusterd_store_uuid ()  out: +        if (handle->fd > 0) { +                close (handle->fd); +                handle->fd = 0; +        }          gf_log ("", GF_LOG_DEBUG, "Returning %d", ret);          return ret;  } -  int32_t  glusterd_retrieve_uuid ()  { @@ -806,7 +1094,7 @@ glusterd_store_iter_new (glusterd_store_handle_t  *shandle,          tmp_iter->fd = fd; -        tmp_iter->file = fdopen (shandle->fd, "r"); +        tmp_iter->file = fdopen (tmp_iter->fd, "r");          if (!tmp_iter->file) {                  gf_log ("", GF_LOG_ERROR, "Unable to open file %s errno: %d", @@ -1169,7 +1457,8 @@ glusterd_store_retrieve_volume (char    *volname)                          volinfo->status = atoi (value);                  } else if (!strncmp (key, GLUSTERD_STORE_KEY_VOL_VERSION,                              strlen (GLUSTERD_STORE_KEY_VOL_VERSION))) { -                        volinfo->version = atoi (value); +                        if (gf_string2uint32 (value, &volinfo->version)) +                                gf_log ("", GF_LOG_ERROR, "%s", strerror(errno));                  } else if (!strncmp (key, GLUSTERD_STORE_KEY_VOL_PORT,                              strlen (GLUSTERD_STORE_KEY_VOL_PORT))) {                          volinfo->port = atoi (value); @@ -1287,85 +1576,6 @@ out:  }  int32_t -glusterd_store_update_volume (glusterd_volinfo_t *volinfo) -{ -        int32_t         ret = -1; -        char            buf[1024] = {0,}; -        glusterd_brickinfo_t    *brickinfo = NULL; -        glusterd_brickinfo_t    *tmp = NULL; -        int32_t         brick_count = 0; - - -        list_for_each_entry (tmp, &volinfo->bricks, brick_list) { -                ret = glusterd_store_delete_brick (volinfo, tmp); -                //if (ret) -                  //      goto out; -        } - -        ret = glusterd_store_handle_truncate (volinfo->shandle); - -        snprintf (buf, sizeof (buf), "%d", volinfo->type); -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_TYPE, buf); -        if (ret) -                goto out; - -        snprintf (buf, sizeof (buf), "%d", volinfo->brick_count); -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_COUNT, buf); -        if (ret) -                goto out; - -        snprintf (buf, sizeof (buf), "%d", volinfo->status); -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_STATUS, buf); -        if (ret) -                goto out; - -        snprintf (buf, sizeof (buf), "%d", volinfo->sub_count); -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_SUB_COUNT, buf); -        if (ret) -                goto out; - -        snprintf (buf, sizeof (buf), "%d", volinfo->version); -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_VERSION, buf); -        if (ret) -                goto out; - -        snprintf (buf, sizeof (buf), "%d", volinfo->transport_type); -        ret = glusterd_store_save_value (volinfo->shandle, -                                         GLUSTERD_STORE_KEY_VOL_TRANSPORT, buf); -        if (ret) -                goto out; - -        ret = glusterd_store_save_value (volinfo->shandle, -                                        GLUSTERD_STORE_KEY_VOL_ID, -                                        uuid_utoa (volinfo->volume_id)); -        if (ret) -                goto out; - -        list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { -                ret = glusterd_store_create_brick (volinfo, brickinfo, -                                                   brick_count); -                if (ret) -                        goto out; -                brick_count++; -        } - -        dict_foreach (volinfo->dict, _setopts, volinfo->shandle); - -        ret = 0; - - -out: -        gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret); - -        return ret; -} - -int32_t  glusterd_store_delete_peerinfo (glusterd_peerinfo_t *peerinfo)  {          int32_t                         ret = -1; @@ -1412,97 +1622,197 @@ glusterd_store_delete_peerinfo (glusterd_peerinfo_t *peerinfo)                  ret = 0;  out: -        if (peerinfo->shandle) -                glusterd_store_handle_destroy(peerinfo->shandle); +        if (peerinfo->shandle) { +                glusterd_store_handle_destroy (peerinfo->shandle); +                peerinfo->shandle = NULL; +        }          gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret);          return ret;  } +void +glusterd_store_peerinfo_dirpath_set (char *path, size_t len) +{ +        glusterd_conf_t                 *priv = NULL; +        GF_ASSERT (path); +        GF_ASSERT (len >= PATH_MAX); + +        priv = THIS->private; +        snprintf (path, len, "%s/peers", priv->workdir); +}  int32_t -glusterd_store_update_peerinfo (glusterd_peerinfo_t *peerinfo) +glusterd_store_create_peer_dir ()  { -        int32_t                         ret = -1; -        struct  stat                    stbuf = {0,}; -        glusterd_conf_t                 *priv = NULL; -        char                            peerdir[PATH_MAX] = {0,}; -        char                            filepath[PATH_MAX] = {0,}; -        char                            buf[4096] = {0,}; -        char                            hostname_path[PATH_MAX] = {0,}; +        int32_t                             ret = 0; +        char                            path[PATH_MAX]; +        glusterd_store_peerinfo_dirpath_set (path, sizeof (path)); +        ret = glusterd_store_mkdir (path); -        if (!peerinfo) { -                ret = 0; -                goto out; -        } +        gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret); +        return ret; +} -        priv = THIS->private; +static void +glusterd_store_uuid_peerpath_set (glusterd_peerinfo_t *peerinfo, char *peerfpath, +                             size_t len) +{ +        char                    peerdir[PATH_MAX]; +        char                    str[50] = {0}; -        snprintf (peerdir, PATH_MAX, "%s/peers", priv->workdir); +        GF_ASSERT (peerinfo); +        GF_ASSERT (peerfpath); +        GF_ASSERT (len >= PATH_MAX); -        ret = stat (peerdir, &stbuf); +        glusterd_store_peerinfo_dirpath_set (peerdir, sizeof (peerdir)); +        uuid_unparse (peerinfo->uuid, str); +        snprintf (peerfpath, len, "%s/%s", peerdir, str); +} -        if (-1 == ret) { -                ret = mkdir (peerdir, 0777); -                if (ret) -                        goto out; -        } +static void +glusterd_store_hostname_peerpath_set (glusterd_peerinfo_t *peerinfo, +                                       char *peerfpath, size_t len) +{ +        char                    peerdir[PATH_MAX]; -        if (uuid_is_null (peerinfo->uuid)) { +        GF_ASSERT (peerinfo); +        GF_ASSERT (peerfpath); +        GF_ASSERT (len >= PATH_MAX); -                if (peerinfo->hostname) { -                        snprintf (filepath, PATH_MAX, "%s/%s", peerdir, -                                  peerinfo->hostname); -                } else { -                       ret = 0; -                       goto out; -                } -        } else { +        glusterd_store_peerinfo_dirpath_set (peerdir, sizeof (peerdir)); +        snprintf (peerfpath, len, "%s/%s", peerdir, peerinfo->hostname); +} -                snprintf (filepath, PATH_MAX, "%s/%s", peerdir, -                          uuid_utoa (peerinfo->uuid)); -                snprintf (hostname_path, PATH_MAX, "%s/%s", -                          peerdir, peerinfo->hostname); +int32_t +glusterd_store_peerinfo_hostname_shandle_create (glusterd_peerinfo_t *peerinfo) +{ +        char                    peerfpath[PATH_MAX]; +        int32_t                 ret = -1; -                ret = stat (hostname_path, &stbuf); +        glusterd_store_hostname_peerpath_set (peerinfo, peerfpath, +                                              sizeof (peerfpath)); +        ret = glusterd_store_handle_create_on_absence (&peerinfo->shandle, +                                                       peerfpath); +        return ret; +} -                if (!ret) { -                        gf_log ("", GF_LOG_DEBUG, "Destroying store handle"); +int32_t +glusterd_store_peerinfo_uuid_shandle_create (glusterd_peerinfo_t *peerinfo) +{ +        char                    peerfpath[PATH_MAX]; +        int32_t                 ret = -1; + +        glusterd_store_uuid_peerpath_set (peerinfo, peerfpath, +                                          sizeof (peerfpath)); +        ret = glusterd_store_handle_create_on_absence (&peerinfo->shandle, +                                                       peerfpath); +        return ret; +} + +int32_t +glusterd_peerinfo_hostname_shandle_check_destroy (glusterd_peerinfo_t *peerinfo) +{ +        char                    peerfpath[PATH_MAX]; +        int32_t                 ret = -1; +        struct  stat            stbuf = {0,}; + +        glusterd_store_hostname_peerpath_set (peerinfo, peerfpath, +                                              sizeof (peerfpath)); +        ret = stat (peerfpath, &stbuf); +        if (!ret) { +                if (peerinfo->shandle)                          glusterd_store_handle_destroy (peerinfo->shandle); -                        peerinfo->shandle = NULL; -                        ret = remove (hostname_path); -                } +                peerinfo->shandle = NULL; +                ret = unlink (peerfpath);          } +        return ret; +} +int32_t +glusterd_store_create_peer_shandle (glusterd_peerinfo_t *peerinfo) +{ +        int32_t                 ret = 0; -        if (!peerinfo->shandle) { -                ret = glusterd_store_handle_new (filepath, &peerinfo->shandle); -                if (ret) -                        goto out; -                ret = glusterd_store_handle_truncate (peerinfo->shandle); +        GF_ASSERT (peerinfo); + +        if (glusterd_peerinfo_is_uuid_unknown (peerinfo)) { +                ret = glusterd_store_peerinfo_hostname_shandle_create (peerinfo);          } else { -                ret = glusterd_store_handle_truncate (peerinfo->shandle); -                if (ret) -                        goto out; +                ret = glusterd_peerinfo_hostname_shandle_check_destroy (peerinfo); +                ret = glusterd_store_peerinfo_uuid_shandle_create (peerinfo);          } +        return ret; +} -        ret = glusterd_store_save_value (peerinfo->shandle, -                                         GLUSTERD_STORE_KEY_PEER_UUID, +int32_t +glusterd_store_peer_write (int fd, glusterd_peerinfo_t *peerinfo) +{ +        char                    buf[50] = {0}; +        int32_t                 ret = 0; + +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_PEER_UUID,                                           uuid_utoa (peerinfo->uuid));          if (ret)                  goto out;          snprintf (buf, sizeof (buf), "%d", peerinfo->state.state); -        ret = glusterd_store_save_value (peerinfo->shandle, -                                         GLUSTERD_STORE_KEY_PEER_STATE, buf); +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_PEER_STATE, buf);          if (ret)                  goto out; -        ret = glusterd_store_save_value (peerinfo->shandle, -                                         GLUSTERD_STORE_KEY_PEER_HOSTNAME "1", +        ret = glusterd_store_save_value (fd, GLUSTERD_STORE_KEY_PEER_HOSTNAME "1",                                           peerinfo->hostname); +out: +        gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret); +        return ret; +} + +int32_t +glusterd_store_perform_peer_store (glusterd_peerinfo_t *peerinfo) +{ +        int                                 fd = -1; +        int32_t                             ret = -1; + +        GF_ASSERT (peerinfo); + +        fd = glusterd_store_mkstemp (peerinfo->shandle); +        if (fd <= 0) { +                ret = -1; +                goto out; +        } + +        ret = glusterd_store_peer_write (fd, peerinfo); +        if (ret) +                goto out; + +        ret = glusterd_store_rename_tmppath (peerinfo->shandle); +out: +        if (ret && (fd > 0)) +                glusterd_store_unlink_tmppath (peerinfo->shandle); +        if (fd > 0) +                close (fd); +        gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); +        return ret; +} + +int32_t +glusterd_store_peerinfo (glusterd_peerinfo_t *peerinfo) +{ +        int32_t                         ret = -1; + +        GF_ASSERT (peerinfo); +        ret = glusterd_store_create_peer_dir (); +        if (ret) +                goto out; + +        ret = glusterd_store_create_peer_shandle (peerinfo); +        if (ret) +                goto out; + +        ret = glusterd_store_perform_peer_store (peerinfo);  out:          gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret);          return ret; @@ -1645,7 +1955,7 @@ out:  int32_t  glusterd_restore ()  { -        int             ret = -1; +        int32_t         ret = -1;          xlator_t        *this = NULL;          this = THIS; diff --git a/xlators/mgmt/glusterd/src/glusterd-store.h b/xlators/mgmt/glusterd/src/glusterd-store.h index 472a6ef4ffe..0403c10f955 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.h +++ b/xlators/mgmt/glusterd/src/glusterd-store.h @@ -37,6 +37,11 @@  #include "glusterd.h"  #include "rpcsvc.h" +typedef enum glusterd_store_ver_ac_{ +        GLUSTERD_VOLINFO_VER_AC_NONE = 0, +        GLUSTERD_VOLINFO_VER_AC_INCREMENT = 1, +} glusterd_volinfo_ver_ac_t; +  #define GLUSTERD_STORE_UUID_KEY           "UUID" @@ -80,7 +85,7 @@ typedef enum {  } glusterd_store_op_errno_t;  int32_t -glusterd_store_create_volume (glusterd_volinfo_t *volinfo); +glusterd_store_volinfo (glusterd_volinfo_t *volinfo, glusterd_volinfo_ver_ac_t ac);  int32_t  glusterd_store_delete_volume (glusterd_volinfo_t *volinfo); @@ -92,21 +97,17 @@ int32_t  glusterd_store_handle_new (char *path, glusterd_store_handle_t **handle);  int32_t -glusterd_store_save_value (glusterd_store_handle_t *handle, -                           char *key, char *value); +glusterd_store_save_value (int fd, char *key, char *value);  int32_t  glusterd_store_retrieve_value (glusterd_store_handle_t *handle,                                 char *key, char **value);  int32_t -glusterd_store_update_volume (glusterd_volinfo_t *volinfo); - -int32_t  glusterd_retrieve_uuid ();  int32_t -glusterd_store_update_peerinfo (glusterd_peerinfo_t *peerinfo); +glusterd_store_peerinfo (glusterd_peerinfo_t *peerinfo);  int32_t  glusterd_store_delete_peerinfo (glusterd_peerinfo_t *peerinfo); @@ -121,4 +122,7 @@ glusterd_store_handle_destroy (glusterd_store_handle_t *handle);  int32_t  glusterd_restore (); +void +glusterd_perform_volinfo_version_action (glusterd_volinfo_t *volinfo, +                                         glusterd_volinfo_ver_ac_t ac);  #endif diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 458cd6c5888..e3a509af1b7 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1126,6 +1126,7 @@ glusterd_volume_stop_glusterfs (glusterd_volinfo_t  *volinfo,          ret = glusterd_service_stop ("brick", pidfile, SIGTERM, _gf_false);          if (ret == 0) {                  ret = glusterd_brick_unlink_socket_file (volinfo, brickinfo); +                brickinfo->port = 0;          }          return ret;  } @@ -1195,7 +1196,7 @@ glusterd_volume_compute_cksum (glusterd_volinfo_t  *volinfo)                    GLUSTERD_VOLUME_INFO_FILE);          snprintf (sort_filepath, sizeof (sort_filepath), "/tmp/%s.XXXXXX",                    volinfo->volname); -        sort_fd = mkstemp(sort_filepath); +        sort_fd = mkstemp (sort_filepath);          if (sort_fd < 0) {                  gf_log ("", GF_LOG_ERROR, "Could not generate temp file, "                          "reason: %s for volume: %s", strerror (errno), @@ -1203,7 +1204,6 @@ glusterd_volume_compute_cksum (glusterd_volinfo_t  *volinfo)                  goto out;          } else {                  unlink_sortfile = _gf_true; -                close (sort_fd);          }          snprintf (sort_cmd, sizeof (sort_cmd), "sort %s -o %s", @@ -1235,17 +1235,18 @@ glusterd_volume_compute_cksum (glusterd_volinfo_t  *volinfo)          if (ret)                  goto out; -       volinfo->cksum = cksum; +        volinfo->cksum = cksum;  out: -       if (fd > 0) +        if (fd > 0)                 close (fd); - -       if (unlink_sortfile) +        if (sort_fd > 0) +               close (sort_fd); +        if (unlink_sortfile)                 unlink (sort_filepath); -       gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret); +        gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret); -       return ret; +        return ret;  }  void @@ -1594,7 +1595,7 @@ glusterd_import_friend_volume (dict_t *vols, int count)          memset (key, 0, sizeof (key));          snprintf (key, sizeof (key), "volume%d.version", count); -        ret = dict_get_int32 (vols, key, &volinfo->version); +        ret = dict_get_uint32 (vols, key, &volinfo->version);          if (ret)                  goto out; @@ -1665,19 +1666,14 @@ glusterd_import_friend_volume (dict_t *vols, int count)                                                    new_volinfo);          if (ret)                  goto out; -        if (new_volinfo) { +        if (new_volinfo)                  list_add_tail (&volinfo->vol_list, &priv->volumes); -                ret = glusterd_store_create_volume (volinfo); -        } else { -                ret = glusterd_store_update_volume (volinfo); -        } +        ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_NONE);          ret = glusterd_create_volfiles (volinfo);          if (ret)                  goto out; -        //volinfo->version++; -          ret = glusterd_volume_compute_cksum (volinfo);          if (ret)                  goto out; @@ -2805,3 +2801,13 @@ glusterd_clear_pending_nodes (struct list_head *list)          return 0;  } + +gf_boolean_t +glusterd_peerinfo_is_uuid_unknown (glusterd_peerinfo_t *peerinfo) +{ +        GF_ASSERT (peerinfo); + +        if (uuid_is_null (peerinfo->uuid)) +                return _gf_true; +        return _gf_false; +} diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index a903cf8d3a8..e42d467f65b 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -255,4 +255,6 @@ int  glusterd_remove_pending_entry (struct list_head *list, void *elem);  int  glusterd_clear_pending_nodes (struct list_head *list); +gf_boolean_t +glusterd_peerinfo_is_uuid_unknown (glusterd_peerinfo_t *peerinfo);  #endif diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index a38c9a799e8..49ea0d19e35 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -197,7 +197,7 @@ struct glusterd_volinfo_ {          glusterd_brickinfo_t    *src_brick;          glusterd_brickinfo_t    *dst_brick; -        int                     version; +        uint32_t                version;          uint32_t                cksum;          gf_transport_type       transport_type;  | 
