diff options
Diffstat (limited to 'xlators/mgmt/glusterd')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 155 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 399 |
2 files changed, 386 insertions, 168 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 98fc8b592e3..d8887644afb 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -249,6 +249,58 @@ glusterd_store_create_brick_shandle_on_absence (glusterd_volinfo_t *volinfo, return ret; } +/* Store the bricks snapshot details only if required + * + * The snapshot details will be stored only if the cluster op-version is + * greater than or equal to 4 + */ +int +gd_store_brick_snap_details_write (int fd, glusterd_brickinfo_t *brickinfo) +{ + int ret = -1; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + char value[256] = {0,}; + + this = THIS; + GF_ASSERT (this != NULL); + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, (conf != NULL), out); + + GF_VALIDATE_OR_GOTO (this->name, (fd > 0), out); + GF_VALIDATE_OR_GOTO (this->name, (brickinfo != NULL), out); + + if (conf->op_version < GD_OP_VERSION_4) { + ret = 0; + goto out; + } + + if (strlen(brickinfo->device_path) > 0) { + snprintf (value, sizeof(value), "%s", brickinfo->device_path); + ret = gf_store_save_value (fd, + GLUSTERD_STORE_KEY_BRICK_DEVICE_PATH, value); + if (ret) + goto out; + } + + if (strlen(brickinfo->mount_dir) > 0) { + memset (value, 0, sizeof (value)); + snprintf (value, sizeof(value), "%s", brickinfo->mount_dir); + ret = gf_store_save_value (fd, + GLUSTERD_STORE_KEY_BRICK_MOUNT_DIR, value); + if (ret) + goto out; + } + + memset (value, 0, sizeof (value)); + snprintf (value, sizeof(value), "%d", brickinfo->snap_status); + ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_BRICK_SNAP_STATUS, + value); + +out: + return ret; +} + int32_t glusterd_store_brickinfo_write (int fd, glusterd_brickinfo_t *brickinfo) { @@ -286,25 +338,7 @@ glusterd_store_brickinfo_write (int fd, glusterd_brickinfo_t *brickinfo) if (ret) goto out; - if (strlen(brickinfo->device_path) > 0) { - snprintf (value, sizeof(value), "%s", brickinfo->device_path); - ret = gf_store_save_value (fd, - GLUSTERD_STORE_KEY_BRICK_DEVICE_PATH, value); - if (ret) - goto out; - } - - if (strlen(brickinfo->mount_dir) > 0) { - snprintf (value, sizeof(value), "%s", brickinfo->mount_dir); - ret = gf_store_save_value (fd, - GLUSTERD_STORE_KEY_BRICK_MOUNT_DIR, value); - if (ret) - goto out; - } - - snprintf (value, sizeof(value), "%d", brickinfo->snap_status); - ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_BRICK_SNAP_STATUS, - value); + ret = gd_store_brick_snap_details_write (fd, brickinfo); if (ret) goto out; @@ -568,6 +602,64 @@ int _storeopts (dict_t *this, char *key, data_t *value, void *data) return 0; } +/* Store the volumes snapshot details only if required + * + * The snapshot details will be stored only if the cluster op-version is + * greater than or equal to 4 + */ +int +glusterd_volume_write_snap_details (int fd, glusterd_volinfo_t *volinfo) +{ + int ret = -1; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + char buf[PATH_MAX] = {0,}; + + this = THIS; + GF_ASSERT (this != NULL); + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, (conf != NULL), out); + + GF_VALIDATE_OR_GOTO (this->name, (fd > 0), out); + GF_VALIDATE_OR_GOTO (this->name, (volinfo != NULL), out); + + if (conf->op_version < GD_OP_VERSION_4) { + ret = 0; + goto out; + } + + snprintf (buf, sizeof (buf), "%s", volinfo->parent_volname); + ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_PARENT_VOLNAME, buf); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to store " + GLUSTERD_STORE_KEY_PARENT_VOLNAME); + goto out; + } + + ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_RESTORED_SNAP, + uuid_utoa (volinfo->restored_from_snap)); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Unable to write restored_from_snap"); + goto out; + } + + memset (buf, 0, sizeof (buf)); + snprintf (buf, sizeof (buf), "%"PRIu64, volinfo->snap_max_hard_limit); + ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_SNAP_MAX_HARD_LIMIT, + buf); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Unable to write snap-max-hard-limit"); + goto out; + } + +out: + if (ret) + gf_log (this->name, GF_LOG_ERROR, "Failed to write snap details" + " for volume %s", volinfo->volname); + return ret; +} int32_t glusterd_volume_exclude_options_write (int fd, glusterd_volinfo_t *volinfo) { @@ -622,14 +714,6 @@ glusterd_volume_exclude_options_write (int fd, glusterd_volinfo_t *volinfo) if (ret) goto out; - snprintf (buf, sizeof (buf), "%s", volinfo->parent_volname); - ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_PARENT_VOLNAME, buf); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, "Failed to store " - GLUSTERD_STORE_KEY_PARENT_VOLNAME); - goto out; - } - ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_ID, uuid_utoa (volinfo->volume_id)); if (ret) @@ -669,22 +753,7 @@ glusterd_volume_exclude_options_write (int fd, glusterd_volinfo_t *volinfo) goto out; } - ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_RESTORED_SNAP, - uuid_utoa (volinfo->restored_from_snap)); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, - "Unable to write restored_from_snap"); - goto out; - } - - snprintf (buf, sizeof (buf), "%"PRIu64, volinfo->snap_max_hard_limit); - ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_SNAP_MAX_HARD_LIMIT, - buf); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, - "Unable to write snap-max-hard-limit"); - goto out; - } + ret = glusterd_volume_write_snap_details (fd, volinfo); out: if (ret) diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 15e91ad24dd..95401c1ca05 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -2316,6 +2316,136 @@ out: return ret; } +/* Exports a bricks snapshot details only if required + * + * The details will be exported only if the cluster op-version is greather than + * 4, ie. snapshot is supported in the cluster + */ +int +gd_add_brick_snap_details_to_dict (dict_t *dict, char *prefix, + glusterd_brickinfo_t *brickinfo) +{ + int ret = -1; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + char key[256] = {0,}; + + this = THIS; + GF_ASSERT (this != NULL); + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, (conf != NULL), out); + + GF_VALIDATE_OR_GOTO (this->name, (dict != NULL), out); + GF_VALIDATE_OR_GOTO (this->name, (prefix != NULL), out); + GF_VALIDATE_OR_GOTO (this->name, (brickinfo != NULL), out); + + if (conf->op_version < GD_OP_VERSION_4) { + ret = 0; + goto out; + } + + snprintf (key, sizeof (key), "%s.snap_status", prefix); + ret = dict_set_int32 (dict, key, brickinfo->snap_status); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to set snap_status for %s:%s", + brickinfo->hostname, brickinfo->path); + goto out; + } + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s.device_path", prefix); + ret = dict_set_str (dict, key, brickinfo->device_path); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to set snap_device for %s:%s", + brickinfo->hostname, brickinfo->path); + goto out; + } + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s.mount_dir", prefix); + ret = dict_set_str (dict, key, brickinfo->mount_dir); + if (ret) + gf_log (this->name, GF_LOG_ERROR, + "Failed to set mount_dir for %s:%s", + brickinfo->hostname, brickinfo->path); + +out: + return ret; +} + +/* Exports a volumes snapshot details only if required. + * + * The snapshot details will only be exported if the cluster op-version is + * greater than 4, ie. snapshot is supported in the cluster + */ +int +gd_add_vol_snap_details_to_dict (dict_t *dict, char *prefix, + glusterd_volinfo_t *volinfo) +{ + int ret = -1; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + char key[256] = {0,}; + + this = THIS; + GF_ASSERT (this != NULL); + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, (conf != NULL), out); + + GF_VALIDATE_OR_GOTO (this->name, (dict != NULL), out); + GF_VALIDATE_OR_GOTO (this->name, (volinfo != NULL), out); + GF_VALIDATE_OR_GOTO (this->name, (prefix != NULL), out); + + if (conf->op_version < GD_OP_VERSION_4) { + ret =0; + goto out; + } + + snprintf (key, sizeof (key), "%s.restored_from_snap", prefix); + ret = dict_set_dynstr_with_alloc + (dict, key, + uuid_utoa (volinfo->restored_from_snap)); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Unable to set %s for volume" + "%s", key, volinfo->volname); + goto out; + } + + if (strlen (volinfo->parent_volname) > 0) { + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s.parent_volname", prefix); + ret = dict_set_dynstr_with_alloc (dict, key, + volinfo->parent_volname); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Unable to set %s " + "for volume %s", key, volinfo->volname); + goto out; + } + } + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s.is_snap_volume", prefix); + ret = dict_set_uint32 (dict, key, volinfo->is_snap_volume); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Unable to set %s for volume" + "%s", key, volinfo->volname); + goto out; + } + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s.snap-max-hard-limit", prefix); + ret = dict_set_uint64 (dict, key, volinfo->snap_max_hard_limit); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Unable to set %s for volume" + "%s", key, volinfo->volname); + } + +out: + return ret; +} + /* The prefix represents the type of volume to be added. * It will be "volume" for normal volumes, and snap# like * snap1, snap2, for snapshot volumes @@ -2356,27 +2486,6 @@ glusterd_add_volume_to_dict (glusterd_volinfo_t *volinfo, if (ret) goto out; - snprintf (key, sizeof (key), "%s%d.restored_from_snap", - prefix, count); - ret = dict_set_dynstr_with_alloc - (dict, key, - uuid_utoa (volinfo->restored_from_snap)); - if (ret) - goto out; - - if (strlen (volinfo->parent_volname) > 0) { - snprintf (key, sizeof (key), "%s%d.parent_volname", - prefix, count); - ret = dict_set_dynstr_with_alloc (dict, key, - volinfo->parent_volname); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, - "Failed to set parent_volname for %s", - volinfo->volname); - goto out; - } - } - memset (key, 0, sizeof (key)); snprintf (key, sizeof (key), "%s%d.brick_count", prefix, count); ret = dict_set_int32 (dict, key, volinfo->brick_count); @@ -2431,19 +2540,11 @@ glusterd_add_volume_to_dict (glusterd_volinfo_t *volinfo, if (ret) goto out; - snprintf (key, sizeof (key), "%s%d.is_snap_volume", prefix, count); - ret = dict_set_uint32 (dict, key, volinfo->is_snap_volume); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "Unable to set %s", key); - goto out; - } - - snprintf (key, sizeof (key), "%s%d.snap-max-hard-limit", prefix, count); - ret = dict_set_uint64 (dict, key, volinfo->snap_max_hard_limit); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "Unable to set %s", key); + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s%d", prefix, count); + ret = gd_add_vol_snap_details_to_dict (dict, key, volinfo); + if (ret) goto out; - } volume_id_str = gf_strdup (uuid_utoa (volinfo->volume_id)); if (!volume_id_str) { @@ -2620,38 +2721,11 @@ glusterd_add_volume_to_dict (glusterd_volinfo_t *volinfo, if (ret) goto out; - snprintf (key, sizeof (key), "%s%d.brick%d.snap_status", - prefix, count, i); - ret = dict_set_int32 (dict, key, brickinfo->snap_status); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, - "Failed to set snap_status for %s:%s", - brickinfo->hostname, - brickinfo->path); - goto out; - } - - snprintf (key, sizeof (key), "%s%d.brick%d.device_path", - prefix, count, i); - ret = dict_set_str (dict, key, brickinfo->device_path); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, - "Failed to set snap_device for %s:%s", - brickinfo->hostname, - brickinfo->path); - goto out; - } - - snprintf (key, sizeof (key), "%s%d.brick%d.mount_dir", - prefix, count, i); - ret = dict_set_str (dict, key, brickinfo->mount_dir); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, - "Failed to set mount_dir for %s:%s", - brickinfo->hostname, - brickinfo->path); + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s%d.brick%d", prefix, count, i); + ret = gd_add_brick_snap_details_to_dict (dict, key, brickinfo); + if (ret) goto out; - } i++; } @@ -3603,6 +3677,64 @@ out: return ret; } +/* Imports the snapshot details of a brick if required and available + * + * Snapshot details will be imported only if the cluster op-verison is >= 4 + */ +int +gd_import_new_brick_snap_details (dict_t *dict, char *prefix, + glusterd_brickinfo_t *brickinfo) +{ + int ret = -1; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + char key[512] = {0,}; + char *snap_device = NULL; + char *mount_dir = NULL; + + this = THIS; + GF_ASSERT (this != NULL); + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, (conf != NULL), out); + + GF_VALIDATE_OR_GOTO (this->name, (dict != NULL), out); + GF_VALIDATE_OR_GOTO (this->name, (prefix != NULL), out); + GF_VALIDATE_OR_GOTO (this->name, (brickinfo != NULL), out); + + if (conf->op_version < GD_OP_VERSION_4) { + ret = 0; + goto out; + } + + snprintf (key, sizeof (key), "%s.snap_status", prefix); + ret = dict_get_int32 (dict, key, &brickinfo->snap_status); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "%s missing in payload", key); + goto out; + } + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s.device_path", prefix); + ret = dict_get_str (dict, key, &snap_device); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "%s missing in payload", key); + goto out; + } + strcpy (brickinfo->device_path, snap_device); + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s.mount_dir", prefix); + ret = dict_get_str (dict, key, &mount_dir); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "%s missing in payload", key); + goto out; + } + strcpy (brickinfo->mount_dir, mount_dir); + +out: + return ret; +} + /* The prefix represents the type of volume to be added. * It will be "volume" for normal volumes, and snap# like * snap1, snap2, for snapshot volumes @@ -3615,9 +3747,6 @@ glusterd_import_new_brick (dict_t *peer_data, int32_t vol_count, { char key[512] = {0,}; int ret = -1; - int32_t snap_status = 0; - char *snap_device = NULL; - char *mount_dir = NULL; char *hostname = NULL; char *path = NULL; char *brick_id = NULL; @@ -3665,42 +3794,23 @@ glusterd_import_new_brick (dict_t *peer_data, int32_t vol_count, ret = 0; } - snprintf (key, sizeof (key), "%s%d.brick%d.snap_status", - prefix, vol_count, brick_count); - ret = dict_get_int32 (peer_data, key, &snap_status); - if (ret) { - snprintf (msg, sizeof (msg), "%s missing in payload", key); - goto out; - } - - snprintf (key, sizeof (key), "%s%d.brick%d.device_path", - prefix, vol_count, brick_count); - ret = dict_get_str (peer_data, key, &snap_device); - if (ret) { - snprintf (msg, sizeof (msg), "%s missing in payload", key); - goto out; - } - - snprintf (key, sizeof (key), "%s%d.brick%d.mount_dir", - prefix, vol_count, brick_count); - ret = dict_get_str (peer_data, key, &mount_dir); - if (ret) { - snprintf (msg, sizeof (msg), "%s missing in payload", key); - goto out; - } - ret = glusterd_brickinfo_new (&new_brickinfo); if (ret) goto out; strcpy (new_brickinfo->path, path); strcpy (new_brickinfo->hostname, hostname); - strcpy (new_brickinfo->device_path, snap_device); - strcpy (new_brickinfo->mount_dir, mount_dir); - new_brickinfo->snap_status = snap_status; new_brickinfo->decommissioned = decommissioned; if (brick_id) strcpy (new_brickinfo->brick_id, brick_id); + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s%d.brick%d", prefix, vol_count, + brick_count); + ret = gd_import_new_brick_snap_details (peer_data, key, new_brickinfo); + if (ret) + goto out; + //peerinfo might not be added yet (void) glusterd_resolve_brick (new_brickinfo); ret = 0; @@ -3900,6 +4010,67 @@ out: return ret; } +/* + * Imports the snapshot details of a volume if required and available + * + * Snapshot details will be imported only if cluster.op_version is greater than + * or equal to GD_OP_VERSION_4, the op-version from which volume snapshot is + * supported. + */ +int +gd_import_volume_snap_details (dict_t *dict, glusterd_volinfo_t *volinfo, + char *prefix, char *volname) +{ + int ret = -1; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + char key[256] = {0,}; + char *restored_snap = NULL; + + this = THIS; + GF_ASSERT (this != NULL); + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, (conf != NULL), out); + + GF_VALIDATE_OR_GOTO (this->name, (dict != NULL), out); + GF_VALIDATE_OR_GOTO (this->name, (volinfo != NULL), out); + GF_VALIDATE_OR_GOTO (this->name, (prefix != NULL), out); + GF_VALIDATE_OR_GOTO (this->name, (volname != NULL), out); + + if (conf->op_version < GD_OP_VERSION_4) { + ret = 0; + goto out; + } + + snprintf (key, sizeof (key), "%s.is_snap_volume", prefix); + ret = dict_get_uint32 (dict, key, &volinfo->is_snap_volume); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "%s missing in payload " + "for %s", key, volname); + goto out; + } + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s.restored_from_snap", prefix); + ret = dict_get_str (dict, key, &restored_snap); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "%s missing in payload " + "for %s", key, volname); + goto out; + } + + uuid_parse (restored_snap, volinfo->restored_from_snap); + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s.snap-max-hard-limit", prefix); + ret = dict_get_uint64 (dict, key, + &volinfo->snap_max_hard_limit); + if (ret) + gf_log (this->name, GF_LOG_ERROR, "%s missing in payload " + "for %s", key, volname); +out: + return ret; +} /* The prefix represents the type of volume to be added. * It will be "volume" for normal volumes, and snap# like * snap1, snap2, for snapshot volumes @@ -3925,7 +4096,6 @@ glusterd_import_volinfo (dict_t *peer_data, int count, char *rb_id_str = NULL; int op_version = 0; int client_op_version = 0; - uint32_t is_snap_volume = 0; GF_ASSERT (peer_data); GF_ASSERT (volinfo); @@ -3938,15 +4108,6 @@ glusterd_import_volinfo (dict_t *peer_data, int count, goto out; } - memset (key, 0, sizeof (key)); - snprintf (key, sizeof (key), "%s%d.is_snap_volume", prefix, count); - ret = dict_get_uint32 (peer_data, key, &is_snap_volume); - if (ret) { - snprintf (msg, sizeof (msg), "%s missing in payload for %s", - key, volname); - goto out; - } - ret = glusterd_volinfo_new (&new_volinfo); if (ret) goto out; @@ -4078,27 +4239,6 @@ glusterd_import_volinfo (dict_t *peer_data, int count, goto out; } - new_volinfo->is_snap_volume = is_snap_volume; - - snprintf (key, sizeof (key), "%s%d.restored_from_snap", prefix, count); - ret = dict_get_str (peer_data, key, &restored_snap); - if (ret) { - snprintf (msg, sizeof (msg), "%s missing in payload for %s", - key, volname); - goto out; - } - - uuid_parse (restored_snap, new_volinfo->restored_from_snap); - - snprintf (key, sizeof (key), "%s%d.snap-max-hard-limit", prefix, count); - ret = dict_get_uint64 (peer_data, key, - &new_volinfo->snap_max_hard_limit); - if (ret) { - snprintf (msg, sizeof (msg), "%s missing in payload for %s", - key, volname); - goto out; - } - memset (key, 0, sizeof (key)); snprintf (key, sizeof (key), "%s%d.rebalance", prefix, count); ret = dict_get_uint32 (peer_data, key, &new_volinfo->rebal.defrag_cmd); @@ -4190,6 +4330,15 @@ glusterd_import_volinfo (dict_t *peer_data, int count, } } + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "%s%d", prefix, count); + ret = gd_import_volume_snap_details (peer_data, new_volinfo, key, + volname); + if (ret) { + gf_log ("glusterd", GF_LOG_ERROR, "Failed to import snapshot " + "details for volume %s", volname); + goto out; + } ret = glusterd_import_friend_volume_opts (peer_data, count, new_volinfo); |