98 lines
2.7 KiB
Go
98 lines
2.7 KiB
Go
package shardkv
|
|
|
|
|
|
import "6.5840/labrpc"
|
|
import "6.5840/raft"
|
|
import "sync"
|
|
import "6.5840/labgob"
|
|
|
|
|
|
|
|
type Op struct {
|
|
// Your definitions here.
|
|
// Field names must start with capital letters,
|
|
// otherwise RPC will break.
|
|
}
|
|
|
|
type ShardKV struct {
|
|
mu sync.Mutex
|
|
me int
|
|
rf *raft.Raft
|
|
applyCh chan raft.ApplyMsg
|
|
make_end func(string) *labrpc.ClientEnd
|
|
gid int
|
|
ctrlers []*labrpc.ClientEnd
|
|
maxraftstate int // snapshot if log grows this big
|
|
|
|
// Your definitions here.
|
|
}
|
|
|
|
|
|
func (kv *ShardKV) Get(args *GetArgs, reply *GetReply) {
|
|
// Your code here.
|
|
}
|
|
|
|
func (kv *ShardKV) PutAppend(args *PutAppendArgs, reply *PutAppendReply) {
|
|
// Your code here.
|
|
}
|
|
|
|
// the tester calls Kill() when a ShardKV instance won't
|
|
// be needed again. you are not required to do anything
|
|
// in Kill(), but it might be convenient to (for example)
|
|
// turn off debug output from this instance.
|
|
func (kv *ShardKV) Kill() {
|
|
kv.rf.Kill()
|
|
// Your code here, if desired.
|
|
}
|
|
|
|
|
|
// servers[] contains the ports of the servers in this group.
|
|
//
|
|
// me is the index of the current server in servers[].
|
|
//
|
|
// the k/v server should store snapshots through the underlying Raft
|
|
// implementation, which should call persister.SaveStateAndSnapshot() to
|
|
// atomically save the Raft state along with the snapshot.
|
|
//
|
|
// the k/v server should snapshot when Raft's saved state exceeds
|
|
// maxraftstate bytes, in order to allow Raft to garbage-collect its
|
|
// log. if maxraftstate is -1, you don't need to snapshot.
|
|
//
|
|
// gid is this group's GID, for interacting with the shardctrler.
|
|
//
|
|
// pass ctrlers[] to shardctrler.MakeClerk() so you can send
|
|
// RPCs to the shardctrler.
|
|
//
|
|
// make_end(servername) turns a server name from a
|
|
// Config.Groups[gid][i] into a labrpc.ClientEnd on which you can
|
|
// send RPCs. You'll need this to send RPCs to other groups.
|
|
//
|
|
// look at client.go for examples of how to use ctrlers[]
|
|
// and make_end() to send RPCs to the group owning a specific shard.
|
|
//
|
|
// StartServer() must return quickly, so it should start goroutines
|
|
// for any long-running work.
|
|
func StartServer(servers []*labrpc.ClientEnd, me int, persister *raft.Persister, maxraftstate int, gid int, ctrlers []*labrpc.ClientEnd, make_end func(string) *labrpc.ClientEnd) *ShardKV {
|
|
// call labgob.Register on structures you want
|
|
// Go's RPC library to marshall/unmarshall.
|
|
labgob.Register(Op{})
|
|
|
|
kv := new(ShardKV)
|
|
kv.me = me
|
|
kv.maxraftstate = maxraftstate
|
|
kv.make_end = make_end
|
|
kv.gid = gid
|
|
kv.ctrlers = ctrlers
|
|
|
|
// Your initialization code here.
|
|
|
|
// Use something like this to talk to the shardctrler:
|
|
// kv.mck = shardctrler.MakeClerk(kv.ctrlers)
|
|
|
|
kv.applyCh = make(chan raft.ApplyMsg)
|
|
kv.rf = raft.Make(servers, me, persister, kv.applyCh)
|
|
|
|
|
|
return kv
|
|
}
|