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