Skip to content

Commit 4aeb0b9

Browse files
committed
3B
1 parent 935727e commit 4aeb0b9

File tree

5 files changed

+147
-104
lines changed

5 files changed

+147
-104
lines changed

src/kvraft/client.go

+18-23
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,11 @@ import "math/big"
1010
type Clerk struct {
1111
servers []*labrpc.ClientEnd
1212
// You will have to modify this struct.
13-
//最新的leader
14-
leader int
15-
//我自己的编号
16-
me int64
17-
//发送的第几条消息
18-
cmdIndex int64
13+
leader int //记录最新的leader,方便下次通信
14+
me int64 //每个clerk独一无二的编号,调用nrand生成,5台机器中有两台机器相同的概率几乎可以忽略不计
15+
cmdIndex int //clerk给每个RPC调用编号
1916
}
2017

21-
//随机函数
2218
func nrand() int64 {
2319
max := big.NewInt(int64(1) << 62)
2420
bigx, _ := rand.Int(rand.Reader, max)
@@ -30,11 +26,10 @@ func MakeClerk(servers []*labrpc.ClientEnd) *Clerk {
3026
ck := new(Clerk)
3127
ck.servers = servers
3228
// You'll have to add code here.
33-
ck.leader = 0
34-
//给自己整一个编号
29+
ck.leader = 0 //默认一开始找第一个通信
3530
ck.me = nrand()
3631
ck.cmdIndex = 0
37-
raft.InfoKV.Printf("Client: %20v | 创造了以合new Clerk ! \n", ck.me)
32+
raft.InfoKV.Printf("Client:%20v | Create new clerk!\n", ck.me)
3833
return ck
3934
}
4035

@@ -51,25 +46,29 @@ func MakeClerk(servers []*labrpc.ClientEnd) *Clerk {
5146
func (ck *Clerk) Get(key string) string {
5247
// You will have to modify this function.
5348
ck.cmdIndex++
54-
args := GetArgs{Key: key, ClerkID: ck.me, CmdIndex: ck.cmdIndex}
49+
args := GetArgs{key, ck.me, ck.cmdIndex}
5550
leader := ck.leader
56-
raft.InfoKV.Printf("Client:%20v cmdIndex:%4d | Begin ! Get:[%v] from server: %3d\n", ck.me, ck.cmdIndex, key, leader)
51+
raft.InfoKV.Printf("Client:%20v cmdIndex:%4d| Begin! Get:[%v] from server:%3d\n", ck.me, ck.cmdIndex, key, leader)
5752

5853
for {
5954
reply := GetReply{}
6055
ok := ck.servers[leader].Call("KVServer.Get", &args, &reply)
6156
if ok && !reply.WrongLeader {
6257
ck.leader = leader
63-
//不存在就返回 ""
58+
//收到回复信息
6459
if reply.Value == ErrNoKey {
60+
//kv DB暂时没有这个key
61+
//raft.InfoKV.Printf("Client:20v cmdIndex:%4d | Get Failed! No such key\n", ck.me, ck.cmdIndex)
6562
return ""
6663
}
6764
raft.InfoKV.Printf("Client:%20v cmdIndex:%4d| Successful! Get:[%v] from server:%3d value:[%v]\n", ck.me, ck.cmdIndex, key, leader, reply.Value)
6865
return reply.Value
6966
}
70-
//寻找下一个leader
67+
//对面不是leader Or 没收到回复
7168
leader = (leader + 1) % len(ck.servers)
69+
//raft.InfoKV.Printf("Client:%20v cmdIndex:%4d| Failed! Change server to %3d\n", ck.me, ck.cmdIndex, leader)
7270
}
71+
7372
}
7473

7574
//
@@ -85,26 +84,22 @@ func (ck *Clerk) Get(key string) string {
8584
func (ck *Clerk) PutAppend(key string, value string, op string) {
8685
// You will have to modify this function.
8786
ck.cmdIndex++
88-
args := PutAppendArgs{
89-
Key: key,
90-
Value: value,
91-
Op: op,
92-
ClerkID: ck.me,
93-
CmdIndex: ck.cmdIndex,
94-
}
87+
args := PutAppendArgs{key, value, op, ck.me, ck.cmdIndex}
9588
leader := ck.leader
9689
raft.InfoKV.Printf("Client:%20v cmdIndex:%4d| Begin! %6s key:[%s] value:[%s] to server:%3d\n", ck.me, ck.cmdIndex, op, key, value, leader)
90+
9791
for {
9892
reply := PutAppendReply{}
99-
ok := ck.servers[leader].Call("KVServer.PutAppend", &args, &reply)
100-
if ok && reply.WrongLeader == false && reply.Err == OK {
93+
if ok := ck.servers[leader].Call("KVServer.PutAppend", &args, &reply); ok && !reply.WrongLeader && reply.Err == OK {
10194
raft.InfoKV.Printf("Client:%20v cmdIndex:%4d| Successful! %6s key:[%s] value:[%s] to server:%3d\n", ck.me, ck.cmdIndex, op, key, value, leader)
10295
ck.leader = leader
10396
return
10497
}
10598
//如果不是 尝试下一个 是不是leader
10699
leader = (leader + 1) % len(ck.servers)
100+
//raft.InfoKV.Printf("Client:%20v cmdIndex:%4d| Failed! Change server to %3d\n", ck.me, ck.cmdIndex, leader)
107101
}
102+
108103
}
109104

110105
func (ck *Clerk) Put(key string, value string) {

src/kvraft/common.go

+7-13
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package kvraft
22

33
const (
4-
OK = "OK"
5-
ErrNoKey = "ErrNoKey"
6-
ErrWrongLeader = "ErrWrongLeader"
4+
OK = "OK"
5+
ErrNoKey = "ErrNoKey"
76
)
87

98
type Err string
@@ -16,13 +15,10 @@ type PutAppendArgs struct {
1615
// You'll have to add definitions here.
1716
// Field names must start with capital letters,
1817
// otherwise RPC will break.
19-
//客户端编号
20-
ClerkID int64
21-
//这个clerk发送的第几条信息
22-
CmdIndex int64
18+
ClerkID int64 //发送消息的clerk编号
19+
CmdIndex int //这个clerk发送的第几条信息
2320
}
2421

25-
//很可能请求的时候 leader 挂了,就打在了 follower 上
2622
type PutAppendReply struct {
2723
WrongLeader bool
2824
Err Err
@@ -31,14 +27,12 @@ type PutAppendReply struct {
3127
type GetArgs struct {
3228
Key string
3329
// You'll have to add definitions here.
34-
//客户端编号
35-
ClerkID int64
36-
//这个clerk发送的第几条信息
37-
CmdIndex int64
30+
ClerkID int64
31+
CmdIndex int
3832
}
3933

4034
type GetReply struct {
35+
WrongLeader bool //true -> 对面不是leader
4136
Err Err
4237
Value string
43-
WrongLeader bool
4438
}

src/kvraft/config.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package kvraft
22

33
import (
4-
labrpc "raft/src/labrpc"
5-
raft2 "raft/src/raft"
4+
"raft/src/labrpc"
5+
"raft/src/raft"
6+
"testing"
67
)
7-
import "testing"
88
import "os"
99

1010
// import "log"
@@ -49,7 +49,7 @@ type config struct {
4949
net *labrpc.Network
5050
n int
5151
kvservers []*KVServer
52-
saved []*raft2.Persister
52+
saved []*raft.Persister
5353
endnames [][]string // names of each server's sending ClientEnds
5454
clerks map[*Clerk][]string
5555
nextClientId int
@@ -310,7 +310,7 @@ func (cfg *config) StartServer(i int) {
310310
if cfg.saved[i] != nil {
311311
cfg.saved[i] = cfg.saved[i].Copy()
312312
} else {
313-
cfg.saved[i] = raft2.MakePersister()
313+
cfg.saved[i] = raft.MakePersister()
314314
}
315315
cfg.mu.Unlock()
316316

@@ -372,7 +372,7 @@ func make_config(t *testing.T, n int, unreliable bool, maxraftstate int) *config
372372
cfg.net = labrpc.MakeNetwork()
373373
cfg.n = n
374374
cfg.kvservers = make([]*KVServer, cfg.n)
375-
cfg.saved = make([]*raft2.Persister, cfg.n)
375+
cfg.saved = make([]*raft.Persister, cfg.n)
376376
cfg.endnames = make([][]string, cfg.n)
377377
cfg.clerks = make(map[*Clerk][]string)
378378
cfg.nextClientId = cfg.n + 1000 // client ids start 1000 above the highest serverid

0 commit comments

Comments
 (0)