func (db *ETCDDB) UpdateDesiredLRP(logger lager.Logger, processGuid string, update *models.DesiredLRPUpdate) error { logger = logger.Session("update-desired-lrp", lager.Data{"process-guid": processGuid}) logger.Info("starting") defer logger.Info("complete") var schedulingInfo *models.DesiredLRPSchedulingInfo var existingInstances int32 var err error for i := 0; i < 2; i++ { var index uint64 schedulingInfo, index, err = db.rawDesiredLRPSchedulingInfo(logger, processGuid) if err != nil { logger.Error("failed-to-fetch-scheduling-info", err) break } existingInstances = schedulingInfo.Instances schedulingInfo.ApplyUpdate(update) err = db.updateDesiredLRPSchedulingInfo(logger, schedulingInfo, index) if err != nil { logger.Error("update-scheduling-info-failed", err) modelErr := models.ConvertError(err) if modelErr != models.ErrResourceConflict { break } // Retry on CAS fail continue } break } if err != nil { return err } switch diff := schedulingInfo.Instances - existingInstances; { case diff > 0: db.startInstanceRange(logger, existingInstances, schedulingInfo.Instances, schedulingInfo) case diff < 0: db.stopInstanceRange(logger, schedulingInfo.Instances, existingInstances, schedulingInfo) case diff == 0: // this space intentionally left blank } return nil }
func (db *ETCDDB) UpdateDesiredLRP(logger lager.Logger, processGuid string, update *models.DesiredLRPUpdate) (*models.DesiredLRP, error) { logger.Info("starting") defer logger.Info("complete") var schedulingInfo *models.DesiredLRPSchedulingInfo var err error var beforeDesiredLRP *models.DesiredLRP for i := 0; i < 2; i++ { var index uint64 beforeDesiredLRP, index, err = db.rawDesiredLRPByProcessGuid(logger, processGuid) if err != nil { logger.Error("failed-to-fetch-desired-lrp", err) break } schedulingInfoValue := beforeDesiredLRP.DesiredLRPSchedulingInfo() schedulingInfo = &schedulingInfoValue schedulingInfo.ApplyUpdate(update) err = db.updateDesiredLRPSchedulingInfo(logger, schedulingInfo, index) if err != nil { logger.Error("update-scheduling-info-failed", err) modelErr := models.ConvertError(err) if modelErr != models.ErrResourceConflict { break } // Retry on CAS fail continue } break } if err != nil { return nil, err } return beforeDesiredLRP, nil }