12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- //go:build windows
- package wclayer
- import (
- "context"
- "strings"
- "sync"
- "github.com/Microsoft/hcsshim/internal/hcserror"
- "github.com/Microsoft/hcsshim/internal/oc"
- "go.opencensus.io/trace"
- )
- var prepareLayerLock sync.Mutex
- // PrepareLayer finds a mounted read-write layer matching path and enables the
- // the filesystem filter for use on that layer. This requires the paths to all
- // parent layers, and is necessary in order to view or interact with the layer
- // as an actual filesystem (reading and writing files, creating directories, etc).
- // Disabling the filter must be done via UnprepareLayer.
- func PrepareLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) {
- title := "hcsshim::PrepareLayer"
- ctx, span := oc.StartSpan(ctx, title)
- defer span.End()
- defer func() { oc.SetSpanStatus(span, err) }()
- span.AddAttributes(
- trace.StringAttribute("path", path),
- trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", ")))
- // Generate layer descriptors
- layers, err := layerPathsToDescriptors(ctx, parentLayerPaths)
- if err != nil {
- return err
- }
- // This lock is a temporary workaround for a Windows bug. Only allowing one
- // call to prepareLayer at a time vastly reduces the chance of a timeout.
- prepareLayerLock.Lock()
- defer prepareLayerLock.Unlock()
- err = prepareLayer(&stdDriverInfo, path, layers)
- if err != nil {
- return hcserror.New(err, title, "")
- }
- return nil
- }
|