content/local/locks.go
基于ref的锁,ref可以是image的一个layer或image manifest文件
这是tryLock的唯一入口,获取writer的函数
func (s *store) Writer(ctx context.Context, opts ...content.WriterOpt) (content.Writer, error) {var wOpts content.WriterOptsfor _, opt := range opts {if err := opt(&wOpts); err != nil {return nil, err}}// TODO(AkihiroSuda): we could create a random string or one calculated based on the context// https://github.com/containerd/containerd/issues/2129#issuecomment-380255019if wOpts.Ref == "" {return nil, errors.Wrap(errdefs.ErrInvalidArgument, "ref must not be empty")}var lockErr errorfor count := uint64(0); count < 10; count++ {if err := tryLock(wOpts.Ref); err != nil {if !errdefs.IsUnavailable(err) {return nil, err}lockErr = err} else {lockErr = nilbreak}time.Sleep(time.Millisecond * time.Duration(rand.Intn(1<<count)))}if lockErr != nil {return nil, lockErr}w, err := s.writer(ctx, wOpts.Ref, wOpts.Desc.Size, wOpts.Desc.Digest)if err != nil {unlock(wOpts.Ref)return nil, err}return w, nil // lock is now held by w.}
�
