| 631 | } |
| 632 | |
| 633 | func getPeers(dbID proto.DatabaseID, privKey *asymmetric.PrivateKey) (peers *proto.Peers, err error) { |
| 634 | defer func() { |
| 635 | log.WithFields(log.Fields{ |
| 636 | "db": dbID, |
| 637 | "peers": peers, |
| 638 | }).WithError(err).Debug("get peers for database") |
| 639 | }() |
| 640 | |
| 641 | profileReq := &types.QuerySQLChainProfileReq{} |
| 642 | profileResp := &types.QuerySQLChainProfileResp{} |
| 643 | profileReq.DBID = dbID |
| 644 | err = rpc.RequestBP(route.MCCQuerySQLChainProfile.String(), profileReq, profileResp) |
| 645 | if err != nil { |
| 646 | err = errors.Wrap(err, "get sqlchain profile failed in getPeers") |
| 647 | return |
| 648 | } |
| 649 | |
| 650 | nodeIDs := make([]proto.NodeID, len(profileResp.Profile.Miners)) |
| 651 | if len(profileResp.Profile.Miners) <= 0 { |
| 652 | err = errors.Wrap(ErrInvalidProfile, "unexpected error in getPeers") |
| 653 | return |
| 654 | } |
| 655 | for i, mi := range profileResp.Profile.Miners { |
| 656 | nodeIDs[i] = mi.NodeID |
| 657 | } |
| 658 | peers = &proto.Peers{ |
| 659 | PeersHeader: proto.PeersHeader{ |
| 660 | Leader: nodeIDs[0], |
| 661 | Servers: nodeIDs[:], |
| 662 | }, |
| 663 | } |
| 664 | err = peers.Sign(privKey) |
| 665 | if err != nil { |
| 666 | err = errors.Wrap(err, "sign peers failed in getPeers") |
| 667 | return |
| 668 | } |
| 669 | |
| 670 | // set peers in the updater cache |
| 671 | peerList.Store(dbID, peers) |
| 672 | |
| 673 | return |
| 674 | } |
| 675 | |
| 676 | func allocateConnAndSeq() (connID uint64, seqNo uint64) { |
| 677 | connIDLock.Lock() |