Skip to content

Commit e6189f9

Browse files
committed
stale lrps claimed state is retained
1 parent 1465e40 commit e6189f9

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

controllers/lrp_convergence_controller.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,16 @@ func (h *LRPConvergenceController) ConvergeLRPs(ctx context.Context) {
179179
for _, lrpKey := range convergenceResult.UnstartedLRPKeys {
180180
dereferencedKey := *lrpKey
181181
works = append(works, func() {
182+
actualLRP, err := h.lrpDB.GetActualLRP(ctx, logger, dereferencedKey.Key)
183+
if err != nil {
184+
logger.Error("cannot-find-actual-lrp", err, lager.Data{"key": dereferencedKey})
185+
return
186+
}
187+
// no action taken if an unstarted lrp is in claimed state
188+
if actualLRP.State == models.ActualLRPStateClaimed {
189+
return
190+
}
191+
182192
before, after, err := h.lrpDB.UnclaimActualLRP(ctx, logger, dereferencedKey.Key)
183193
if err != nil && err != models.ErrActualLRPCannotBeUnclaimed {
184194
logger.Error("cannot-unclaim-lrp", err, lager.Data{"key": dereferencedKey})

db/actual_lrp_db.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type ActualLRPDB interface {
1414
ActualLRPsByProcessGuids(ctx context.Context, logger lager.Logger, filter models.ActualLRPsByProcessGuidsFilter) ([]*models.ActualLRP, error)
1515
CreateUnclaimedActualLRP(ctx context.Context, logger lager.Logger, key *models.ActualLRPKey) (after *models.ActualLRP, err error)
1616
UnclaimActualLRP(ctx context.Context, logger lager.Logger, key *models.ActualLRPKey) (before *models.ActualLRP, after *models.ActualLRP, err error)
17+
GetActualLRP(ctx context.Context, logger lager.Logger, key *models.ActualLRPKey) (actualLRP *models.ActualLRP, err error)
1718
ClaimActualLRP(ctx context.Context, logger lager.Logger, processGuid string, index int32, instanceKey *models.ActualLRPInstanceKey) (before *models.ActualLRP, after *models.ActualLRP, err error)
1819
StartActualLRP(ctx context.Context,
1920
logger lager.Logger,

db/sqldb/actual_lrp_db.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ func (db *SQLDB) UnclaimActualLRP(ctx context.Context, logger lager.Logger, key
212212
}
213213
beforeActualLRP = *actualLRP
214214

215-
if actualLRP.State == models.ActualLRPStateUnclaimed || actualLRP.State == models.ActualLRPStateClaimed {
215+
if actualLRP.State == models.ActualLRPStateUnclaimed {
216216
logger.Debug("already-" + actualLRP.State)
217217
return models.ErrActualLRPCannotBeUnclaimed
218218
}
@@ -253,6 +253,27 @@ func (db *SQLDB) UnclaimActualLRP(ctx context.Context, logger lager.Logger, key
253253
return &beforeActualLRP, actualLRP, err
254254
}
255255

256+
func (db *SQLDB) GetActualLRP(ctx context.Context, logger lager.Logger, key *models.ActualLRPKey) (*models.ActualLRP, error) {
257+
logger = logger.Session("db-get-actual-lrp", lager.Data{"key": key})
258+
logger.Info("starting")
259+
defer logger.Info("complete")
260+
261+
var actualLRP *models.ActualLRP
262+
processGuid := key.ProcessGuid
263+
index := key.Index
264+
265+
err := db.transact(ctx, logger, func(logger lager.Logger, tx helpers.Tx) error {
266+
var err error
267+
actualLRP, err = db.fetchActualLRPForUpdate(ctx, logger, processGuid, index, models.ActualLRP_Ordinary, tx)
268+
if err != nil {
269+
logger.Error("failed-fetching-actual-lrp-for-share", err)
270+
return err
271+
}
272+
return nil
273+
})
274+
return actualLRP, err
275+
}
276+
256277
func (db *SQLDB) ClaimActualLRP(ctx context.Context, logger lager.Logger, processGuid string, index int32, instanceKey *models.ActualLRPInstanceKey) (*models.ActualLRP, *models.ActualLRP, error) {
257278
logger = logger.Session("db-claim-actual-lrp", lager.Data{"process_guid": processGuid, "index": index, "instance_key": instanceKey})
258279
logger.Info("starting")

0 commit comments

Comments
 (0)