MCPcopy Create free account
hub / github.com/Super-long/ChubbyGo / CheckToken

Method CheckToken

BaseServer/lockclient.go:281–323  ·  view source on GitHub ↗

* * @brief: 附带着目前持有的token,检测这个token是否还有效 * @notes: 问题的关键在于检查返回无效,其实在发出数据的一刻是有效的,但是不影响正确性 */

(pathname string, filename string, token uint64)

Source from the content-addressed store, hash-verified

279 * @notes: 问题的关键在于检查返回无效,其实在发出数据的一刻是有效的,但是不影响正确性
280 */
281func (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}

Callers 2

mainFunction · 0.45
acceptFromRaftDaemonMethod · 0.45

Calls 1

ErrorMethod · 0.45

Tested by

no test coverage detected