📄 pseudocode
字号:
handle cluster refresh () ====>if (I dont think this pkt src is in this cluster) { ignore it return}define s = pkt srcupdate s refresh info in the appropriate agent infocase 1: // I am the root if (s thinks its the root) { if (s is doing root transfer to me) { /* then I rule ... I will maintain status quo */ absorb all members from s unknown to me if (s doing cluster remove) remove it (this might cause cluster split etc) return } if (s is doing root transfer to p, where p <> me) define y = p else define y = s /* Root challenge should always be sent to s, root transfer * will be sent to y */ s_max = dist of s from its farthest known member my_max = dist of me from my farthest known member /* memberset(x) defined as set of members with known dists */ if (memberset(s) == memberset(mine)) { if ( (my_max < s_max) || ( (my_max == s_max) && (my->id < s->id) ) ) { // i.e. I win absorb all members unknown to me from s send root-challenge to s iff y == s (what about to y, for y <> s) return } else { // I lose send root-transfer to y return } } else if (memberset(s) is a superset of memberset(mine)) { send root-transfer to y return } else if (memberset(mine) is a superset of memberset(s)) { absorb all members unknown to me from s send root-challenge to s iff y == s return } else { // each has some members in memberset unknown to the other if (my id < s->id) { absorb all members unknown to me from s send root-challenge to s iff y == s return /* Root-challenge: send him an immediate cluster refresh */ /* note: if s was doing a root-transfer to someone else, and * if p was not in my cluster, I should add p ? * automatically taken care of, since p in s cluster */ } else { /* my id > s->id, and so I lose */ send root-transfer to y return } } } else { // s does not think it is the root }case 2: // I am not the root if (s thinks it is the root) { if (I also think s is the root) { update info of the cluster as suggested by s } else (I think someone else is the root) { // do nothing, just stay put } }end handle-cluster-refresh <=======cluster-refresh-timeout () ========>purge all members that are deadif (i am root and cluster size too small/too large) { do appropriate repair if (delay cluster repair flag set) { clear it } return} if (root is dead) { select a new root,r, based on local dist info if (r == me) { if (cluster size is too small/too lare) { set a delay cluster repair flag /* cluster will be repaired in next timeout */ } send appropriate new cluster refresh to all members }end cluster-refresh-timeout <========/* Note, in regular cluster-refresh, the leader will repair * the cluster only if its too large/too small, if the delay * cluster repair flag is not set. * Alternative: Cluster repair done only at cluster repair * timeouts */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -