From: Liu Yuan <tailai.ly at taobao.com> This is sugguested by Kazutaka for crash cluster recovery to remove the timing race casued by leave message. This race was found by Kazutaka's below script: #!/bin/bash # create a directory which has a different creation time sheep /store/1 -p 7001 sleep 1 collie cluster format -p 7001 collie cluster shutdown -p 7001 sleep 1 # start Sheepdog sheep /store/0 -p 7000 sleep 1 collie cluster format -p 7000 while true; do sheep /store/1 -p 7001 sheep /store/2 -p 7002 # wait for node join while [ "`collie cluster info -p 7002 -r 2>&1 | head -1`" != 'running' ]; do sleep 0.1 done if [ "`collie node list -p 7002 -r | wc -l`" -ne 2 ]; then # break if the result is not correct break fi pkill -f "sheep /store/2" done # show results collie cluster info -p 7000 collie cluster info -p 7002 Signed-off-by: Liu Yuan <tailai.ly at taobao.com> --- sheep/group.c | 10 ++++++++++ sheep/sheep_priv.h | 1 + 2 files changed, 11 insertions(+), 0 deletions(-) diff --git a/sheep/group.c b/sheep/group.c index 4bf275e..6301f1b 100644 --- a/sheep/group.c +++ b/sheep/group.c @@ -84,6 +84,11 @@ struct vdi_op_message { uint8_t data[0]; }; +struct mastership_tx_message { + struct message_header header; + uint32_t epoch; +}; + struct work_deliver { struct cpg_event cev; @@ -162,6 +167,11 @@ static inline int leave_message(struct message_header *m) return m->op == SD_MSG_LEAVE; } +static inline int master_tx_message(struct message_header *m) +{ + return m->op == SD_MSG_MASTER_TRANSFER; +} + static int send_message(cpg_handle_t handle, struct message_header *msg) { struct iovec iov; diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h index 6680f79..b7e5dfc 100644 --- a/sheep/sheep_priv.h +++ b/sheep/sheep_priv.h @@ -30,6 +30,7 @@ #define SD_MSG_VDI_OP 0x02 #define SD_MSG_MASTER_CHANGED 0x03 #define SD_MSG_LEAVE 0x04 +#define SD_MSG_MASTER_TRANSFER 0x05 #define SD_STATUS_OK 0x00 #define SD_STATUS_WAIT_FOR_FORMAT 0x01 -- 1.7.6.1 |