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  }