github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/p2pserver/discover/tale_circle.go (about) 1 package discover 2 3 import ( 4 "math/rand" 5 "sync" 6 "time" 7 8 comm "github.com/sixexorg/magnetic-ring/common" 9 "github.com/sixexorg/magnetic-ring/log" 10 ) 11 12 const ( 13 CONNECT_NUM = 3 14 REFRESH_NUM = 10 15 CircuConnectNum = 3 16 StellarDisChanLen = 1000 17 ) 18 19 type OrgNodeInfo struct { 20 node *Node 21 errnum int 22 peerid uint64 23 } 24 25 // peerid -> OrgNodeInfo 26 type NodeMap map[uint64]bool 27 type PeerOrg map[comm.Address]bool 28 29 type OrgInfo struct { 30 sync.Mutex 31 orgSingleData map[comm.Address]NodeMap // orgid -> NodeMap 32 peerIDToOrgIDMap map[uint64]PeerOrg 33 peerIDToNode map[uint64]*OrgNodeInfo 34 } 35 36 // connect 37 type ConnPeer map[uint64]bool 38 type ConnectInfo struct { 39 sync.Mutex 40 peerToPeerMap map[uint64]ConnPeer // 41 peerIDToNode map[uint64]*OrgNodeInfo 42 } 43 44 func (tab *Table) SendBootNodeOrg(nodes []*Node, orgid comm.Address, ownid uint64, badd bool) ([]*Node, []error) { 45 errNode, errs := tab.sendbootnodeorg(nodes, orgid, ownid, badd) 46 i := 1 47 for len(errNode) > 0 { 48 i = i + 1 49 time.Sleep(time.Second) 50 errNode, errs = tab.sendbootnodeorg(errNode, orgid, ownid, badd) 51 if i >= 3 { 52 break 53 } 54 } 55 return errNode, errs 56 } 57 58 func (tab *Table) sendbootnodeorg(nodes []*Node, orgid comm.Address, ownid uint64, badd bool) ([]*Node, []error) { 59 errNode := make([]*Node, 0) 60 errs := make([]error, 0) 61 for _, n := range nodes { 62 err := tab.net.sendcircle(n, tab.Self(), orgid, ownid, badd) 63 log.Info("=====>>>>>Table sendbootnodeorg", "node:", n, "orgid", orgid.ToString(), "badd", badd, "err", err) 64 if err != nil { 65 errNode = append(errNode, n) 66 errs = append(errs, err) 67 } 68 } 69 return errNode, errs 70 } 71 72 func (tab *Table) SendBootNodeConnect(nodes []*Node, ownid, remoteid uint64, bconnect, bstellar bool) ([]*Node, []error) { 73 //fmt.Println(" **** Table SendBootNodeConnect bconnect:",bconnect) 74 errNode, errs := tab.sendbootnodeconnect(nodes, ownid, remoteid, bconnect, bstellar) 75 i := 1 76 for len(errNode) > 0 { 77 i = i + 1 78 time.Sleep(time.Second) 79 errNode, errs = tab.sendbootnodeconnect(nodes, ownid, remoteid, bconnect, bstellar) 80 if i >= 3 { 81 break 82 } 83 } 84 return errNode, errs 85 } 86 87 func (tab *Table) sendbootnodeconnect(nodes []*Node, ownid, remoteid uint64, bconnect, bstellar bool) ([]*Node, []error) { 88 errNode := make([]*Node, 0) 89 errs := make([]error, 0) 90 for _, n := range nodes { 91 err := tab.net.sendConnectInfo(n, tab.Self(), ownid, remoteid, bconnect, bstellar) 92 if err != nil { 93 errNode = append(errNode, n) 94 errs = append(errs, err) 95 } 96 } 97 return errNode, errs 98 } 99 100 func (tab *Table) GetOrgNodesFromBN(bns []*Node, targetID comm.Address) map[NodeID]*Node { 101 results := make(map[NodeID]*Node) 102 for _, n := range bns { 103 nodes, err := tab.getOrgNodesFromBN(n, targetID) 104 if err != nil { 105 continue 106 } 107 for _, node := range nodes { 108 results[node.ID] = node 109 } 110 } 111 return results 112 } 113 114 func (tab *Table) getOrgNodesFromBN(n *Node, targetID comm.Address) ([]*Node, error) { 115 //fmt.Println(" ****** Table readCircleNodes... ") 116 r, err := tab.net.findcircle(n.ID, n.addr(), targetID) 117 if err != nil { 118 //fmt.Println(" ****** err:",err) 119 return nil, err 120 } 121 return r, nil 122 } 123 124 func (tab *Table) delConnectPeer(ownid uint64) { 125 tab.connectData.Lock() 126 defer tab.connectData.Unlock() 127 128 // del peerToPeerMap 129 delete(tab.connectData.peerToPeerMap, ownid) 130 // del peerIDToNode 131 delete(tab.connectData.peerIDToNode, ownid) 132 133 if len(tab.connectData.peerToPeerMap) <= 0 { 134 tab.connectData.peerToPeerMap = make(map[uint64]ConnPeer) 135 tab.connectData.peerIDToNode = make(map[uint64]*OrgNodeInfo) 136 } 137 //fmt.Println(" ************ Table delConnectPeer peerIDToNode:",tab.connectData.peerIDToNode) 138 } 139 140 // updata connect info for batch 141 func (tab *Table) updateConnectForBatch(batchInfo *rtnTabPeerConnect) { 142 // remoteid connects is null,so delete the ownId 143 if len(batchInfo.remotesID) == 0 { 144 tab.delConnectPeer(batchInfo.ownId) 145 return 146 } 147 // update remoteid connect info 148 connpeer := make(ConnPeer) 149 for _, peerid := range batchInfo.remotesID { 150 connpeer[peerid] = true 151 } 152 153 tab.connectData.Lock() 154 defer tab.connectData.Unlock() 155 // update connectData 156 tab.connectData.peerToPeerMap[batchInfo.ownId] = connpeer 157 tab.connectData.peerIDToNode[batchInfo.ownId] = &OrgNodeInfo{node: batchInfo.node, errnum: 0, peerid: batchInfo.ownId} 158 } 159 160 // set connect info for single 161 func (tab *Table) setConnect(ownid, remoteid uint64, bconnect bool, node *Node) { 162 tab.connectData.Lock() 163 defer tab.connectData.Unlock() 164 165 if bconnect { 166 // add to peerToPeerMap 167 peertopeerdata, peerok := tab.connectData.peerToPeerMap[ownid] 168 if !peerok { 169 peertopeerdata = make(ConnPeer) 170 } 171 peertopeerdata[remoteid] = true 172 tab.connectData.peerToPeerMap[ownid] = peertopeerdata 173 174 // add to peerIDToNode 175 tab.connectData.peerIDToNode[ownid] = &OrgNodeInfo{node: node, errnum: 0, peerid: ownid} 176 177 //fmt.Println(" *888888* Table setConnect add peerToPeerMap:",tab.connectData.peerToPeerMap) 178 //fmt.Println(" *888888* Table setConnect add peerIDToNode:",tab.connectData.peerIDToNode) 179 } else { 180 peertopeerdata, peerok := tab.connectData.peerToPeerMap[ownid] 181 if peerok { 182 delete(peertopeerdata, remoteid) 183 if len(peertopeerdata) <= 0 { 184 // delete peer -> peer 185 delete(tab.connectData.peerToPeerMap, ownid) 186 // delete peer -> node 187 delete(tab.connectData.peerIDToNode, ownid) 188 189 if len(tab.connectData.peerToPeerMap) <= 0 { 190 tab.connectData.peerToPeerMap = make(map[uint64]ConnPeer) 191 tab.connectData.peerIDToNode = make(map[uint64]*OrgNodeInfo) 192 } 193 } else { 194 tab.connectData.peerToPeerMap[ownid] = peertopeerdata 195 } 196 } 197 //fmt.Println(" *888888* Table setConnect del peerToPeerMap:",tab.connectData.peerToPeerMap) 198 //fmt.Println(" *888888* Table setConnect del peerIDToNode:",tab.connectData.peerIDToNode) 199 } 200 } 201 202 func (tab *Table) delCirclePeer(ownid uint64) { 203 tab.orgData.Lock() 204 defer tab.orgData.Unlock() 205 206 // del the peer form peerIDToOrgIDMap 207 peerorgdata, peerorgok := tab.orgData.peerIDToOrgIDMap[ownid] 208 if peerorgok { 209 for circleID, _ := range peerorgdata { 210 circledata, circleok := tab.orgData.orgSingleData[circleID] 211 if circleok { 212 delete(circledata, ownid) 213 if len(circledata) == 0 { 214 delete(tab.orgData.orgSingleData, circleID) 215 if len(tab.orgData.orgSingleData) == 0 { // tab.orgData.orgSingleData 216 tab.orgData.orgSingleData = make(map[comm.Address]NodeMap) 217 } 218 } else { 219 tab.orgData.orgSingleData[circleID] = circledata 220 } 221 } 222 } 223 } 224 // del the peer form peerIDToOrgIDMap and peerIDToNode 225 delete(tab.orgData.peerIDToOrgIDMap, ownid) 226 delete(tab.orgData.peerIDToNode, ownid) 227 if len(tab.orgData.peerIDToOrgIDMap) == 0 { // tab.orgData.peerIDToOrgIDMap is empty 228 tab.orgData.peerIDToOrgIDMap = make(map[uint64]PeerOrg) 229 tab.orgData.peerIDToNode = make(map[uint64]*OrgNodeInfo) 230 } 231 } 232 233 func (tab *Table) updateOrgForBatch(batchOrg *rtnTabPeerOrg) { 234 if len(batchOrg.orgsId) <= 0 { 235 tab.delCirclePeer(batchOrg.ownId) 236 return 237 } 238 239 peerdata := make(PeerOrg) 240 for _, orgid := range batchOrg.orgsId { 241 peerdata[orgid] = true 242 } 243 244 // for add 245 addorgs := make([]comm.Address, 0) 246 // for del 247 delorgs := make([]comm.Address, 0) 248 249 tab.orgData.Lock() 250 defer tab.orgData.Unlock() 251 252 old, ok := tab.orgData.peerIDToOrgIDMap[batchOrg.ownId] 253 if !ok { 254 addorgs = batchOrg.orgsId 255 } else { 256 for _, orgid := range batchOrg.orgsId { 257 if _, exit := old[orgid]; !exit { 258 addorgs = append(addorgs, orgid) 259 } 260 } 261 262 for orgid, _ := range old { 263 if _, exit := peerdata[orgid]; !exit { 264 delorgs = append(delorgs, orgid) 265 } 266 } 267 } 268 269 // add 270 for _, orgid := range addorgs { 271 circledata, circleok := tab.orgData.orgSingleData[orgid] 272 if !circleok { 273 circledata = make(NodeMap) 274 } 275 circledata[batchOrg.ownId] = true 276 tab.orgData.orgSingleData[orgid] = circledata 277 } 278 279 // del 280 for _, orgid := range delorgs { 281 circledata, circleok := tab.orgData.orgSingleData[orgid] 282 if circleok { 283 delete(circledata, batchOrg.ownId) 284 if len(circledata) == 0 { 285 delete(tab.orgData.orgSingleData, orgid) 286 if len(tab.orgData.orgSingleData) == 0 { // tab.orgData.orgSingleData 287 tab.orgData.orgSingleData = make(map[comm.Address]NodeMap) 288 } 289 } else { 290 tab.orgData.orgSingleData[orgid] = circledata 291 } 292 } 293 } 294 295 // 296 tab.orgData.peerIDToOrgIDMap[batchOrg.ownId] = peerdata 297 tab.orgData.peerIDToNode[batchOrg.ownId] = &OrgNodeInfo{ 298 node: batchOrg.node, 299 errnum: 0, 300 peerid: batchOrg.ownId, 301 } 302 303 } 304 305 306 func (tab *Table) setOrgs(node *Node, circleID comm.Address, ownid uint64, badd bool) { 307 tab.orgData.Lock() 308 defer tab.orgData.Unlock() 309 310 if badd { 311 // add orgSingleData 312 circledata, circleok := tab.orgData.orgSingleData[circleID] 313 if !circleok { 314 circledata = make(NodeMap) 315 } 316 circledata[ownid] = true 317 tab.orgData.orgSingleData[circleID] = circledata 318 319 // add peerIDToOrgIDMap and peerIDToNode 320 peerdata, peerok := tab.orgData.peerIDToOrgIDMap[ownid] 321 if !peerok { 322 peerdata = make(PeerOrg) 323 } 324 peerdata[circleID] = true 325 tab.orgData.peerIDToOrgIDMap[ownid] = peerdata 326 327 tab.orgData.peerIDToNode[ownid] = &OrgNodeInfo{ 328 node: node, 329 errnum: 0, 330 peerid: ownid, 331 } 332 333 //fmt.Println(" *888888* Table setCircle add orgSingleData:",tab.orgData.orgSingleData) 334 //fmt.Println(" *888888* Table setCircle add peerIDToOrgIDMap:",tab.orgData.peerIDToOrgIDMap) 335 //fmt.Println(" *888888* Table setCircle add peerIDToNode:",tab.orgData.peerIDToNode) 336 } else { 337 // del orgSingleData 338 circledata, circleok := tab.orgData.orgSingleData[circleID] 339 if circleok { 340 delete(circledata, ownid) // 341 if len(circledata) == 0 { 342 delete(tab.orgData.orgSingleData, circleID) 343 if len(tab.orgData.orgSingleData) == 0 { // tab.orgData.orgSingleData为空 344 tab.orgData.orgSingleData = make(map[comm.Address]NodeMap) 345 } 346 } else { 347 tab.orgData.orgSingleData[circleID] = circledata 348 } 349 } 350 351 // del peerIDToOrgIDMap and peerIDToNode 352 peerdata, peerok := tab.orgData.peerIDToOrgIDMap[ownid] 353 if peerok { 354 delete(peerdata, circleID) 355 if len(peerdata) == 0 { 356 delete(tab.orgData.peerIDToOrgIDMap, ownid) 357 delete(tab.orgData.peerIDToNode, ownid) 358 if len(tab.orgData.peerIDToOrgIDMap) == 0 { // tab.orgData.peerIDToOrgIDMap为空 359 tab.orgData.peerIDToOrgIDMap = make(map[uint64]PeerOrg) 360 tab.orgData.peerIDToNode = make(map[uint64]*OrgNodeInfo) 361 } 362 } else { 363 tab.orgData.peerIDToOrgIDMap[ownid] = peerdata 364 } 365 } 366 //fmt.Println(" *888888* Table setCircle del orgSingleData:",tab.orgData.orgSingleData) 367 //fmt.Println(" *888888* Table setCircle del peerIDToOrgIDMap:",tab.orgData.peerIDToOrgIDMap) 368 //fmt.Println(" *888888* Table setCircle del peerIDToNode:",tab.orgData.peerIDToNode) 369 } 370 } 371 372 func (tab *Table) getCircle(circleID comm.Address, num int) ([]*Node, error) { 373 tab.orgData.Lock() 374 defer tab.orgData.Unlock() 375 if tab.orgData.orgSingleData == nil { 376 return nil, nil 377 } 378 379 if tab.orgData.peerIDToNode == nil { 380 return nil, nil 381 } 382 383 circledata, circleok := tab.orgData.orgSingleData[circleID] 384 if !circleok { 385 return nil, nil 386 } 387 388 result := make([]*Node, 0) 389 390 i := 0 391 for peerid, _ := range circledata { 392 if i >= num { 393 break 394 } 395 if orginfo, ok := tab.orgData.peerIDToNode[peerid]; ok { 396 result = append(result, orginfo.node) 397 i = i + 1 398 } 399 } 400 401 return result, nil 402 } 403 404 // refresh Org 405 type rtnTabPeerOrg struct { 406 node *Node 407 ownId uint64 408 orgsId []comm.Address 409 } 410 411 func (tab *Table) refreshOrg() { 412 timer := time.NewTicker(autoRefreshOrgInterval) 413 defer timer.Stop() 414 loop: 415 for { 416 select { 417 case <-timer.C: 418 tab.orgData.Lock() 419 nodeInfos := make([]*OrgNodeInfo, 0) 420 for pid, nodeinfo := range tab.orgData.peerIDToNode { 421 nodeInfos = append(nodeInfos, &OrgNodeInfo{ 422 node: nodeinfo.node, 423 errnum: 0, 424 peerid: pid, 425 }) 426 } 427 tab.orgData.Unlock() 428 429 errinfo, resultall := tab.handleReqPeerOrg(nodeInfos) 430 tab.calcNewOrgInfo(errinfo, resultall) 431 case <-tab.closed: 432 break loop 433 } 434 } 435 } 436 437 func (tab *Table) calcNewOrgInfo(errinfo []*OrgNodeInfo, orgNodeInfos []*rtnTabPeerOrg) { 438 // update orgsdata 439 for _, info := range orgNodeInfos { 440 tab.updateOrgForBatch(info) 441 } 442 443 delpeer := make([]uint64, 0) 444 445 // Count the number of refresh times greater than or equal to 10 times 446 tab.orgData.Lock() 447 for _, info := range errinfo { 448 nodeInfo, ok := tab.orgData.peerIDToNode[info.peerid] 449 if ok { 450 if nodeInfo.errnum >= REFRESH_NUM-1 { 451 delpeer = append(delpeer, info.peerid) 452 } else { 453 tab.orgData.peerIDToNode[info.peerid].errnum = nodeInfo.errnum + 1 454 } 455 } 456 } 457 tab.orgData.Unlock() 458 459 // delete the 10 times err peer 460 for _, id := range delpeer { 461 tab.delCirclePeer(id) 462 } 463 } 464 465 func (tab *Table) handleReqPeerOrg(nodeInfos []*OrgNodeInfo) ([]*OrgNodeInfo, []*rtnTabPeerOrg) { 466 result := make([]*rtnTabPeerOrg, 0) 467 i := len(nodeInfos) 468 469 timesErr := make([]*OrgNodeInfo, 0) 470 471 for i > 0 { 472 if i >= REQPEERORGNUM { 473 i = REQPEERORGNUM 474 } 475 errnodes, timeerr, resultsData := tab.handleSingleReqPeerOrg(nodeInfos[:i]) 476 nodeInfos = append(nodeInfos[i:], errnodes...) 477 478 if len(timeerr) > 0 { 479 timesErr = append(timesErr, timeerr...) 480 } 481 482 if len(resultsData) > 0 { 483 result = append(result, resultsData...) 484 } 485 i = len(nodeInfos) 486 } 487 488 return timesErr, result 489 } 490 491 func (tab *Table) handleSingleReqPeerOrg(nodeInfos []*OrgNodeInfo) ([]*OrgNodeInfo, []*OrgNodeInfo, []*rtnTabPeerOrg) { 492 reqErrNodes := make([]*OrgNodeInfo, 0) 493 timesErr := make([]*OrgNodeInfo, 0) 494 495 errnodes, resultsData := tab.reqPeerOrgAll(nodeInfos) 496 if len(errnodes) > 0 { 497 for _, temnode := range errnodes { 498 if temnode.errnum < 3 { 499 reqErrNodes = append(reqErrNodes, temnode) 500 } else { 501 timesErr = append(timesErr, temnode) 502 } 503 } 504 } 505 506 return reqErrNodes, timesErr, resultsData 507 } 508 509 func (tab *Table) reqPeerOrgAll(nodes []*OrgNodeInfo) (result []*OrgNodeInfo, rtnPeerOrg []*rtnTabPeerOrg) { 510 rc := make(chan *OrgNodeInfo, len(nodes)) 511 rtnPeerOrgChan := make(chan *rtnTabPeerOrg, len(nodes)) 512 for i := range nodes { 513 go func(n *OrgNodeInfo) { 514 nn, rtn, _ := tab.reqPeerOrgSingle(n) 515 rc <- nn 516 rtnPeerOrgChan <- rtn 517 }(nodes[i]) 518 } 519 for range nodes { 520 if n := <-rc; n != nil { 521 n.errnum = n.errnum + 1 522 result = append(result, n) 523 } 524 if rnt := <-rtnPeerOrgChan; rnt != nil { 525 rtnPeerOrg = append(rtnPeerOrg, rnt) 526 } 527 } 528 return result, rtnPeerOrg 529 } 530 531 func (tab *Table) reqPeerOrgSingle(n *OrgNodeInfo) (*OrgNodeInfo, *rtnTabPeerOrg, error) { 532 result, err := tab.net.reqPeerOrg(n.node.ID, n.node.addr(), n.node) 533 if err != nil { 534 return n, nil, err 535 } 536 return nil, result, nil 537 } 538 539 // refresh Connect 540 type rtnTabPeerConnect struct { 541 node *Node 542 ownId uint64 543 remotesID []uint64 544 } 545 546 func (tab *Table) refreshConnect() { 547 timer := time.NewTicker(autoRefreshOrgInterval) 548 defer timer.Stop() 549 loop: 550 for { 551 select { 552 case <-timer.C: 553 tab.connectData.Lock() 554 nodeInfos := make([]*OrgNodeInfo, 0) 555 //fmt.Println(" ********* peerIDToNode:",tab.connectData.peerIDToNode) 556 for peerid, nodeinfo := range tab.connectData.peerIDToNode { 557 nodeInfos = append(nodeInfos, &OrgNodeInfo{ 558 node: nodeinfo.node, 559 errnum: 0, 560 peerid: peerid, 561 }) 562 } 563 tab.connectData.Unlock() 564 565 errinfo, resultall := tab.handleReqPeerConnect(nodeInfos) 566 tab.calcNewConnectInfo(errinfo, resultall) 567 case <-tab.closed: 568 break loop 569 } 570 } 571 } 572 573 func (tab *Table) calcNewConnectInfo(errinfo []*OrgNodeInfo, connectNodeInfos []*rtnTabPeerConnect) { 574 // updata connect add 575 for _, info := range connectNodeInfos { 576 tab.updateConnectForBatch(info) 577 } 578 579 delpeer := make([]uint64, 0) 580 // Count the number of refresh times greater than or equal to 10 times. 581 tab.connectData.Lock() 582 for _, info := range errinfo { 583 nodeinfo, ok := tab.connectData.peerIDToNode[info.peerid] 584 if ok { 585 if nodeinfo.errnum >= REFRESH_NUM-1 { 586 delpeer = append(delpeer, info.peerid) 587 } else { 588 tab.connectData.peerIDToNode[info.peerid].errnum = nodeinfo.errnum + 1 589 } 590 } 591 } 592 tab.connectData.Unlock() 593 594 // delete the 10 times err peer 595 for _, id := range delpeer { 596 tab.delConnectPeer(id) 597 } 598 } 599 600 func (tab *Table) handleReqPeerConnect(nodeInfos []*OrgNodeInfo) ([]*OrgNodeInfo, []*rtnTabPeerConnect) { 601 result := make([]*rtnTabPeerConnect, 0) 602 i := len(nodeInfos) 603 timesErr := make([]*OrgNodeInfo, 0) 604 for i > 0 { 605 if i >= REQPEERORGNUM { 606 i = REQPEERORGNUM 607 } 608 609 errnodes, timeerr, resultsData := tab.handleSingleReqPeerConnect(nodeInfos[:i]) 610 nodeInfos = append(nodeInfos[i:], errnodes...) 611 if len(timeerr) > 0 { 612 timesErr = append(timesErr, timeerr...) 613 } 614 //fmt.Println(" *888888* len(errnodes):",len(errnodes),",len(timeerr):",len(timeerr),",len(resultsData):",len(resultsData)) 615 if len(resultsData) > 0 { 616 result = append(result, resultsData...) 617 } 618 i = len(nodeInfos) 619 //fmt.Println(" *888888* i:",i) 620 } 621 622 return timesErr, result 623 } 624 625 func (tab *Table) handleSingleReqPeerConnect(nodeInfos []*OrgNodeInfo) ([]*OrgNodeInfo, []*OrgNodeInfo, []*rtnTabPeerConnect) { 626 reqErrNodes := make([]*OrgNodeInfo, 0) 627 timesErr := make([]*OrgNodeInfo, 0) 628 629 errnodes, resultsData := tab.reqPeerConnectAll(nodeInfos) 630 if len(errnodes) > 0 { 631 for _, temnode := range errnodes { 632 if temnode.errnum < 3 { 633 reqErrNodes = append(reqErrNodes, temnode) 634 } else { 635 timesErr = append(timesErr, temnode) 636 } 637 } 638 } 639 640 return reqErrNodes, timesErr, resultsData 641 } 642 643 func (tab *Table) reqPeerConnectAll(nodes []*OrgNodeInfo) (result []*OrgNodeInfo, rtnPeerOrg []*rtnTabPeerConnect) { 644 rc := make(chan *OrgNodeInfo, len(nodes)) 645 rtnPeerOrgChan := make(chan *rtnTabPeerConnect, len(nodes)) 646 // fmt.Println(" ***** Table bondall ...... ") 647 for i := range nodes { 648 go func(n *OrgNodeInfo) { 649 nn, rtn, _ := tab.reqPeerConnectSingle(n) 650 rc <- nn 651 rtnPeerOrgChan <- rtn 652 }(nodes[i]) 653 } 654 for range nodes { 655 if n := <-rc; n != nil { 656 n.errnum = n.errnum + 1 657 result = append(result, n) 658 } 659 if rnt := <-rtnPeerOrgChan; rnt != nil { 660 rtnPeerOrg = append(rtnPeerOrg, rnt) 661 } 662 } 663 return result, rtnPeerOrg 664 } 665 666 func (tab *Table) reqPeerConnectSingle(n *OrgNodeInfo) (*OrgNodeInfo, *rtnTabPeerConnect, error) { 667 result, err := tab.net.reqPeerConnect(n.node.ID, n.node.addr(), n.node) 668 //fmt.Println(" ******** Table reqPeerConnectSingle result:",result,",err:",err) 669 if err != nil { 670 return n, nil, err 671 } 672 return nil, result, nil 673 } 674 675 func (tab *Table) checkCirculation() { 676 timer := time.NewTicker(autoRefreshOrgInterval) 677 defer timer.Stop() 678 loop: 679 for { 680 select { 681 case <-timer.C: 682 tab.orgData.Lock() 683 684 orgs := make([]comm.Address, 0) 685 for orgid, _ := range tab.orgData.orgSingleData { 686 orgs = append(orgs, orgid) 687 } 688 689 tab.orgData.Unlock() 690 691 for _, orgid := range orgs { 692 circu := tab.singleOrgCheck(orgid) 693 if len(circu) > 1 { 694 go tab.handlerCirculation(circu, orgid) 695 } 696 } 697 698 case <-tab.closed: 699 break loop 700 } 701 } 702 } 703 704 func (tab *Table) handlerCirculation(circu [][]uint64, orgid comm.Address) { 705 index := 0 706 for index < len(circu) { 707 reserve := make([][]uint64, 0) 708 reserve = append(reserve, circu[index+1:]...) 709 for _, peerArry := range reserve { 710 tab.produceArry(circu[index], peerArry, orgid) 711 } 712 index = index + 1 713 } 714 } 715 716 func (tab *Table) produceArry(initiative, passive []uint64, orgid comm.Address) { 717 resultInitiative := make([]uint64, 0) 718 if len(initiative) <= CircuConnectNum { 719 resultInitiative = initiative 720 } else { 721 rand.Seed(time.Now().UnixNano()) 722 index := rand.Intn(len(initiative)) 723 resultInitiative = append(resultInitiative, initiative[index:]...) 724 lenresult := len(resultInitiative) 725 726 if lenresult < CircuConnectNum { 727 resultInitiative = append(resultInitiative, initiative[:CircuConnectNum-lenresult]...) 728 } 729 } 730 731 if len(passive) <= CircuConnectNum { 732 for _, indexpeer := range resultInitiative { 733 go tab.handlerSingleCirculation(indexpeer, passive, orgid) 734 } 735 return 736 } 737 738 for _, indexpeer := range resultInitiative { 739 resultPassive := make([]uint64, 0) 740 741 rand.Seed(time.Now().UnixNano()) 742 index := rand.Intn(len(passive)) 743 744 resultPassive = append(resultPassive, passive[index:]...) 745 lenresult := len(resultPassive) 746 if lenresult < CircuConnectNum { 747 resultPassive = append(resultPassive, passive[:CircuConnectNum-lenresult]...) 748 } 749 go tab.handlerSingleCirculation(indexpeer, resultPassive, orgid) 750 } 751 } 752 753 // type OrgInfo struct { 754 // sync.Mutex 755 // orgSingleData map[comm.Address]NodeMap // orgid -> NodeMap 756 // peerIDToOrgIDMap map[uint64]PeerOrg 757 // peerIDToNode map[uint64]*Node 758 // } 759 // func (t *udp) connectCircuOrg(ndoe,connectnode *Node,orgid comm.Address) error { 760 func (tab *Table) handlerSingleCirculation(initiative uint64, passive []uint64, orgid comm.Address) { 761 initiativeNode := tab.getNodeFromOrg(initiative) 762 if initiativeNode == nil { 763 return 764 } 765 766 for _, peerid := range passive { 767 passiveNode := tab.getNodeFromOrg(peerid) 768 if passiveNode == nil { 769 continue 770 } 771 tab.net.connectCircuOrg(initiativeNode, passiveNode, orgid) 772 } 773 } 774 775 func (tab *Table) getNodeFromOrg(id uint64) *Node { 776 tab.orgData.Lock() 777 defer tab.orgData.Unlock() 778 779 nodeInfo, ok := tab.orgData.peerIDToNode[id] 780 if !ok { 781 return nil 782 } 783 return nodeInfo.node 784 } 785 786 func (tab *Table) singleOrgCheck(orgid comm.Address) [][]uint64 { 787 peers := make(map[uint64]bool) 788 tab.orgData.Lock() 789 orgpeers := tab.orgData.orgSingleData[orgid] 790 for peerid, _ := range orgpeers { 791 peers[peerid] = false 792 } 793 tab.orgData.Unlock() 794 795 result := make([][]uint64, 0) 796 for len(peers) > 0 { 797 temarry, tempeer := tab.check(peers) 798 if len(temarry) > 0 { 799 result = append(result, temarry) 800 } 801 peers = tempeer 802 } 803 //fmt.Println(" ******* result:",result) 804 return result 805 } 806 807 func (tab *Table) check(peers map[uint64]bool) ([]uint64, map[uint64]bool) { 808 var randPeerID uint64 809 bhave := false 810 811 tab.connectData.Lock() 812 for temid, _ := range peers { 813 if _, ok := tab.connectData.peerToPeerMap[temid]; ok { 814 randPeerID = temid 815 bhave = true 816 break 817 } 818 } 819 tab.connectData.Unlock() 820 821 if bhave == false { 822 for temid, _ := range peers { 823 randPeerID = temid 824 } 825 } 826 827 orgs := make([]uint64, 0) 828 orgs = append(orgs, randPeerID) 829 delete(peers, randPeerID) 830 831 if bhave == false { 832 return orgs, peers 833 } 834 835 index := 0 // 836 837 for index < len(orgs) { 838 randPeerID = orgs[index] 839 tab.connectData.Lock() 840 for { 841 bbreak := true 842 843 if remotemap, ok := tab.connectData.peerToPeerMap[randPeerID]; ok { 844 for remoteid, _ := range remotemap { 845 if _, exit := peers[remoteid]; exit { 846 orgs = append(orgs, remoteid) 847 delete(peers, remoteid) 848 bbreak = false 849 } 850 } 851 } 852 853 if bbreak { 854 break 855 } 856 if len(peers) == 0 { 857 break 858 } 859 } 860 tab.connectData.Unlock() 861 index = index + 1 862 if index >= len(orgs) { 863 break 864 } 865 } 866 return orgs, peers 867 } 868 869 /* 870 func (tab *Table) circleprintf() { 871 num := 0 872 for num < 20 { 873 // fmt.Println(" 888888888 ********** 88888888 ********* ") 874 875 tab.circlemutex.RLock() 876 for circleID,circledata := range tab.circleDta { 877 if len(circledata) > 0 { 878 for nodeid,_ := range circledata { 879 fmt.Println(" **** circleID:",circleID,",nodeid:",nodeid) 880 } 881 } 882 } 883 tab.circlemutex.RUnlock() 884 time.Sleep(15*time.Second) 885 num = num + 1 886 } 887 888 } 889 */ 890 891 type StellarInfo struct { 892 sync.Mutex 893 stellarmap map[uint64]*Node 894 } 895 896 func (tab *Table) stellarNode(node *Node, circleID comm.Address, ownid uint64, badd bool) { 897 tab.stellarData.Lock() 898 defer tab.stellarData.Unlock() 899 900 //fmt.Println(" ****** Table stellarNode circleID,ownid,badd",circleID,ownid,badd) 901 902 if tab.stellarData.stellarmap == nil { 903 tab.stellarData.stellarmap = make(map[uint64]*Node) 904 } 905 906 if badd { 907 tab.stellarData.stellarmap[ownid] = node 908 } else { 909 delete(tab.stellarData.stellarmap, ownid) 910 } 911 } 912 913 func (tab *Table) getStellar() ([]*Node, error) { 914 tab.stellarData.Lock() 915 defer tab.stellarData.Unlock() 916 917 if tab.stellarData.stellarmap == nil { 918 tab.stellarData.stellarmap = make(map[uint64]*Node) 919 } 920 921 result := make([]*Node, 0) 922 for _, node := range tab.stellarData.stellarmap { 923 result = append(result, node) 924 } 925 //fmt.Println(" **** Table getStellar result:",result) 926 return result, nil 927 } 928 929 func (tab *Table) stellarInspectDis(inspectpeer uint64) { 930 //fmt.Println(" ****** Table stellarInspectDis inspectpeer:",inspectpeer) 931 tab.stellarDisChan <- inspectpeer 932 } 933 934 func (tab *Table) refreshStellarDis() { 935 type disInfo struct { 936 count int 937 firsttime int64 938 } 939 inspectpeer := make(map[uint64]*disInfo) 940 941 timer := time.NewTicker(10 * time.Second) 942 defer timer.Stop() 943 loop: 944 for { 945 select { 946 case disid := <-tab.stellarDisChan: 947 948 tab.stellarData.Lock() 949 950 stellarlen := len(tab.stellarData.stellarmap) 951 if _, ok := tab.stellarData.stellarmap[disid]; ok { 952 if info, exit := inspectpeer[disid]; exit { 953 if info.count >= (stellarlen / 2) { 954 //fmt.Println(" ******* info.count,stellarlen,",info.count,stellarlen) 955 delete(tab.stellarData.stellarmap, disid) 956 } else { 957 inspectpeer[disid].count = info.count + 1 958 } 959 } else { 960 inspectpeer[disid] = &disInfo{ 961 count: 1, 962 firsttime: time.Now().Unix(), 963 } 964 } 965 } 966 tab.stellarData.Unlock() 967 case <-timer.C: 968 dispeer := make([]uint64, 0) 969 for peerid, info := range inspectpeer { 970 if time.Now().Unix()-info.firsttime >= 5*60 { 971 dispeer = append(dispeer, peerid) 972 } 973 } 974 975 for _, peerid := range dispeer { 976 delete(inspectpeer, peerid) 977 } 978 979 case <-tab.closeReq: 980 break loop 981 } 982 } 983 }