type ShardCtrler struct { mu sync.Mutex me int rf *raft.Raft applyCh chan raft.ApplyMsg
// Your data here.
configs []Config // indexed by config num }
// A configuration -- an assignment of shards to groups. // Please don't change this. type Config struct { Num int// config number Shards [NShards]int// shard -> gid Groups map[int][]string// gid -> servers[] }
for { // try each known server. for _, srv := range ck.servers { var reply JoinReply ok := srv.Call("ShardCtrler.Join", args, &reply) if ok && reply.WrongLeader == false { return } } time.Sleep(100 * time.Millisecond) } }
for { // try each known server. for _, srv := range ck.servers { var reply LeaveReply ok := srv.Call("ShardCtrler.Leave", args, &reply) if ok && reply.WrongLeader == false { return } } time.Sleep(100 * time.Millisecond) } }
Move 方法的参数是一个 shard 编号和一个 Group ID。主要是用于将一个 shard 移动到指定的 Group 中。
for { // try each known server. for _, srv := range ck.servers { var reply MoveReply ok := srv.Call("ShardCtrler.Move", args, &reply) if ok && reply.WrongLeader == false { return } } time.Sleep(100 * time.Millisecond) } }
func(ck *Clerk) Query(num int) Config { args := &QueryArgs{} // Your code here. args.Num = num for { // try each known server. for _, srv := range ck.servers { var reply QueryReply ok := srv.Call("ShardCtrler.Query", args, &reply) if ok && reply.WrongLeader == false { return reply.Config } } time.Sleep(100 * time.Millisecond) } }