
The locks now retry on the backend side to prevent clients from having to round trip on locks that might be momentarily held. This exposed some timing errors in the updated_at fields for content ingest, so we've had to move that to a separate file to export the monotonic go runtime timestamps. Signed-off-by: Stephen J Day <stephen.day@docker.com>
38 lines
571 B
Go
38 lines
571 B
Go
package local
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/containerd/containerd/errdefs"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// Handles locking references
|
|
|
|
var (
|
|
// locks lets us lock in process
|
|
locks = map[string]struct{}{}
|
|
locksMu sync.Mutex
|
|
)
|
|
|
|
func tryLock(ref string) error {
|
|
locksMu.Lock()
|
|
defer locksMu.Unlock()
|
|
|
|
if _, ok := locks[ref]; ok {
|
|
return errors.Wrapf(errdefs.ErrUnavailable, "ref %s locked", ref)
|
|
}
|
|
|
|
locks[ref] = struct{}{}
|
|
return nil
|
|
}
|
|
|
|
func unlock(ref string) {
|
|
locksMu.Lock()
|
|
defer locksMu.Unlock()
|
|
|
|
if _, ok := locks[ref]; ok {
|
|
delete(locks, ref)
|
|
}
|
|
}
|