summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-locks.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-locks.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-locks.c112
1 files changed, 51 insertions, 61 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-locks.c b/xlators/mgmt/glusterd/src/glusterd-locks.c
index bdb45314b4f..11523f2854b 100644
--- a/xlators/mgmt/glusterd/src/glusterd-locks.c
+++ b/xlators/mgmt/glusterd/src/glusterd-locks.c
@@ -36,22 +36,20 @@ glusterd_valid_entities valid_types[] = {
};
/* Checks if the lock request is for a valid entity */
-gf_boolean_t
+static gf_boolean_t
glusterd_mgmt_v3_is_type_valid(char *type)
{
- int32_t i = 0;
- gf_boolean_t ret = _gf_false;
+ int i = 0;
GF_ASSERT(type);
for (i = 0; valid_types[i].type; i++) {
if (!strcmp(type, valid_types[i].type)) {
- ret = _gf_true;
- break;
+ return _gf_true;
}
}
- return ret;
+ return _gf_false;
}
/* Initialize the global mgmt_v3 lock list(dict) when
@@ -138,15 +136,12 @@ out:
return;
}
-int32_t
+static int32_t
glusterd_get_mgmt_v3_lock_owner(char *key, uuid_t *uuid)
{
int32_t ret = -1;
glusterd_mgmt_v3_lock_obj *lock_obj = NULL;
glusterd_conf_t *priv = NULL;
- uuid_t no_owner = {
- 0,
- };
xlator_t *this = NULL;
this = THIS;
@@ -164,8 +159,6 @@ glusterd_get_mgmt_v3_lock_owner(char *key, uuid_t *uuid)
ret = dict_get_bin(priv->mgmt_v3_lock, key, (void **)&lock_obj);
if (!ret)
gf_uuid_copy(*uuid, lock_obj->lock_owner);
- else
- gf_uuid_copy(*uuid, no_owner);
ret = 0;
out:
@@ -199,11 +192,11 @@ glusterd_release_multiple_locks_per_entity(dict_t *dict, uuid_t uuid,
/* Release all the locks held */
for (i = 0; i < locked_count; i++) {
- snprintf(name_buf, sizeof(name_buf), "%sname%d", type, i + 1);
+ ret = snprintf(name_buf, sizeof(name_buf), "%sname%d", type, i + 1);
/* Looking for volname1, volname2 or snapname1, *
* as key in the dict snapname2 */
- ret = dict_get_str(dict, name_buf, &name);
+ ret = dict_get_strn(dict, name_buf, ret, &name);
if (ret) {
gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED,
"Unable to get %s locked_count = %d", name_buf,
@@ -248,11 +241,11 @@ glusterd_acquire_multiple_locks_per_entity(dict_t *dict, uuid_t uuid,
/* Locking one element after other */
for (i = 0; i < count; i++) {
- snprintf(name_buf, sizeof(name_buf), "%sname%d", type, i + 1);
+ ret = snprintf(name_buf, sizeof(name_buf), "%sname%d", type, i + 1);
/* Looking for volname1, volname2 or snapname1, *
* as key in the dict snapname2 */
- ret = dict_get_str(dict, name_buf, &name);
+ ret = dict_get_strn(dict, name_buf, ret, &name);
if (ret) {
gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED,
"Unable to get %s count = %d", name_buf, count);
@@ -321,13 +314,13 @@ glusterd_mgmt_v3_unlock_entity(dict_t *dict, uuid_t uuid, char *type,
}
/* Looking for volcount or snapcount in the dict */
- snprintf(name_buf, sizeof(name_buf), "%scount", type);
- ret = dict_get_int32(dict, name_buf, &count);
+ ret = snprintf(name_buf, sizeof(name_buf), "%scount", type);
+ ret = dict_get_int32n(dict, name_buf, ret, &count);
if (ret) {
/* count is not present. Only one *
* element name needs to be unlocked */
- snprintf(name_buf, sizeof(name_buf), "%sname", type);
- ret = dict_get_str(dict, name_buf, &name);
+ ret = snprintf(name_buf, sizeof(name_buf), "%sname", type);
+ ret = dict_get_strn(dict, name_buf, ret, &name);
if (ret) {
gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED,
"Unable to fetch %sname", type);
@@ -390,13 +383,13 @@ glusterd_mgmt_v3_lock_entity(dict_t *dict, uuid_t uuid, uint32_t *op_errno,
}
/* Looking for volcount or snapcount in the dict */
- snprintf(name_buf, sizeof(name_buf), "%scount", type);
- ret = dict_get_int32(dict, name_buf, &count);
+ ret = snprintf(name_buf, sizeof(name_buf), "%scount", type);
+ ret = dict_get_int32n(dict, name_buf, ret, &count);
if (ret) {
/* count is not present. Only one *
* element name needs to be locked */
- snprintf(name_buf, sizeof(name_buf), "%sname", type);
- ret = dict_get_str(dict, name_buf, &name);
+ ret = snprintf(name_buf, sizeof(name_buf), "%sname", type);
+ ret = dict_get_strn(dict, name_buf, ret, &name);
if (ret) {
gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED,
"Unable to fetch %sname", type);
@@ -569,8 +562,8 @@ glusterd_mgmt_v3_lock(const char *name, uuid_t uuid, uint32_t *op_errno,
goto out;
}
- gf_msg_debug(this->name, 0, "Trying to acquire lock of %s %s for %s as %s",
- type, name, uuid_utoa(uuid), key);
+ gf_msg_debug(this->name, 0, "Trying to acquire lock of %s for %s", key,
+ uuid_utoa(uuid));
ret = glusterd_get_mgmt_v3_lock_owner(key, &owner);
if (ret) {
@@ -589,7 +582,7 @@ glusterd_mgmt_v3_lock(const char *name, uuid_t uuid, uint32_t *op_errno,
goto out;
}
- lock_obj = GF_CALLOC(1, sizeof(glusterd_mgmt_v3_lock_obj),
+ lock_obj = GF_MALLOC(sizeof(glusterd_mgmt_v3_lock_obj),
gf_common_mt_mgmt_v3_lock_obj_t);
if (!lock_obj) {
ret = -1;
@@ -616,9 +609,6 @@ glusterd_mgmt_v3_lock(const char *name, uuid_t uuid, uint32_t *op_errno,
}
mgmt_lock_timer->xl = THIS;
- key_dup = gf_strdup(key);
- delay.tv_sec = priv->mgmt_v3_lock_timeout;
- delay.tv_nsec = 0;
/*changing to default timeout value*/
priv->mgmt_v3_lock_timeout = GF_LOCK_TIMER;
@@ -626,17 +616,19 @@ glusterd_mgmt_v3_lock(const char *name, uuid_t uuid, uint32_t *op_errno,
mgmt_lock_timer_xl = mgmt_lock_timer->xl;
if (!mgmt_lock_timer_xl) {
GF_FREE(mgmt_lock_timer);
- GF_FREE(key_dup);
goto out;
}
mgmt_lock_timer_ctx = mgmt_lock_timer_xl->ctx;
if (!mgmt_lock_timer_ctx) {
GF_FREE(mgmt_lock_timer);
- GF_FREE(key_dup);
goto out;
}
+ key_dup = gf_strdup(key);
+ delay.tv_sec = priv->mgmt_v3_lock_timeout;
+ delay.tv_nsec = 0;
+
mgmt_lock_timer->timer = gf_timer_call_after(
mgmt_lock_timer_ctx, delay, gd_mgmt_v3_unlock_timer_cbk, key_dup);
@@ -652,18 +644,18 @@ glusterd_mgmt_v3_lock(const char *name, uuid_t uuid, uint32_t *op_errno,
/* Saving the backtrace into the pre-allocated buffer, ctx->btbuf*/
if ((bt = gf_backtrace_save(NULL))) {
- snprintf(key, sizeof(key), "debug.last-success-bt-%s-%s", name, type);
+ snprintf(key, sizeof(key), "debug.last-success-bt-%s", key_dup);
ret = dict_set_dynstr_with_alloc(priv->mgmt_v3_lock, key, bt);
if (ret)
gf_msg(this->name, GF_LOG_WARNING, 0, GD_MSG_DICT_SET_FAILED,
"Failed to save "
- "the back trace for lock %s-%s granted to %s",
- name, type, uuid_utoa(uuid));
+ "the back trace for lock %s granted to %s",
+ key_dup, uuid_utoa(uuid));
ret = 0;
}
- gf_msg_debug(this->name, 0, "Lock for %s %s successfully held by %s", type,
- name, uuid_utoa(uuid));
+ gf_msg_debug(this->name, 0, "Lock for %s successfully held by %s", key_dup,
+ uuid_utoa(uuid));
ret = 0;
out:
@@ -681,9 +673,9 @@ gd_mgmt_v3_unlock_timer_cbk(void *data)
glusterd_conf_t *conf = NULL;
glusterd_mgmt_v3_lock_timer *mgmt_lock_timer = NULL;
char *key = NULL;
- char *type = NULL;
+ int keylen;
char bt_key[PATH_MAX] = "";
- char name[PATH_MAX] = "";
+ int bt_key_len = 0;
int32_t ret = -1;
glusterfs_ctx_t *mgmt_lock_timer_ctx = NULL;
xlator_t *mgmt_lock_timer_xl = NULL;
@@ -698,21 +690,18 @@ gd_mgmt_v3_unlock_timer_cbk(void *data)
GF_ASSERT(NULL != data);
key = (char *)data;
- dict_del(conf->mgmt_v3_lock, key);
-
- type = strrchr(key, '_');
- strncpy(name, key, strlen(key) - strlen(type) - 1);
+ keylen = strlen(key);
+ dict_deln(conf->mgmt_v3_lock, key, keylen);
- ret = snprintf(bt_key, PATH_MAX, "debug.last-success-bt-%s-%s", name,
- type + 1);
- if (ret != SLEN("debug.last-success-bt-") + strlen(name) + strlen(type)) {
+ bt_key_len = snprintf(bt_key, PATH_MAX, "debug.last-success-bt-%s", key);
+ if (bt_key_len != SLEN("debug.last-success-bt-") + keylen) {
gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_CREATE_KEY_FAIL,
"Unable to create backtrace "
"key");
goto out;
}
- dict_del(conf->mgmt_v3_lock, bt_key);
+ dict_deln(conf->mgmt_v3_lock, bt_key, bt_key_len);
ret = dict_get_bin(conf->mgmt_v3_lock_timer, key,
(void **)&mgmt_lock_timer);
@@ -732,12 +721,12 @@ out:
timer = mgmt_lock_timer->timer;
GF_FREE(timer->data);
gf_timer_call_cancel(mgmt_lock_timer_ctx, mgmt_lock_timer->timer);
- dict_del(conf->mgmt_v3_lock_timer, bt_key);
+ dict_deln(conf->mgmt_v3_lock_timer, bt_key, bt_key_len);
mgmt_lock_timer->timer = NULL;
gf_log(this->name, GF_LOG_INFO,
- "unlock timer is cancelled for volume"
+ "unlock timer is cancelled for volume_type"
" %s",
- name);
+ key);
}
ret_function:
@@ -750,6 +739,7 @@ glusterd_mgmt_v3_unlock(const char *name, uuid_t uuid, char *type)
{
char key[PATH_MAX] = "";
char key_dup[PATH_MAX] = "";
+ int keylen;
int32_t ret = -1;
gf_boolean_t is_valid = _gf_true;
glusterd_conf_t *priv = NULL;
@@ -784,14 +774,13 @@ glusterd_mgmt_v3_unlock(const char *name, uuid_t uuid, char *type)
goto out;
}
- ret = snprintf(key, sizeof(key), "%s_%s", name, type);
- if (ret != strlen(name) + 1 + strlen(type)) {
+ keylen = snprintf(key, sizeof(key), "%s_%s", name, type);
+ if (keylen != strlen(name) + 1 + strlen(type)) {
gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_CREATE_KEY_FAIL,
"Unable to create key");
ret = -1;
goto out;
}
- (void)snprintf(key_dup, sizeof(key_dup), "%s", key);
gf_msg_debug(this->name, 0, "Trying to release lock of %s %s for %s as %s",
type, name, uuid_utoa(uuid), key);
@@ -820,7 +809,7 @@ glusterd_mgmt_v3_unlock(const char *name, uuid_t uuid, char *type)
}
/* Removing the mgmt_v3 lock from the global list */
- dict_del(priv->mgmt_v3_lock, key);
+ dict_deln(priv->mgmt_v3_lock, key, keylen);
ret = dict_get_bin(priv->mgmt_v3_lock_timer, key,
(void **)&mgmt_lock_timer);
@@ -830,17 +819,18 @@ glusterd_mgmt_v3_unlock(const char *name, uuid_t uuid, char *type)
goto out;
}
+ (void)snprintf(key_dup, sizeof(key_dup), "%s", key);
+
/* Remove the backtrace key as well */
- ret = snprintf(key, sizeof(key), "debug.last-success-bt-%s-%s", name, type);
- if (ret !=
- SLEN("debug.last-success-bt-") + strlen(name) + strlen(type) + 1) {
+ ret = snprintf(key, sizeof(key), "debug.last-success-bt-%s", key_dup);
+ if (ret != SLEN("debug.last-success-bt-") + keylen) {
gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_CREATE_KEY_FAIL,
"Unable to create backtrace "
"key");
ret = -1;
goto out;
}
- dict_del(priv->mgmt_v3_lock, key);
+ dict_deln(priv->mgmt_v3_lock, key, ret);
gf_msg_debug(this->name, 0, "Lock for %s %s successfully released", type,
name);
@@ -858,7 +848,7 @@ glusterd_mgmt_v3_unlock(const char *name, uuid_t uuid, char *type)
timer = mgmt_lock_timer->timer;
GF_FREE(timer->data);
gf_timer_call_cancel(mgmt_lock_timer_ctx, mgmt_lock_timer->timer);
- dict_del(priv->mgmt_v3_lock_timer, key_dup);
+ dict_deln(priv->mgmt_v3_lock_timer, key_dup, keylen);
}
ret = glusterd_volinfo_find(name, &volinfo);
if (volinfo && volinfo->stage_deleted) {
@@ -869,8 +859,8 @@ glusterd_mgmt_v3_unlock(const char *name, uuid_t uuid, char *type)
volinfo->stage_deleted = _gf_false;
gf_log(this->name, GF_LOG_INFO,
"Volume %s still exist, setting "
- "stage deleted flag to false for the volume %s",
- volinfo->volname, volinfo->volname);
+ "stage deleted flag to false for the volume",
+ volinfo->volname);
}
ret = 0;
out: