Skip to content

Commit

Permalink
Make discovery summarizer call servers in parallel
Browse files Browse the repository at this point in the history
  • Loading branch information
nebril committed Jul 7, 2016
1 parent dc8ff81 commit ee6f50e
Showing 1 changed file with 28 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -102,20 +102,39 @@ func (ds *discoverySummarizerServer) indexHandler(w http.ResponseWriter, r *http
func (ds *discoverySummarizerServer) summarizeGroupVersionsHandler(path string) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
var apiGroupList *unversioned.APIGroupList
// TODO: We can cache and parallelize the calls to all servers.
// TODO: We can cache calls to all servers.
groups := make(chan *unversioned.APIGroupList)
errorChannel := make(chan error)
for _, serverAddress := range ds.groupVersionPaths[path] {
groupList, err := ds.getAPIGroupList(serverAddress + path)
if err != nil {
addr := serverAddress
go func(groups chan *unversioned.APIGroupList, error_channel chan error) {
groupList, err := ds.getAPIGroupList(addr + path)
if err != nil {
errorChannel <- err
return
}
groups <- groupList
return
}(groups, errorChannel)
}

var groupList *unversioned.APIGroupList
var err error
for range ds.groupVersionPaths[path] {
select {
case groupList = <-groups:
if apiGroupList == nil {
apiGroupList = &unversioned.APIGroupList{}
*apiGroupList = *groupList
} else {
apiGroupList.Groups = append(apiGroupList.Groups, groupList.Groups...)
}
case err = <-errorChannel:
ds.writeErr(http.StatusBadGateway, err, w)
return
}
if apiGroupList == nil {
apiGroupList = &unversioned.APIGroupList{}
*apiGroupList = *groupList
} else {
apiGroupList.Groups = append(apiGroupList.Groups, groupList.Groups...)
}
}

ds.writeRawJSON(http.StatusOK, *apiGroupList, w)
return
}
Expand Down

0 comments on commit ee6f50e

Please sign in to comment.