102 lines
1.9 KiB
Go
102 lines
1.9 KiB
Go
package shardctrler
|
|
|
|
//
|
|
// Shardctrler clerk.
|
|
//
|
|
|
|
import "6.5840/labrpc"
|
|
import "time"
|
|
import "crypto/rand"
|
|
import "math/big"
|
|
|
|
type Clerk struct {
|
|
servers []*labrpc.ClientEnd
|
|
// Your data here.
|
|
}
|
|
|
|
func nrand() int64 {
|
|
max := big.NewInt(int64(1) << 62)
|
|
bigx, _ := rand.Int(rand.Reader, max)
|
|
x := bigx.Int64()
|
|
return x
|
|
}
|
|
|
|
func MakeClerk(servers []*labrpc.ClientEnd) *Clerk {
|
|
ck := new(Clerk)
|
|
ck.servers = servers
|
|
// Your code here.
|
|
return ck
|
|
}
|
|
|
|
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)
|
|
}
|
|
}
|
|
|
|
func (ck *Clerk) Join(servers map[int][]string) {
|
|
args := &JoinArgs{}
|
|
// Your code here.
|
|
args.Servers = 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)
|
|
}
|
|
}
|
|
|
|
func (ck *Clerk) Leave(gids []int) {
|
|
args := &LeaveArgs{}
|
|
// Your code here.
|
|
args.GIDs = gids
|
|
|
|
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)
|
|
}
|
|
}
|
|
|
|
func (ck *Clerk) Move(shard int, gid int) {
|
|
args := &MoveArgs{}
|
|
// Your code here.
|
|
args.Shard = shard
|
|
args.GID = gid
|
|
|
|
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)
|
|
}
|
|
}
|