func (h *DesireAppHandler) updateDesiredApp( logger lager.Logger, existingLRP *models.DesiredLRP, desireAppMessage cc_messages.DesireAppRequestFromCC, ) error { var builder recipebuilder.RecipeBuilder = h.recipeBuilders["buildpack"] if desireAppMessage.DockerImageUrl != "" { builder = h.recipeBuilders["docker"] } ports, err := builder.ExtractExposedPorts(&desireAppMessage) if err != nil { logger.Error("failed to-get-exposed-port", err) return err } updateRoutes, err := helpers.CCRouteInfoToRoutes(desireAppMessage.RoutingInfo, ports) if err != nil { logger.Error("failed-to-marshal-routes", err) return err } routes := existingLRP.Routes if routes == nil { routes = &models.Routes{} } if value, ok := updateRoutes[cfroutes.CF_ROUTER]; ok { (*routes)[cfroutes.CF_ROUTER] = value } if value, ok := updateRoutes[tcp_routes.TCP_ROUTER]; ok { (*routes)[tcp_routes.TCP_ROUTER] = value } instances := int32(desireAppMessage.NumInstances) updateRequest := &models.DesiredLRPUpdate{ Annotation: &desireAppMessage.ETag, Instances: &instances, Routes: routes, } logger.Debug("updating-desired-lrp", lager.Data{"routes": sanitizeRoutes(existingLRP.Routes)}) err = h.bbsClient.UpdateDesiredLRP(desireAppMessage.ProcessGuid, updateRequest) if err != nil { logger.Error("failed-to-update-lrp", err) return err } logger.Debug("updated-desired-lrp") return nil }
func (p *Processor) updateStaleDesiredLRPs( logger lager.Logger, cancel <-chan struct{}, stale <-chan []cc_messages.DesireAppRequestFromCC, existingSchedulingInfoMap map[string]*models.DesiredLRPSchedulingInfo, invalidCount *int32, ) <-chan error { logger = logger.Session("update-stale-desired-lrps") errc := make(chan error, 1) go func() { defer close(errc) for { var staleAppRequests []cc_messages.DesireAppRequestFromCC select { case <-cancel: return case selected, open := <-stale: if !open { return } staleAppRequests = selected } works := make([]func(), len(staleAppRequests)) for i, desireAppRequest := range staleAppRequests { desireAppRequest := desireAppRequest var builder recipebuilder.RecipeBuilder = p.builders["buildpack"] if desireAppRequest.DockerImageUrl != "" { builder = p.builders["docker"] } works[i] = func() { processGuid := desireAppRequest.ProcessGuid existingSchedulingInfo := existingSchedulingInfoMap[desireAppRequest.ProcessGuid] updateReq := &models.DesiredLRPUpdate{} instances := int32(desireAppRequest.NumInstances) updateReq.Instances = &instances updateReq.Annotation = &desireAppRequest.ETag exposedPorts, err := builder.ExtractExposedPorts(&desireAppRequest) if err != nil { logger.Error("failed-updating-stale-lrp", err, lager.Data{ "process-guid": processGuid, "execution-metadata": desireAppRequest.ExecutionMetadata, }) errc <- err return } routes, err := helpers.CCRouteInfoToRoutes(desireAppRequest.RoutingInfo, exposedPorts) if err != nil { logger.Error("failed-to-marshal-routes", err) errc <- err return } updateReq.Routes = &routes for k, v := range existingSchedulingInfo.Routes { if k != cfroutes.CF_ROUTER { (*updateReq.Routes)[k] = v } } logger.Debug("updating-stale-lrp", updateDesiredRequestDebugData(processGuid, updateReq)) err = p.bbsClient.UpdateDesiredLRP(processGuid, updateReq) if err != nil { logger.Error("failed-updating-stale-lrp", err, lager.Data{ "process-guid": processGuid, }) if models.ConvertError(err).Type == models.Error_InvalidRequest { atomic.AddInt32(invalidCount, int32(1)) } else { errc <- err } return } logger.Debug("succeeded-updating-stale-lrp", updateDesiredRequestDebugData(processGuid, updateReq)) } } throttler, err := workpool.NewThrottler(p.updateLRPWorkPoolSize, works) if err != nil { errc <- err return } logger.Info("processing-batch", lager.Data{"size": len(staleAppRequests)}) throttler.Work() logger.Info("done-processing-batch", lager.Data{"size": len(staleAppRequests)}) } }() return errc }