Skip to content

Commit

Permalink
lab4
Browse files Browse the repository at this point in the history
  • Loading branch information
Yan0613 committed Jan 25, 2024
1 parent 8f8e38e commit 57b2d5a
Show file tree
Hide file tree
Showing 3 changed files with 322 additions and 40 deletions.
40 changes: 17 additions & 23 deletions src/shardctrler/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,17 @@ package shardctrler
import "6.5840/labrpc"
import "time"
import "crypto/rand"
import rand2 "math/rand"
import "math/big"

type Clerk struct {
servers []*labrpc.ClientEnd
// Your data here.
cid int32
leader int32
}

func (ck *Clerk) args() Args {
return Args{ClientId: ck.cid, RequestId: nrand()}
}

func nrand() int64 {
Expand All @@ -24,20 +30,18 @@ func nrand() int64 {
func MakeClerk(servers []*labrpc.ClientEnd) *Clerk {
ck := new(Clerk)
ck.servers = servers
// Your code here.
ck.cid = rand2.Int31()
return ck
}

func (ck *Clerk) Query(num int) Config {
args := &QueryArgs{}
// Your code here.
args.Num = num
args := &QueryArgs{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 {
if ok && reply.WrongLeader == false && reply.Err == OK {
return reply.Config
}
}
Expand All @@ -46,16 +50,13 @@ func (ck *Clerk) Query(num int) Config {
}

func (ck *Clerk) Join(servers map[int][]string) {
args := &JoinArgs{}
// Your code here.
args.Servers = servers

args := &JoinArgs{Servers: servers, Args: ck.args()}
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 {
if ok && reply.WrongLeader == false && reply.Err == OK {
return
}
}
Expand All @@ -64,16 +65,13 @@ func (ck *Clerk) Join(servers map[int][]string) {
}

func (ck *Clerk) Leave(gids []int) {
args := &LeaveArgs{}
// Your code here.
args.GIDs = gids

args := &LeaveArgs{GIDs: gids, Args: ck.args()}
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 {
if ok && reply.WrongLeader == false && reply.Err == OK {
return
}
}
Expand All @@ -82,20 +80,16 @@ func (ck *Clerk) Leave(gids []int) {
}

func (ck *Clerk) Move(shard int, gid int) {
args := &MoveArgs{}
// Your code here.
args.Shard = shard
args.GID = gid

args := &MoveArgs{Shard: shard, GID: gid, Args: ck.args()}
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 {
if ok && reply.WrongLeader == false && reply.Err == OK {
return
}
}
time.Sleep(100 * time.Millisecond)
}
}
}
13 changes: 11 additions & 2 deletions src/shardctrler/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,20 @@ type Config struct {
}

const (
OK = "OK"
OK = "OK"
ErrTimeout = "ErrTimeout"
)

type Err string

type Args struct {
ClientId int32
RequestId int64
}

type JoinArgs struct {
Servers map[int][]string // new GID -> servers mappings
Args
}

type JoinReply struct {
Expand All @@ -45,6 +52,7 @@ type JoinReply struct {

type LeaveArgs struct {
GIDs []int
Args
}

type LeaveReply struct {
Expand All @@ -55,6 +63,7 @@ type LeaveReply struct {
type MoveArgs struct {
Shard int
GID int
Args
}

type MoveReply struct {
Expand All @@ -70,4 +79,4 @@ type QueryReply struct {
WrongLeader bool
Err Err
Config Config
}
}
Loading

0 comments on commit 57b2d5a

Please sign in to comment.