This commit is contained in:
Frans Kaashoek 2025-04-02 06:49:54 -04:00
parent 8f21c11cfc
commit bb597de980
6 changed files with 31 additions and 43 deletions

View File

@ -57,9 +57,9 @@ func (sck *ShardCtrler) ChangeConfigTo(new *shardcfg.ShardConfig) {
} }
// Return the current configuration and its version number // Return the current configuration
func (sck *ShardCtrler) Query() (*shardcfg.ShardConfig, rpc.Tversion) { func (sck *ShardCtrler) Query() *shardcfg.ShardConfig {
// Your code here. // Your code here.
return nil, 0 return nil
} }

View File

@ -29,7 +29,7 @@ func (ck *Clerk) Put(key string, value string, version rpc.Tversion) rpc.Err {
return "" return ""
} }
func (ck *Clerk) Freeze(s shardcfg.Tshid, num shardcfg.Tnum) ([]byte, rpc.Err) { func (ck *Clerk) FreezeShard(s shardcfg.Tshid, num shardcfg.Tnum) ([]byte, rpc.Err) {
return nil, "" return nil, ""
} }
@ -37,6 +37,6 @@ func (ck *Clerk) InstallShard(s shardcfg.Tshid, state []byte, num shardcfg.Tnum)
return "" return ""
} }
func (ck *Clerk) Delete(s shardcfg.Tshid, num shardcfg.Tnum) rpc.Err { func (ck *Clerk) DeleteShard(s shardcfg.Tshid, num shardcfg.Tnum) rpc.Err {
return "" return ""
} }

View File

