update
This commit is contained in:
parent
788497f1a1
commit
6a79304587
81
src/kvraft1/server.go
Normal file
81
src/kvraft1/server.go
Normal file
@ -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()}
|
||||||
|
}
|
@ -9,6 +9,7 @@ import (
|
|||||||
"6.5840/labgob"
|
"6.5840/labgob"
|
||||||
"6.5840/labrpc"
|
"6.5840/labrpc"
|
||||||
"6.5840/shardkv1/shardgrp/shardrpc"
|
"6.5840/shardkv1/shardgrp/shardrpc"
|
||||||
|
"6.5840/tester1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user