From fe5927b6bd1ed795c9e85996e7c54c3abe36ceba Mon Sep 17 00:00:00 2001 From: Vijaikumar M Date: Fri, 14 Feb 2014 20:01:38 +0530 Subject: glusterd/snapshot: store location for snap driven changes Currently snapshot volfiles are stored at: /vols//snaps/ With snap driven approach we need to store the volfiles at: /snaps// Change-Id: I8efdd5db29833b2b06b64a900cbb4c9b9a5d36b6 Signed-off-by: Vijaikumar M Signed-off-by: Sachin Pandit Reviewed-on: http://review.gluster.org/7006 Reviewed-by: Avra Sengupta Reviewed-by: Rajesh Joseph Tested-by: Rajesh Joseph --- xlators/mgmt/glusterd/src/glusterd.h | 87 ++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 39 deletions(-) (limited to 'xlators/mgmt/glusterd/src/glusterd.h') diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 27ebbbb6c..bd765349a 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -40,6 +40,7 @@ #include "store.h" #define GLUSTERD_MAX_VOLUME_NAME 1000 +#define GLUSTERD_MAX_SNAP_NAME 128 #define GLUSTERD_TR_LOG_SIZE 50 #define GLUSTERD_NAME "glusterd" #define GLUSTERD_SOCKET_LISTEN_BACKLOG 128 @@ -75,6 +76,9 @@ struct glusterd_volinfo_; typedef struct glusterd_volinfo_ glusterd_volinfo_t; +struct glusterd_snap_; +typedef struct glusterd_snap_ glusterd_snap_t; + typedef enum glusterd_op_ { GD_OP_NONE = 0, GD_OP_CREATE_VOLUME, @@ -139,7 +143,7 @@ typedef struct { nodesrv_t *nfs; struct pmap_registry *pmap; struct list_head volumes; - struct list_head snap_list; /*List of snap volumes */ + struct list_head snapshots; /*List of snap volumes */ pthread_mutex_t xprt_lock; struct list_head xprt_list; gf_store_handle_t *handle; @@ -279,6 +283,7 @@ struct glusterd_volinfo_ { gf_lock_t lock; char volname[GLUSTERD_MAX_VOLUME_NAME]; gf_boolean_t is_snap_volume; + glusterd_snap_t *snapshot; gf_boolean_t is_volume_restored; char parent_volname[GLUSTERD_MAX_VOLUME_NAME]; /* In case of a snap volume @@ -292,8 +297,16 @@ struct glusterd_volinfo_ { uint64_t snap_count; uint64_t snap_max_hard_limit; struct list_head vol_list; + /* In case of a snap volume + i.e (is_snap_volume == TRUE) this + is linked to glusterd_snap_t->volumes. + In case of a non-snap volume, this is + linked to glusterd_conf_t->volumes */ + struct list_head snapvol_list; + /* This is a current pointer for + glusterd_volinfo_t->snap_volumes */ struct list_head bricks; - struct list_head snaps; + struct list_head snap_volumes; glusterd_volume_status status; int sub_count; /* backward compatibility */ int stripe_count; @@ -306,7 +319,6 @@ struct glusterd_volinfo_ { gf_store_handle_t *shandle; gf_store_handle_t *rb_shandle; gf_store_handle_t *node_state_shandle; - gf_store_handle_t *snap_list_shandle; /* Defrag/rebalance related */ glusterd_rebalance_t rebal; @@ -347,9 +359,11 @@ typedef enum gd_snap_status_ { struct glusterd_snap_ { gf_lock_t lock; - glusterd_volinfo_t *snap_volume; + struct list_head volumes; + glusterd_volinfo_t *snap_volume; /*TODO: This should be replaced + with volumes list later */ struct list_head snap_list; - char snap_name[256]; + char snapname[GLUSTERD_MAX_SNAP_NAME]; uuid_t snap_id; char cg_name[256]; uuid_t cg_id; @@ -360,8 +374,6 @@ struct glusterd_snap_ { gf_store_handle_t *shandle; }; -typedef struct glusterd_snap_ glusterd_snap_t; - struct glusterd_snap_cg_ { gf_lock_t lock; uuid_t cg_id; @@ -415,6 +427,7 @@ enum glusterd_vol_comp_status_ { #define GLUSTERD_VOLUME_DIR_PREFIX "vols" #define GLUSTERD_PEER_DIR_PREFIX "peers" #define GLUSTERD_VOLUME_INFO_FILE "info" +#define GLUSTERD_SNAP_INFO_FILE "info" #define GLUSTERD_VOLUME_RBSTATE_FILE "rbstate" #define GLUSTERD_BRICK_INFO_DIR "bricks" #define GLUSTERD_CKSUM_FILE "cksum" @@ -444,27 +457,33 @@ enum glusterd_vol_comp_status_ { typedef ssize_t (*gd_serialize_t) (struct iovec outmsg, void *args); -#define GLUSTERD_GET_VOLUME_DIR(path, volinfo, priv) \ - snprintf (path, PATH_MAX, "%s/vols/%s", priv->workdir,\ - volinfo->volname); +#define GLUSTERD_GET_VOLUME_DIR(path, volinfo, priv) \ + if (volinfo->is_snap_volume) { \ + snprintf (path, PATH_MAX, "%s/snaps/%s/%s", priv->workdir, \ + volinfo->snapshot->snapname, volinfo->volname); \ + } else { \ + snprintf (path, PATH_MAX, "%s/vols/%s", priv->workdir, \ + volinfo->volname); \ + } + +#define GLUSTERD_GET_SNAP_DIR(path, snap, priv) \ + snprintf (path, PATH_MAX, "%s/snaps/%s", priv->workdir, \ + snap->snapname); #define GLUSTERD_GET_SNAP_CG_DIR(path, priv) \ snprintf (path, PATH_MAX, "%s/%s", priv->workdir,\ GLUSTERD_VOL_SNAP_CG_DIR_PREFIX); -#define GLUSTERD_GET_SNAP_DIR(path, volinfo, snap_name, priv) \ - snprintf (path, PATH_MAX, "%s/vols/%s/snaps/%s", priv->workdir,\ - volinfo->volname, snap_name); - -#define GLUSTERD_GET_BRICK_DIR(path, volinfo, priv) \ - snprintf (path, PATH_MAX, "%s/%s/%s/%s", priv->workdir,\ - GLUSTERD_VOLUME_DIR_PREFIX, volinfo->volname, \ - GLUSTERD_BRICK_INFO_DIR); - -#define GLUSTERD_GET_SNAP_BRICK_DIR(path, volinfo, snap_name, priv) \ - snprintf (path, PATH_MAX, "%s/%s/%s/snaps/%s/%s", priv->workdir,\ - GLUSTERD_VOLUME_DIR_PREFIX, volinfo->volname, \ - snap_name, GLUSTERD_BRICK_INFO_DIR); +#define GLUSTERD_GET_BRICK_DIR(path, volinfo, priv) \ + if (volinfo->is_snap_volume) { \ + snprintf (path, PATH_MAX, "%s/snaps/%s/%s/%s", priv->workdir, \ + volinfo->snapshot->snapname, volinfo->volname, \ + GLUSTERD_BRICK_INFO_DIR); \ + } else { \ + snprintf (path, PATH_MAX, "%s/%s/%s/%s", priv->workdir, \ + GLUSTERD_VOLUME_DIR_PREFIX, volinfo->volname, \ + GLUSTERD_BRICK_INFO_DIR); \ + } #define GLUSTERD_GET_NFS_DIR(path, priv) \ snprintf (path, PATH_MAX, "%s/nfs", priv->workdir); @@ -487,17 +506,6 @@ typedef ssize_t (*gd_serialize_t) (struct iovec outmsg, void *args); volpath, brickinfo->hostname, exp_path); \ } while (0) -#define GLUSTERD_GET_SNAP_BRICK_PIDFILE(pidfile,vol_name,snap_name, \ - brickinfo, priv) do { \ - char exp_path[PATH_MAX] = {0,}; \ - char volpath[PATH_MAX] = {0,}; \ - snprintf (volpath, sizeof (volpath), "%s/vols/%s/snaps/%s", \ - priv->workdir, vol_name, snap_name); \ - GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, exp_path);\ - snprintf (pidfile, sizeof (pidfile), "%s/run/%s-%s.pid", \ - volpath, brickinfo->hostname, exp_path); \ - } while (0) - #define GLUSTERD_GET_NFS_PIDFILE(pidfile,nfspath) { \ snprintf (pidfile, PATH_MAX, "%s/run/nfs.pid", \ nfspath); \ @@ -904,19 +912,20 @@ glusterd_snap_cg_t* glusterd_new_snap_cg_object(int64_t volume_count); int32_t -glusterd_add_snap (glusterd_volinfo_t *volinfo, glusterd_snap_t *snap); +glusterd_list_add_snapvol (glusterd_volinfo_t *origin_vol, + glusterd_volinfo_t *snap_vol); glusterd_snap_t* -glusterd_remove_snap_by_id (glusterd_volinfo_t *volinfo, uuid_t snap_id); +glusterd_remove_snap_by_id (uuid_t snap_id); glusterd_snap_t* -glusterd_remove_snap_by_name (glusterd_volinfo_t *volinfo, char *snap_name); +glusterd_remove_snap_by_name (char *snap_name); glusterd_snap_t* -glusterd_find_snap_by_name (glusterd_volinfo_t *volinfo, char *snap_name); +glusterd_find_snap_by_name (char *snap_name); glusterd_snap_t* -glusterd_find_snap_by_id (glusterd_volinfo_t *volinfo, uuid_t snap_id); +glusterd_find_snap_by_id (uuid_t snap_id); int32_t glusterd_add_snap_cg (glusterd_conf_t *conf, glusterd_snap_cg_t *cg); -- cgit