@ -37,17 +37,17 @@ func (kv *KVServer) Restore(data []byte) {
// Your code here // Your code here
} }
func (kv *KVServer) Get(args *shardrpc.GetArgs, reply *rpc.GetReply) { func (kv *KVServer) Get(args *rpc.GetArgs, reply *rpc.GetReply) {
// Your code here // Your code here
} }
func (kv *KVServer) Put(args *shardrpc.PutArgs, reply *rpc.PutReply) { func (kv *KVServer) Put(args *rpc.PutArgs, reply *rpc.PutReply) {
// Your code here // Your code here
} }
// Freeze the specified shard (i.e., reject future Get/Puts for this // Freeze the specified shard (i.e., reject future Get/Puts for this
// shard) and return the key/values stored in that shard. // shard) and return the key/values stored in that shard.
func (kv *KVServer) Freeze(args *shardrpc.FreezeArgs, reply *shardrpc.FreezeReply) { func (kv *KVServer) FreezeShard(args *shardrpc.FreezeShardArgs, reply *shardrpc.FreezeShardReply) {
// Your code here // Your code here
} }
@ -57,7 +57,7 @@ func (kv *KVServer) InstallShard(args *shardrpc.InstallShardArgs, reply *shardrp
} }
// Delete the specified shard. // Delete the specified shard.
func (kv *KVServer) Delete(args *shardrpc.DeleteShardArgs, reply *shardrpc.DeleteShardReply) { func (kv *KVServer) DeleteShard(args *shardrpc.DeleteShardArgs, reply *shardrpc.DeleteShardReply) {
// Your code here // Your code here
} }
@ -86,9 +86,9 @@ func (kv *KVServer) killed() bool {
func StartServerShardGrp(servers []*labrpc.ClientEnd, gid tester.Tgid, me int, persister *tester.Persister, maxraftstate int) []tester.IService { func StartServerShardGrp(servers []*labrpc.ClientEnd, gid tester.Tgid, me int, persister *tester.Persister, maxraftstate int) []tester.IService {
// call labgob.Register on structures you want // call labgob.Register on structures you want
// Go's RPC library to marshall/unmarshall. // Go's RPC library to marshall/unmarshall.
labgob.Register(shardrpc.PutArgs{}) labgob.Register(rpc.PutArgs{})
labgob.Register(shardrpc.GetArgs{}) labgob.Register(rpc.GetArgs{})
labgob.Register(shardrpc.FreezeArgs{}) labgob.Register(shardrpc.FreezeShardArgs{})
labgob.Register(shardrpc.InstallShardArgs{}) labgob.Register(shardrpc.InstallShardArgs{})
labgob.Register(shardrpc.DeleteShardArgs{}) labgob.Register(shardrpc.DeleteShardArgs{})
labgob.Register(rsm.Op{}) labgob.Register(rsm.Op{})

View File

@ -5,24 +5,12 @@ import (
"6.5840/shardkv1/shardcfg" "6.5840/shardkv1/shardcfg"
) )
// Same as Put in kvsrv1/rpc type FreezeShardArgs struct {
type PutArgs struct {
Key string
Value string
Version rpc.Tversion
}
// Same as Get in kvsrv1/rpc
type GetArgs struct {
Key string
}
type FreezeArgs struct {
Shard shardcfg.Tshid Shard shardcfg.Tshid
Num shardcfg.Tnum Num shardcfg.Tnum
} }
type FreezeReply struct { type FreezeShardReply struct {
State []byte State []byte
Num shardcfg.Tnum Num shardcfg.Tnum
Err rpc.Err Err rpc.Err

View File

@ -40,9 +40,9 @@ func TestInitQuery5A(t *testing.T) {
sck.InitConfig(scfg) sck.InitConfig(scfg)
// Read the initial configuration and check it // Read the initial configuration and check it
cfg, v := sck.Query() cfg := sck.Query()
if v != 1 || cfg.Num != 1 || cfg.Shards[0] != shardcfg.Gid1 { if cfg.Num != 1 || cfg.Shards[0] != shardcfg.Gid1 {
ts.t.Fatalf("Static wrong %v %v", cfg, v) ts.t.Fatalf("Static wrong %v", cfg)
} }
cfg.CheckConfig(t, []tester.Tgid{shardcfg.Gid1}) cfg.CheckConfig(t, []tester.Tgid{shardcfg.Gid1})
} }
@ -86,14 +86,14 @@ func TestJoinBasic5A(t *testing.T) {
ka, va := ts.SpreadPuts(ck, NKEYS) ka, va := ts.SpreadPuts(ck, NKEYS)
sck := ts.ShardCtrler() sck := ts.ShardCtrler()
cfg, _ := sck.Query() cfg := sck.Query()
gid2 := ts.newGid() gid2 := ts.newGid()
if ok := ts.joinGroups(sck, []tester.Tgid{gid2}); !ok { if ok := ts.joinGroups(sck, []tester.Tgid{gid2}); !ok {
ts.t.Fatalf("TestJoinBasic5A: joinGroups failed") ts.t.Fatalf("TestJoinBasic5A: joinGroups failed")
} }
cfg1, _ := sck.Query() cfg1 := sck.Query()
if cfg.Num+1 != cfg1.Num { if cfg.Num+1 != cfg1.Num {
ts.t.Fatalf("TestJoinBasic5A: wrong num %d expected %d ", cfg1.Num, cfg.Num+1) ts.t.Fatalf("TestJoinBasic5A: wrong num %d expected %d ", cfg1.Num, cfg.Num+1)
} }
@ -269,7 +269,7 @@ func TestShutdown5A(t *testing.T) {
// Test that Gets for keys at groups that are alive // Test that Gets for keys at groups that are alive
// return // return
func TestProgressShutdown(t *testing.T) { func TestProgressShutdown5A(t *testing.T) {
const ( const (
NJOIN = 4 NJOIN = 4
NSEC = 2 NSEC = 2
@ -298,7 +298,7 @@ func TestProgressShutdown(t *testing.T) {
alive[g] = true alive[g] = true
} }
cfg, _ := sck.Query() cfg := sck.Query()
ch := make(chan rpc.Err) ch := make(chan rpc.Err)
go func() { go func() {
@ -321,7 +321,7 @@ func TestProgressShutdown(t *testing.T) {
} }
// Test that Gets from a non-moving shard return quickly // Test that Gets from a non-moving shard return quickly
func TestProgressJoin(t *testing.T) { func TestProgressJoin5A(t *testing.T) {
const ( const (
NJOIN = 4 NJOIN = 4
NSEC = 4 NSEC = 4
@ -340,7 +340,7 @@ func TestProgressJoin(t *testing.T) {
grps := ts.groups(NJOIN) grps := ts.groups(NJOIN)
ts.joinGroups(sck, grps) ts.joinGroups(sck, grps)
cfg, _ := sck.Query() cfg := sck.Query()
newcfg := cfg.Copy() newcfg := cfg.Copy()
newgid := tester.Tgid(NJOIN + 3) newgid := tester.Tgid(NJOIN + 3)
if ok := newcfg.JoinBalance(map[tester.Tgid][]string{newgid: []string{"xxx"}}); !ok { if ok := newcfg.JoinBalance(map[tester.Tgid][]string{newgid: []string{"xxx"}}); !ok {
@ -491,7 +491,7 @@ func TestJoinLeave5B(t *testing.T) {
ka, va := ts.SpreadPuts(ck, NKEYS) ka, va := ts.SpreadPuts(ck, NKEYS)
sck := ts.ShardCtrler() sck := ts.ShardCtrler()
cfg, _ := sck.Query() cfg := sck.Query()
ts.Group(gid1).Shutdown() ts.Group(gid1).Shutdown()
@ -520,7 +520,7 @@ func TestJoinLeave5B(t *testing.T) {
ts.Fatalf("Join didn't complete") ts.Fatalf("Join didn't complete")
} }
cfg1, _ := sck.Query() cfg1 := sck.Query()
if cfg.Num+1 != cfg1.Num { if cfg.Num+1 != cfg1.Num {
ts.t.Fatalf("wrong num %d expected %d ", cfg1.Num, cfg.Num+1) ts.t.Fatalf("wrong num %d expected %d ", cfg1.Num, cfg.Num+1)
} }
@ -636,7 +636,7 @@ func TestPartitionControllerJoin5C(t *testing.T) {
sck0 := ts.makeShardCtrler() sck0 := ts.makeShardCtrler()
sck0.InitController() sck0.InitController()
scfg, _ := sck0.Query() scfg := sck0.Query()
if !scfg.IsMember(ngid) { if !scfg.IsMember(ngid) {
t.Fatalf("Didn't recover gid %d", ngid) t.Fatalf("Didn't recover gid %d", ngid)
} }

View File

@ -127,14 +127,14 @@ func (ts *Test) StartServerShardGrp(servers []*labrpc.ClientEnd, gid tester.Tgid
} }
func (ts *Test) checkMember(sck *shardctrler.ShardCtrler, gid tester.Tgid) bool { func (ts *Test) checkMember(sck *shardctrler.ShardCtrler, gid tester.Tgid) bool {
cfg, _ := sck.Query() cfg := sck.Query()
ok := cfg.IsMember(gid) ok := cfg.IsMember(gid)
return ok return ok
} }
// Add group gid // Add group gid
func (ts *Test) join(sck *shardctrler.ShardCtrler, gid tester.Tgid, srvs []string) { func (ts *Test) join(sck *shardctrler.ShardCtrler, gid tester.Tgid, srvs []string) {
cfg, _ := sck.Query() cfg := sck.Query()
newcfg := cfg.Copy() newcfg := cfg.Copy()
ok := newcfg.JoinBalance(map[tester.Tgid][]string{gid: srvs}) ok := newcfg.JoinBalance(map[tester.Tgid][]string{gid: srvs})
if !ok { if !ok {
@ -157,7 +157,7 @@ func (ts *Test) joinGroups(sck *shardctrler.ShardCtrler, gids []tester.Tgid) boo
// Group gid leaves. // Group gid leaves.
func (ts *Test) leave(sck *shardctrler.ShardCtrler, gid tester.Tgid) { func (ts *Test) leave(sck *shardctrler.ShardCtrler, gid tester.Tgid) {
cfg, _ := sck.Query() cfg := sck.Query()
newcfg := cfg.Copy() newcfg := cfg.Copy()
ok := newcfg.LeaveBalance([]tester.Tgid{gid}) ok := newcfg.LeaveBalance([]tester.Tgid{gid})
if !ok { if !ok {
@ -267,7 +267,7 @@ func (ts *Test) partitionCtrler(ck kvtest.IKVClerk, gid tester.Tgid, ka, va []st
sck, clnt := ts.makeShardCtrlerClnt() sck, clnt := ts.makeShardCtrlerClnt()
sck.InitController() sck.InitController()
cfg, _ := ts.ShardCtrler().Query() cfg := ts.ShardCtrler().Query()
num := cfg.Num num := cfg.Num
state := 0 state := 0
@ -320,7 +320,7 @@ func (ts *Test) partitionCtrler(ck kvtest.IKVClerk, gid tester.Tgid, ka, va []st
sck0, clnt0 := ts.makeShardCtrlerClnt() sck0, clnt0 := ts.makeShardCtrlerClnt()
sck0.InitController() sck0.InitController()
cfg, _ = sck0.Query() cfg = sck0.Query()
s := "join" s := "join"
if state == LEAVE { if state == LEAVE {
s = "leave" s = "leave"