[sheepdog] [PATCH v2 2/3] sheep: access config entries with one function call
MORITA Kazutaka
morita.kazutaka at gmail.com
Thu Jul 4 09:56:29 CEST 2013
From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
Currently, we have to use multiple (set|get)_cluster_* functions to
read/write a cluster setting from the config file. This introduces
set_cluster_config and get_cluster_config to simplify the codes.
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
sheep/config.c | 56 +++++++++++-----------------------------------------
sheep/group.c | 43 ++++++++--------------------------------
sheep/ops.c | 25 ++---------------------
sheep/sheep_priv.h | 10 ++--------
sheep/store.c | 4 ----
5 files changed, 24 insertions(+), 114 deletions(-)
diff --git a/sheep/config.c b/sheep/config.c
index 26840e9..da0cd33 100644
--- a/sheep/config.c
+++ b/sheep/config.c
@@ -111,6 +111,7 @@ int init_config_file(void)
goto out;
}
ret = 0;
+ get_cluster_config(&sys->cinfo);
out:
close(fd);
@@ -131,57 +132,24 @@ void init_config_path(const char *base_path)
snprintf(config_path, len, "%s" CONFIG_PATH, base_path);
}
-int set_cluster_ctime(uint64_t ct)
-{
- config.ctime = ct;
-
- return write_config();
-}
-
-uint64_t get_cluster_ctime(void)
-{
- return config.ctime;
-}
-
-int set_cluster_copies(uint8_t copies)
-{
- config.copies = copies;
-
- return write_config();
-}
-
-int get_cluster_copies(uint8_t *copies)
-{
- *copies = config.copies;
-
- return SD_RES_SUCCESS;
-}
-
-int set_cluster_flags(uint16_t flags)
-{
- config.flags = flags;
-
- return write_config();
-}
-
-int get_cluster_flags(uint16_t *flags)
-{
- *flags = config.flags;
-
- return SD_RES_SUCCESS;
-}
-
-int set_cluster_store(const char *name)
+int set_cluster_config(const struct cluster_info *cinfo)
{
+ config.ctime = cinfo->ctime;
+ config.copies = cinfo->nr_copies;
+ config.flags = cinfo->flags;
memset(config.store, 0, sizeof(config.store));
- pstrcpy((char *)config.store, sizeof(config.store), name);
+ pstrcpy((char *)config.store, sizeof(config.store),
+ (char *)cinfo->store);
return write_config();
}
-int get_cluster_store(char *buf)
+int get_cluster_config(struct cluster_info *cinfo)
{
- memcpy(buf, config.store, sizeof(config.store));
+ cinfo->ctime = config.ctime;
+ cinfo->nr_copies = config.copies;
+ cinfo->flags = config.flags;
+ memcpy(cinfo->store, config.store, sizeof(config.store));
return SD_RES_SUCCESS;
}
diff --git a/sheep/group.c b/sheep/group.c
index 2f520e0..7a8ca65 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -496,18 +496,12 @@ int epoch_log_read_remote(uint32_t epoch, struct sd_node *nodes, int len,
static int cluster_sanity_check(struct join_message *jm)
{
- uint64_t local_ctime = get_cluster_ctime();
uint32_t local_epoch = get_latest_epoch();
- uint8_t local_nr_copies;
- if (get_cluster_copies(&local_nr_copies)) {
- sd_eprintf("failed to get nr_copies");
- return CJ_RES_FAIL;
- }
-
- if (jm->cinfo.ctime != local_ctime) {
+ if (jm->cinfo.ctime != sys->cinfo.ctime) {
sd_eprintf("joining node ctime doesn't match: %"
- PRIu64 " vs %" PRIu64, jm->cinfo.ctime, local_ctime);
+ PRIu64 " vs %" PRIu64, jm->cinfo.ctime,
+ sys->cinfo.ctime);
return CJ_RES_FAIL;
}
@@ -517,9 +511,9 @@ static int cluster_sanity_check(struct join_message *jm)
return CJ_RES_FAIL;
}
- if (jm->cinfo.nr_copies != local_nr_copies) {
+ if (jm->cinfo.nr_copies != sys->cinfo.nr_copies) {
sd_eprintf("joining node nr_copies doesn't match: %u vs %u",
- jm->cinfo.nr_copies, local_nr_copies);
+ jm->cinfo.nr_copies, sys->cinfo.nr_copies);
return CJ_RES_FAIL;
}
@@ -753,10 +747,6 @@ static void setup_backend_store(const char *store, bool need_purge)
ret = sd_store->init();
if (ret != SD_RES_SUCCESS)
panic("failed to initialize store");
-
- ret = set_cluster_store(sd_store->name);
- if (ret != SD_RES_SUCCESS)
- panic("failed to store into config file");
}
/*
@@ -774,8 +764,6 @@ static void finish_join(const struct join_message *msg,
const struct sd_node *joined,
const struct sd_node *nodes, size_t nr_nodes)
{
- int ret;
-
sys->join_finished = true;
sys->cinfo.epoch = msg->cinfo.epoch;
@@ -783,16 +771,7 @@ static void finish_join(const struct join_message *msg,
update_exceptional_node_list(get_latest_epoch(), msg);
if (msg->cinfo.store[0]) {
- /*
- * We don't need backend for gateway-only node, but need to save
- * store name. Otherwise, the node cannot notify the store name
- * when it become master
- */
- if (sys->gateway_only) {
- ret = set_cluster_store((char *)msg->cinfo.store);
- if (ret != SD_RES_SUCCESS)
- panic("failed to store into config file");
- } else
+ if (!sys->gateway_only)
setup_backend_store((char *)msg->cinfo.store,
!!msg->inc_epoch);
}
@@ -882,9 +861,7 @@ static void update_cluster_info(const struct join_message *msg,
sys->cinfo.nr_copies = msg->cinfo.nr_copies;
sys->cinfo.flags = msg->cinfo.flags;
- set_cluster_copies(sys->cinfo.nr_copies);
- set_cluster_flags(sys->cinfo.flags);
- set_cluster_ctime(msg->cinfo.ctime);
+ set_cluster_config(&sys->cinfo);
/*FALLTHROUGH*/
case SD_STATUS_WAIT_FOR_JOIN:
sys->cinfo.disable_recovery =
@@ -1014,7 +991,7 @@ enum cluster_join_result sd_check_join_cb(const struct sd_node *joining,
return CJ_RES_FAIL;
sys->cinfo.epoch = epoch;
- jm->cinfo.ctime = get_cluster_ctime();
+ jm->cinfo.ctime = sys->cinfo.ctime;
if (nr_entries == 1)
jm->cluster_status = SD_STATUS_OK;
@@ -1288,10 +1265,6 @@ int create_cluster(int port, int64_t zone, int nr_vnodes,
sys->cinfo.epoch = get_latest_epoch();
if (sys->cinfo.epoch) {
sys->status = SD_STATUS_WAIT_FOR_JOIN;
- get_cluster_copies(&sys->cinfo.nr_copies);
- get_cluster_flags(&sys->cinfo.flags);
- sys->cinfo.ctime = get_cluster_ctime();
- get_cluster_store((char *)sys->cinfo.store);
sys->cinfo.nr_nodes = epoch_log_read(sys->cinfo.epoch,
sys->cinfo.nodes,
diff --git a/sheep/ops.c b/sheep/ops.c
index 86df149..3d92c52 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -255,8 +255,6 @@ static int cluster_make_fs(const struct sd_req *req, struct sd_rsp *rsp,
ret = sd_store->format();
if (ret != SD_RES_SUCCESS)
return ret;
- if (set_cluster_store(store_name) < 0)
- return SD_RES_EIO;
ret = sd_store->init();
if (ret != SD_RES_SUCCESS)
@@ -267,10 +265,7 @@ static int cluster_make_fs(const struct sd_req *req, struct sd_rsp *rsp,
if (!sys->cinfo.nr_copies)
sys->cinfo.nr_copies = SD_DEFAULT_COPIES;
sys->cinfo.ctime = req->cluster.ctime;
-
- set_cluster_ctime(sys->cinfo.ctime);
- set_cluster_copies(sys->cinfo.nr_copies);
- set_cluster_flags(sys->cinfo.flags);
+ set_cluster_config(&sys->cinfo);
for (i = 1; i <= latest_epoch; i++)
remove_epoch(i);
@@ -439,7 +434,7 @@ static int local_stat_cluster(struct request *req)
log = (struct epoch_log *)req->data + i;
memset(log, 0, sizeof(*log));
log->epoch = epoch;
- log->ctime = get_cluster_ctime();
+ log->ctime = sys->cinfo.ctime;
nr_nodes = epoch_log_read_with_timestamp(epoch, log->nodes,
sizeof(log->nodes),
(time_t *)&log->time);
@@ -545,8 +540,6 @@ static int cluster_force_recover_main(const struct sd_req *req,
{
struct vnode_info *old_vnode_info, *vnode_info;
int ret = SD_RES_SUCCESS;
- uint8_t c;
- uint16_t f;
struct sd_node *nodes = data;
size_t nr_nodes = rsp->data_length / sizeof(*nodes);
@@ -555,20 +548,6 @@ static int cluster_force_recover_main(const struct sd_req *req,
return SD_RES_FORCE_RECOVER;
}
- ret = get_cluster_copies(&c);
- if (ret) {
- sd_printf(SDOG_EMERG, "cannot get cluster copies");
- goto err;
- }
- ret = get_cluster_flags(&f);
- if (ret) {
- sd_printf(SDOG_EMERG, "cannot get cluster flags");
- goto err;
- }
-
- sys->cinfo.nr_copies = c;
- sys->cinfo.flags = f;
-
sys->cinfo.epoch++; /* some nodes are left, so we get a new epoch */
ret = log_current_epoch();
if (ret) {
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 804aa1c..d194292 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -271,12 +271,8 @@ int update_epoch_log(uint32_t epoch, struct sd_node *nodes, size_t nr_nodes);
int log_current_epoch(void);
extern char *config_path;
-int set_cluster_copies(uint8_t copies);
-int get_cluster_copies(uint8_t *copies);
-int set_cluster_flags(uint16_t flags);
-int get_cluster_flags(uint16_t *flags);
-int set_cluster_store(const char *name);
-int get_cluster_store(char *buf);
+int set_cluster_config(const struct cluster_info *cinfo);
+int get_cluster_config(struct cluster_info *cinfo);
int set_node_space(uint64_t space);
int get_node_space(uint64_t *space);
@@ -291,8 +287,6 @@ int epoch_log_read_remote(uint32_t epoch, struct sd_node *nodes, int len,
uint32_t get_latest_epoch(void);
void init_config_path(const char *base_path);
int init_config_file(void);
-int set_cluster_ctime(uint64_t ctime);
-uint64_t get_cluster_ctime(void);
int get_obj_list(const struct sd_req *, struct sd_rsp *, void *);
int objlist_cache_cleanup(uint32_t vid);
diff --git a/sheep/store.c b/sheep/store.c
index f233f35..bc9531b 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -268,11 +268,7 @@ static int init_epoch_path(const char *base_path)
int init_store_driver(bool is_gateway)
{
char driver_name[STORE_LEN], *p;
- int ret;
- ret = get_cluster_store((char *)sys->cinfo.store);
- if (ret != SD_RES_SUCCESS)
- return ret;
pstrcpy(driver_name, sizeof(driver_name), (char *)sys->cinfo.store);
p = memchr(driver_name, '\0', STORE_LEN);
--
1.7.9.5
More information about the sheepdog
mailing list