* * @brief: 附带着目前持有的token,检测这个token是否还有效 * @notes: 问题的关键在于检查返回无效,其实在发出数据的一刻是有效的,但是不影响正确性 */
(pathname string, filename string, token uint64)
| 279 | * @notes: 问题的关键在于检查返回无效,其实在发出数据的一刻是有效的,但是不影响正确性 |
| 280 | */ |
| 281 | func (ck *Clerk) CheckToken(pathname string, filename string, token uint64) bool { |
| 282 | cnt := len(ck.servers) |
| 283 | |
| 284 | for { |
| 285 | args := &CheckTokenArgs{PathName: pathname, ClientID: ck.ClientID, SeqNo: ck.seq, |
| 286 | FileName: filename, Token: token} |
| 287 | |
| 288 | reply := new(CheckTokenReply) |
| 289 | |
| 290 | ck.leader %= cnt |
| 291 | |
| 292 | if atomic.LoadInt32(&((*ck.serversIsOk)[ck.leader])) == 0 { |
| 293 | ck.leader++ |
| 294 | continue |
| 295 | } |
| 296 | |
| 297 | replyArrival := make(chan bool, 1) |
| 298 | go func() { |
| 299 | err := ck.servers[ck.leader].Call("RaftKV.CheckToken", args, reply) |
| 300 | flag := true |
| 301 | if err != nil { |
| 302 | log.Printf("ERROR : CheckToken call error, Find the cause as soon as possible -> (%s).\n", err.Error()) |
| 303 | flag = false |
| 304 | } |
| 305 | replyArrival <- flag |
| 306 | }() |
| 307 | select { |
| 308 | case <-time.After(200 * time.Millisecond): |
| 309 | ck.leader++ |
| 310 | continue |
| 311 | case ok := <-replyArrival: |
| 312 | if ok && (reply.Err == OK) { |
| 313 | ck.seq++ |
| 314 | return true |
| 315 | } else if reply.Err == CheckTokenError || reply.Err == Duplicate{ |
| 316 | log.Printf("INFO : CheckToken (%s/%s) error -> [%s]\n", pathname, filename, reply.Err) |
| 317 | ck.seq++ |
| 318 | return false |
| 319 | } |
| 320 | ck.leader++ |
| 321 | } |
| 322 | } |
| 323 | } |
no test coverage detected