FAIL的发送
过程
- 构建消息头
- 把处于FAIL状态的node的ID填入消息的数据部分
- 广播消息
遍历cluster节点字典:
跳过还没有创建连接的node
跳过myself和处于handshake的node
给node发送FAIL消息
FAIL的接收处理
过程
第1 ~ 3步是涵盖所有类型的消息,详细请参考PING/PONG/MEET。
- 合法性检查
- 根据link和消息头,从cluster节点字典中查找实体sender
- 通用处理
- 处理FAIL消息
if sender存在:
根据FAIL消息数据中的nodename,在cluster节点字典中查找node
if node存在 &&
node != myself && /* 我们都收到消息了,不可能FAIL */
node没有处于FAIL状态: /* 没FAIL才需要更新状态 */
把node更新成FAIL /* 如果原本处于PFAIL,则先需要清除PFAIL */
设置node的failTime为当前时间
else: /* sender不存在 */
不清楚sender的身份,所以忽略此消息
UPDATE的发送
过程
- 构建消息头
- 把需要update的node的ID,configEpoch和slots填入消息的数据部分
- 给node发送UPDATE消息
UPDATE的接收处理
过程
第1 ~ 3步是涵盖所有类型的消息,详细请参考PING/PONG/MEET。
- 合法性检查
- 根据link和消息头,从cluster节点字典中查找实体sender
- 通用处理
- 处理UPDATE消息
if sender不存在: /* 不清楚sender的身份,丢弃消息 */
return
根据消息数据中的hostname,在cluster节点字典中查找node
if node不存在: /* 没有node的信息,不需要更新 */
return
if node的configEpoch >= 消息数据中的configEpoch: /* 消息是旧的,丢弃掉 */
return
if node原本是slave: /* UPDATE消息是用来更新slot的归属,所以只针对master节点 */
把node转换成master /* 参考PING/PONG/MEET的 Point-3 */
/* 更新node的configEpoch */
node的configEpoch = 消息数据中的configEpoch
重新绑定消息数据中的slots到node /* 参考PING/PONG/MEET的 Point-6 */