77 lines
1.6 KiB
Go
77 lines
1.6 KiB
Go
package shardctrler
|
|
|
|
|
|
import "6.5840/raft"
|
|
import "6.5840/labrpc"
|
|
import "sync"
|
|
import "6.5840/labgob"
|
|
|
|
|
|
type ShardCtrler struct {
|
|
mu sync.Mutex
|
|
me int
|
|
rf *raft.Raft
|
|
applyCh chan raft.ApplyMsg
|
|
|
|
// Your data here.
|
|
|
|
configs []Config // indexed by config num
|
|
}
|
|
|
|
|
|
type Op struct {
|
|
// Your data here.
|
|
}
|
|
|
|
|
|
func (sc *ShardCtrler) Join(args *JoinArgs, reply *JoinReply) {
|
|
// Your code here.
|
|
}
|
|
|
|
func (sc *ShardCtrler) Leave(args *LeaveArgs, reply *LeaveReply) {
|
|
// Your code here.
|
|
}
|
|
|
|
func (sc *ShardCtrler) Move(args *MoveArgs, reply *MoveReply) {
|
|
// Your code here.
|
|
}
|
|
|
|
func (sc *ShardCtrler) Query(args *QueryArgs, reply *QueryReply) {
|
|
// Your code here.
|
|
}
|
|
|
|
|
|
// the tester calls Kill() when a ShardCtrler 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 (sc *ShardCtrler) Kill() {
|
|
sc.rf.Kill()
|
|
// Your code here, if desired.
|
|
}
|
|
|
|
// needed by shardkv tester
|
|
func (sc *ShardCtrler) Raft() *raft.Raft {
|
|
return sc.rf
|
|
}
|
|
|
|
// servers[] contains the ports of the set of
|
|
// servers that will cooperate via Raft to
|
|
// form the fault-tolerant shardctrler service.
|
|
// me is the index of the current server in servers[].
|
|
func StartServer(servers []*labrpc.ClientEnd, me int, persister *raft.Persister) *ShardCtrler {
|
|
sc := new(ShardCtrler)
|
|
sc.me = me
|
|
|
|
sc.configs = make([]Config, 1)
|
|
sc.configs[0].Groups = map[int][]string{}
|
|
|
|
labgob.Register(Op{})
|
|
sc.applyCh = make(chan raft.ApplyMsg)
|
|
sc.rf = raft.Make(servers, me, persister, sc.applyCh)
|
|
|
|
// Your code here.
|
|
|
|
return sc
|
|
}
|