@@ -10,15 +10,11 @@ import "math/big"
10
10
type Clerk struct {
11
11
servers []* labrpc.ClientEnd
12
12
// 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调用编号
19
16
}
20
17
21
- //随机函数
22
18
func nrand () int64 {
23
19
max := big .NewInt (int64 (1 ) << 62 )
24
20
bigx , _ := rand .Int (rand .Reader , max )
@@ -30,11 +26,10 @@ func MakeClerk(servers []*labrpc.ClientEnd) *Clerk {
30
26
ck := new (Clerk )
31
27
ck .servers = servers
32
28
// You'll have to add code here.
33
- ck .leader = 0
34
- //给自己整一个编号
29
+ ck .leader = 0 //默认一开始找第一个通信
35
30
ck .me = nrand ()
36
31
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 )
38
33
return ck
39
34
}
40
35
@@ -51,25 +46,29 @@ func MakeClerk(servers []*labrpc.ClientEnd) *Clerk {
51
46
func (ck * Clerk ) Get (key string ) string {
52
47
// You will have to modify this function.
53
48
ck .cmdIndex ++
54
- args := GetArgs {Key : key , ClerkID : ck .me , CmdIndex : ck .cmdIndex }
49
+ args := GetArgs {key , ck .me , ck .cmdIndex }
55
50
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 )
57
52
58
53
for {
59
54
reply := GetReply {}
60
55
ok := ck .servers [leader ].Call ("KVServer.Get" , & args , & reply )
61
56
if ok && ! reply .WrongLeader {
62
57
ck .leader = leader
63
- //不存在就返回 ""
58
+ //收到回复信息
64
59
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)
65
62
return ""
66
63
}
67
64
raft .InfoKV .Printf ("Client:%20v cmdIndex:%4d| Successful! Get:[%v] from server:%3d value:[%v]\n " , ck .me , ck .cmdIndex , key , leader , reply .Value )
68
65
return reply .Value
69
66
}
70
- //寻找下一个leader
67
+ //对面不是leader Or 没收到回复
71
68
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)
72
70
}
71
+
73
72
}
74
73
75
74
//
@@ -85,26 +84,22 @@ func (ck *Clerk) Get(key string) string {
85
84
func (ck * Clerk ) PutAppend (key string , value string , op string ) {
86
85
// You will have to modify this function.
87
86
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 }
95
88
leader := ck .leader
96
89
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
+
97
91
for {
98
92
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 {
101
94
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 )
102
95
ck .leader = leader
103
96
return
104
97
}
105
98
//如果不是 尝试下一个 是不是leader
106
99
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)
107
101
}
102
+
108
103
}
109
104
110
105
func (ck * Clerk ) Put (key string , value string ) {
0 commit comments