diff --git a/lfs/transfer_queue.go b/lfs/transfer_queue.go index 339eb602..e027349b 100644 --- a/lfs/transfer_queue.go +++ b/lfs/transfer_queue.go @@ -3,7 +3,6 @@ package lfs import ( "sync" "sync/atomic" - "time" "github.com/github/git-lfs/api" "github.com/github/git-lfs/config" @@ -175,12 +174,6 @@ func (q *TransferQueue) ensureAdapterBegun() { } -// NOTE(taylor): this function seems to be what we're looking for. It is called -// after the transfer has been completed, see the goroutine that -// ensureAdapterBegun spawns (L170-174). -// -// If the transfer completed successfully, we should check all of the action -// expires_at fields and retry if any of them are out of date. func (q *TransferQueue) handleTransferResult(res transfer.TransferResult) { if res.Error != nil { if q.canRetry(res.Error) { @@ -197,18 +190,6 @@ func (q *TransferQueue) handleTransferResult(res transfer.TransferResult) { q.errorc <- res.Error } } else { - now := time.Now() - for _, action := range res.Transfer.Object.Actions { - if action.ExpiresAt.After(now) { - q.trMutex.Lock() - t := q.transferables[res.Transfer.Object.Oid] - q.trMutex.Unlock() - - q.retry(t) - return - } - } - oid := res.Transfer.Object.Oid for _, c := range q.watchers { c <- oid diff --git a/transfer/adapterbase.go b/transfer/adapterbase.go index fa856c2f..87fc3c77 100644 --- a/transfer/adapterbase.go +++ b/transfer/adapterbase.go @@ -1,8 +1,11 @@ package transfer import ( + "fmt" "sync" + "time" + "github.com/github/git-lfs/errutil" "github.com/rubyist/tracerx" ) @@ -103,8 +106,15 @@ func (a *adapterBase) worker(workerNum int) { } } tracerx.Printf("xfer: adapter %q worker %d processing job for %q", a.Name(), workerNum, t.Object.Oid) + // Actual transfer happens here - err := a.transferImpl.DoTransfer(t, a.cb, authCallback) + var err error + if t.Object.IsExpired(time.Now()) { + tracerx.Printf("xfer: adapter %q worker %d found job for %q expired, retrying...", a.Name(), workerNum, t.Object.Oid) + err = errutil.NewRetriableError(fmt.Errorf("lfs/transfer: object %q has expired", t.Object.Oid)) + } else { + err = a.transferImpl.DoTransfer(t, a.cb, authCallback) + } if a.outChan != nil { res := TransferResult{t, err}