// GetLookupdTopics returns a []string containing a union of all the topics // from all the given nsqlookupd func (c *ClusterInfo) GetLookupdTopics(lookupdHTTPAddrs []string) ([]string, error) { var topics []string var lock sync.Mutex var wg sync.WaitGroup var errs []error type respType struct { Topics []string `json:"topics"` } for _, addr := range lookupdHTTPAddrs { wg.Add(1) go func(addr string) { defer wg.Done() endpoint := fmt.Sprintf("http://%s/topics", addr) c.logf("CI: querying nsqlookupd %s", endpoint) var resp respType err := c.client.NegotiateV1(endpoint, &resp) if err != nil { lock.Lock() errs = append(errs, err) lock.Unlock() return } lock.Lock() defer lock.Unlock() topics = append(topics, resp.Topics...) }(addr) } wg.Wait() if len(errs) == len(lookupdHTTPAddrs) { return nil, fmt.Errorf("Failed to query any nsqlookupd: %s", ErrList(errs)) } topics = stringy.Uniq(topics) sort.Strings(topics) if len(errs) > 0 { return topics, ErrList(errs) } return topics, nil }
// GetLookupdTopicChannels returns a []string containing a union of all the channels // from all the given lookupd for the given topic func (c *ClusterInfo) GetLookupdTopicChannels(topic string, lookupdHTTPAddrs []string) ([]string, error) { var channels []string var lock sync.Mutex var wg sync.WaitGroup var errs []error type respType struct { Channels []string `json:"channels"` } for _, addr := range lookupdHTTPAddrs { wg.Add(1) go func(addr string) { defer wg.Done() endpoint := fmt.Sprintf("http://%s/channels?topic=%s", addr, url.QueryEscape(topic)) c.logf("CI: querying nsqlookupd %s", endpoint) var resp respType err := c.client.NegotiateV1(endpoint, &resp) if err != nil { lock.Lock() errs = append(errs, err) lock.Unlock() return } lock.Lock() defer lock.Unlock() channels = append(channels, resp.Channels...) }(addr) } wg.Wait() if len(errs) == len(lookupdHTTPAddrs) { return nil, errors.New("failed to query any nsqlookupd") } channels = stringy.Uniq(channels) sort.Strings(channels) if len(errs) > 0 { return channels, ErrList(errs) } return channels, nil }
// GetLookupdTopics returns a []string containing a union of all the topics // from all the given lookupd func (c *ClusterInfo) GetLookupdTopics(lookupdHTTPAddrs []string) ([]string, error) { var success bool var allTopics []string var lock sync.Mutex var wg sync.WaitGroup type respType struct { Topics []string `json:"topics"` } for _, addr := range lookupdHTTPAddrs { wg.Add(1) endpoint := fmt.Sprintf("http://%s/topics", addr) c.logf("LOOKUPD: querying %s", endpoint) go func(endpoint string) { defer wg.Done() var resp respType err := c.client.NegotiateV1(endpoint, &resp) if err != nil { c.logf("ERROR: lookupd %s - %s", endpoint, err) return } lock.Lock() defer lock.Unlock() success = true allTopics = append(allTopics, resp.Topics...) }(endpoint) } wg.Wait() if success == false { return nil, errors.New("unable to query any lookupd") } allTopics = stringy.Uniq(allTopics) sort.Strings(allTopics) return allTopics, nil }