in internal/route.go [386:445]
func (s *namesrvs) queryTopicRouteInfoFromServer(topic string) (*TopicRouteData, error) {
request := &GetRouteInfoRequestHeader{
Topic: topic,
}
var (
response *remote.RemotingCommand
err error
)
//if s.Size() == 0, response will be nil, lead to panic below.
if s.Size() == 0 {
rlog.Error("namesrv list empty. UpdateNameServerAddress should be called first.", map[string]interface{}{
"namesrv": s,
"topic": topic,
})
return nil, primitive.NewRemotingErr("namesrv list empty")
}
for i := 0; i < s.Size(); i++ {
rc := remote.NewRemotingCommand(ReqGetRouteInfoByTopic, request, nil)
ctx, cancel := context.WithTimeout(context.Background(), requestTimeout)
response, err = s.nameSrvClient.InvokeSync(ctx, s.getNameServerAddress(), rc)
if err == nil {
cancel()
break
}
cancel()
}
if err != nil {
rlog.Error("connect to namesrv failed.", map[string]interface{}{
"namesrv": s,
"topic": topic,
})
return nil, primitive.NewRemotingErr(err.Error())
}
switch response.Code {
case ResSuccess:
if response.Body == nil {
return nil, primitive.NewMQClientErr(response.Code, response.Remark)
}
routeData := &TopicRouteData{}
err = routeData.decode(string(response.Body))
if err != nil {
rlog.Warning("decode TopicRouteData error: %s", map[string]interface{}{
rlog.LogKeyUnderlayError: err,
"topic": topic,
})
return nil, err
}
return routeData, nil
case ResTopicNotExist:
return nil, errors.ErrTopicNotExist
default:
return nil, primitive.NewMQClientErr(response.Code, response.Remark)
}
}