(dbID proto.DatabaseID)
| 367 | } |
| 368 | |
| 369 | func (s *Service) getUpstream(dbID proto.DatabaseID) (instance *types.ServiceInstance, err error) { |
| 370 | log.WithField("db", dbID).Debug("get peers info for database") |
| 371 | |
| 372 | if iInstance, exists := s.upstreamServers.Load(dbID); exists { |
| 373 | instance = iInstance.(*types.ServiceInstance) |
| 374 | return |
| 375 | } |
| 376 | |
| 377 | curBP, err := mux.GetCurrentBP() |
| 378 | if err != nil { |
| 379 | return |
| 380 | } |
| 381 | |
| 382 | privateKey, err := kms.GetLocalPrivateKey() |
| 383 | if err != nil { |
| 384 | return |
| 385 | } |
| 386 | |
| 387 | var ( |
| 388 | req = &types.QuerySQLChainProfileReq{ |
| 389 | DBID: dbID, |
| 390 | } |
| 391 | resp = &types.QuerySQLChainProfileResp{} |
| 392 | ) |
| 393 | // get peers list from block producer |
| 394 | if err = s.caller.CallNode( |
| 395 | curBP, route.MCCQuerySQLChainProfile.String(), req, resp, |
| 396 | ); err != nil { |
| 397 | return |
| 398 | } |
| 399 | |
| 400 | // Build server instance from sqlchain profile |
| 401 | var ( |
| 402 | profile = resp.Profile |
| 403 | nodeids = make([]proto.NodeID, len(profile.Miners)) |
| 404 | peers *proto.Peers |
| 405 | genesis = &types.Block{} |
| 406 | ) |
| 407 | for i, v := range profile.Miners { |
| 408 | nodeids[i] = v.NodeID |
| 409 | } |
| 410 | peers = &proto.Peers{ |
| 411 | PeersHeader: proto.PeersHeader{ |
| 412 | Leader: nodeids[0], |
| 413 | Servers: nodeids[:], |
| 414 | }, |
| 415 | } |
| 416 | if err = peers.Sign(privateKey); err != nil { |
| 417 | return |
| 418 | } |
| 419 | if err = utils.DecodeMsgPack(profile.EncodedGenesis, genesis); err != nil { |
| 420 | return |
| 421 | } |
| 422 | instance = &types.ServiceInstance{ |
| 423 | DatabaseID: profile.ID, |
| 424 | Peers: peers, |
| 425 | ResourceMeta: profile.Meta, |
| 426 | GenesisBlock: genesis, |
no test coverage detected