diff --git a/src/kvraft1/server.go b/src/kvraft1/server.go new file mode 100644 index 0000000..75197e7 --- /dev/null +++ b/src/kvraft1/server.go @@ -0,0 +1,81 @@ +package kvraft + +import ( + "sync/atomic" + + "6.5840/kvraft1/rsm" + "6.5840/kvsrv1/rpc" + "6.5840/labgob" + "6.5840/labrpc" + "6.5840/tester1" + +) + +type KVServer struct { + me int + dead int32 // set by Kill() + rsm *rsm.RSM + + // Your definitions here. +} + +func (kv *KVServer) DoOp(req any) any { + // Your code here + return nil +} + +func (kv *KVServer) Snapshot() []byte { + // Your code here + return nil +} + +func (kv *KVServer) Restore(data []byte) { + // Your code here +} + +func (kv *KVServer) Get(args *rpc.GetArgs, reply *rpc.GetReply) { + // Your code here. Use kv.rsm.Submit() to submit args + // You can use go's type casts to turn the any return value + // of Submit() into a GetReply: rep.(rpc.GetReply) +} + +func (kv *KVServer) Put(args *rpc.PutArgs, reply *rpc.PutReply) { + // Your code here. Use kv.rsm.Submit() to submit args + // You can use go's type casts to turn the any return value + // of Submit() into a PutReply: rep.(rpc.PutReply) +} + +// the tester calls Kill() when a KVServer instance won't +// be needed again. for your convenience, we supply +// code to set rf.dead (without needing a lock), +// and a killed() method to test rf.dead in +// long-running loops. you can also add your own +// code to Kill(). you're not required to do anything +// about this, but it may be convenient (for example) +// to suppress debug output from a Kill()ed instance. +func (kv *KVServer) Kill() { + atomic.StoreInt32(&kv.dead, 1) + // Your code here, if desired. +} + +func (kv *KVServer) killed() bool { + z := atomic.LoadInt32(&kv.dead) + return z == 1 +} + +// StartKVServer() and MakeRSM() must return quickly, so they should +// start goroutines for any long-running work. +func StartKVServer(servers []*labrpc.ClientEnd, gid tester.Tgid, me int, persister *tester.Persister, maxraftstate int) []tester.IService { + // call labgob.Register on structures you want + // Go's RPC library to marshall/unmarshall. + labgob.Register(rsm.Op{}) + labgob.Register(rpc.PutArgs{}) + labgob.Register(rpc.GetArgs{}) + + kv := &KVServer{me: me} + + + kv.rsm = rsm.MakeRSM(servers, me, persister, maxraftstate, kv) + // You may need initialization code here. + return []tester.IService{kv, kv.rsm.Raft()} +} diff --git a/src/shardkv1/shardgrp/server.go b/src/shardkv1/shardgrp/server.go index 20a8e5b..ead33c5 100644 --- a/src/shardkv1/shardgrp/server.go +++ b/src/shardkv1/shardgrp/server.go @@ -9,6 +9,7 @@ import ( "6.5840/labgob" "6.5840/labrpc" "6.5840/shardkv1/shardgrp/shardrpc" + "6.5840/tester1" )