[Sheepdog] [PATCH 2/3] sheep: clean up group.c by sys_stat_* helpers
Liu Yuan
namei.unix at gmail.com
Thu Oct 20 08:49:56 CEST 2011
From: Liu Yuan <tailai.ly at taobao.com>
And in passing fix one minor status check logic in
update_cluster_info() for newly joined node.
Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
sheep/group.c | 65 +++++++++++++++++++++++++++-----------------------------
1 files changed, 31 insertions(+), 34 deletions(-)
diff --git a/sheep/group.c b/sheep/group.c
index 401dfcb..a03f709 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -294,6 +294,7 @@ void cluster_queue_request(struct work *work, int idx)
struct vdi_op_message *msg;
struct epoch_log *log;
int ret = SD_RES_SUCCESS, i, max_logs, epoch;
+ uint32_t sys_stat = sys_stat_get();
eprintf("%p %x\n", req, hdr->opcode);
@@ -329,7 +330,7 @@ void cluster_queue_request(struct work *work, int idx)
epoch--;
}
- switch (sys->status) {
+ switch (sys_stat) {
case SD_STATUS_OK:
ret = SD_RES_SUCCESS;
break;
@@ -545,8 +546,7 @@ static int cluster_sanity_check(struct sheepdog_node_list_entry *entries,
struct sheepdog_node_list_entry local_entries[SD_MAX_NODES];
uint32_t lepoch;
- if (sys->status == SD_STATUS_WAIT_FOR_FORMAT ||
- sys->status == SD_STATUS_SHUTDOWN)
+ if (sys_stat_wait_format() || sys_stat_shutdown())
goto out;
/* When the joinning node is newly created, we need to check nothing. */
if (nr_entries == 0)
@@ -563,7 +563,7 @@ static int cluster_sanity_check(struct sheepdog_node_list_entry *entries,
goto out;
}
- if (sys->status == SD_STATUS_OK || sys->status == SD_STATUS_HALT)
+ if (sys_can_recover())
goto out;
if (epoch < lepoch) {
@@ -594,8 +594,9 @@ static int get_cluster_status(struct sheepdog_node_list_entry *from,
struct sheepdog_node_list_entry local_entries[SD_MAX_NODES];
struct node *node;
char str[256];
+ uint32_t sys_stat = sys_stat_get();
- *status = sys->status;
+ *status = sys_stat;
if (inc_epoch)
*inc_epoch = 0;
@@ -603,7 +604,7 @@ static int get_cluster_status(struct sheepdog_node_list_entry *from,
if (ret)
goto out;
- switch (sys->status) {
+ switch (sys_stat) {
case SD_STATUS_HALT:
case SD_STATUS_OK:
if (inc_epoch)
@@ -803,7 +804,7 @@ static void update_cluster_info(struct join_message *msg)
return;
}
- if (sys->status == SD_STATUS_JOIN_FAILED)
+ if (sys_stat_join_failed())
return;
if (sys->join_finished)
@@ -851,9 +852,8 @@ join_finished:
update_epoch_log(sys->epoch);
update_epoch_store(sys->epoch);
}
-
- if (sys->status != SD_STATUS_OK ||
- sys->status != SD_STATUS_HALT) {
+ /* Fresh node */
+ if (!sys_stat_ok() && !sys_stat_halt()) {
set_global_nr_copies(sys->nr_sobjs);
set_cluster_flags(sys->flags);
set_cluster_ctime(msg->ctime);
@@ -862,7 +862,7 @@ join_finished:
print_node_list(&sys->sd_node_list);
- sys->status = msg->cluster_status;
+ sys_stat_set(msg->cluster_status);
return;
}
@@ -987,18 +987,18 @@ static void vdi_op_done(struct vdi_op_message *msg)
set_cluster_flags(sys->flags);
if (sys_flag_nohalt())
- sys->status = SD_STATUS_OK;
+ sys_stat_set(SD_STATUS_OK);
else {
int nr_zones = get_zones_nr_from(&sys->sd_node_list);
if (nr_zones >= sys->nr_sobjs)
- sys->status = SD_STATUS_OK;
+ sys_stat_set(SD_STATUS_OK);
else
- sys->status = SD_STATUS_HALT;
+ sys_stat_set(SD_STATUS_HALT);
}
break;
case SD_OP_SHUTDOWN:
- sys->status = SD_STATUS_SHUTDOWN;
+ sys_stat_set(SD_STATUS_SHUTDOWN);
break;
default:
eprintf("unknown operation %d\n", hdr->opcode);
@@ -1067,7 +1067,7 @@ static void __sd_notify(struct cpg_event *cevent)
switch (m->op) {
case SD_MSG_JOIN:
if (((struct join_message *)m)->cluster_status == SD_STATUS_OK)
- if (sys->status != SD_STATUS_OK) {
+ if (!sys_stat_ok()) {
struct join_message *msg = (struct join_message *)m;
int i;
@@ -1152,7 +1152,7 @@ static void __sd_notify_done(struct cpg_event *cevent)
list_del(&node->list);
free(node);
- if (sys->status == SD_STATUS_OK) {
+ if (sys_stat_ok()) {
sys->epoch++;
update_epoch_log(sys->epoch);
update_epoch_store(sys->epoch);
@@ -1160,7 +1160,7 @@ static void __sd_notify_done(struct cpg_event *cevent)
}
/* fall through */
case SD_MSG_MASTER_TRANSFER:
- if (sys->status == SD_STATUS_WAIT_FOR_JOIN) {
+ if (sys_stat_wait_join()) {
add_node_to_leave_list(m);
/* Sheep needs this to identify itself as master.
@@ -1178,7 +1178,7 @@ static void __sd_notify_done(struct cpg_event *cevent)
dprintf("%d == %d + %d \n", nr_local, nr, nr_leave);
if (nr_local == nr + nr_leave) {
- sys->status = SD_STATUS_OK;
+ sys_stat_set(SD_STATUS_OK);
update_epoch_log(sys->epoch);
update_epoch_store(sys->epoch);
}
@@ -1215,19 +1215,18 @@ static void __sd_notify_done(struct cpg_event *cevent)
}
}
- if (do_recovery &&
- (sys->status == SD_STATUS_OK || sys->status == SD_STATUS_HALT)) {
+ if (do_recovery && sys_can_recover()) {
list_for_each_entry_safe(node, t, &sys->leave_list, list) {
list_del(&node->list);
}
start_recovery(sys->epoch);
}
- if (sys->status == SD_STATUS_HALT) {
+ if (sys_stat_halt()) {
int nr_zones = get_zones_nr_from(&sys->sd_node_list);
if (nr_zones >= sys->nr_sobjs)
- sys->status = SD_STATUS_OK;
+ sys_stat_set(SD_STATUS_OK);
}
}
@@ -1295,8 +1294,7 @@ static int del_node(struct sheepid *id)
list_del(&node->list);
free(node);
- if (sys->status == SD_STATUS_OK ||
- sys->status == SD_STATUS_HALT) {
+ if (sys_can_recover()) {
nr = get_ordered_sd_node_list(e);
dprintf("update epoch, %d, %d\n", sys->epoch + 1, nr);
epoch_log_write(sys->epoch + 1, (char *)e,
@@ -1447,7 +1445,7 @@ static void __sd_join_done(struct cpg_event *cevent)
update_cluster_info(&msg);
- if (sys->status == SD_STATUS_OK) /* sheepdog starts with one node */
+ if (sys_stat_ok()) /* sheepdog starts with one node */
start_recovery(sys->epoch);
return;
@@ -1468,15 +1466,14 @@ static void __sd_leave_done(struct cpg_event *cevent)
print_node_list(&sys->sd_node_list);
- if (node_left &&
- (sys->status == SD_STATUS_OK || sys->status == SD_STATUS_HALT))
+ if (node_left && sys_can_recover())
start_recovery(sys->epoch);
- if (sys->status == SD_STATUS_OK && !sys_flag_nohalt()) {
+ if (sys_can_halt()) {
int nr_zones = get_zones_nr_from(&sys->sd_node_list);
if (nr_zones < sys->nr_sobjs)
- sys->status = SD_STATUS_HALT;
+ sys_stat_set(SD_STATUS_HALT);
}
}
@@ -1860,7 +1857,7 @@ static void sd_join_handler(struct sheepid *joined, struct sheepid *members,
for (i = 0; i < nr_members; i++)
dprintf("[%x] %s\n", i, sheepid_to_str(members + i));
- if (sys->status == SD_STATUS_SHUTDOWN)
+ if (sys_stat_shutdown())
return;
w = zalloc(sizeof(*w));
@@ -1906,7 +1903,7 @@ static void sd_leave_handler(struct sheepid *left, struct sheepid *members,
for (i = 0; i < nr_members; i++)
dprintf("[%x] %s\n", i, sheepid_to_str(members + i));
- if (sys->status == SD_STATUS_SHUTDOWN)
+ if (sys_stat_shutdown())
return;
w = zalloc(sizeof(*w));
@@ -1982,9 +1979,9 @@ int create_cluster(int port, int64_t zone)
dprintf("zone id = %u\n", sys->this_node.zone);
if (get_latest_epoch() == 0)
- sys->status = SD_STATUS_WAIT_FOR_FORMAT;
+ sys_stat_set(SD_STATUS_WAIT_FOR_FORMAT);
else
- sys->status = SD_STATUS_WAIT_FOR_JOIN;
+ sys_stat_set(SD_STATUS_WAIT_FOR_JOIN);
INIT_LIST_HEAD(&sys->sd_node_list);
INIT_LIST_HEAD(&sys->cpg_node_list);
INIT_LIST_HEAD(&sys->pending_list);
--
1.7.6.1
More information about the sheepdog
mailing list