2689484402
On startup all local volumes were unmounted as a cleanup mechanism for the non-clean exit of the last engine process. This caused live-restored volumes that used special volume opt mount flags to be broken. While the refcount was restored, the _data directory was just unmounted, so all new containers mounting this volume would just have the access to the empty _data directory instead of the real volume. With this patch, the mountpoint isn't unmounted. Instead, if the volume is already mounted, just mark it as mounted, so the next time Mount is called only the ref count is incremented, but no second attempt to mount it is performed. Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
// Package local provides the default implementation for volumes. It
|
|
// is used to mount data volume containers and directories local to
|
|
// the host server.
|
|
package local // import "github.com/docker/docker/volume/local"
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/docker/docker/errdefs"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type optsConfig struct{}
|
|
|
|
func (r *Root) validateOpts(opts map[string]string) error {
|
|
if len(opts) == 0 {
|
|
return nil
|
|
}
|
|
return errdefs.InvalidParameter(errors.New("options are not supported on this platform"))
|
|
}
|
|
|
|
func (v *localVolume) setOpts(opts map[string]string) error {
|
|
// Windows does not support any options currently
|
|
return nil
|
|
}
|
|
|
|
func (v *localVolume) needsMount() bool {
|
|
return false
|
|
}
|
|
|
|
func (v *localVolume) mount() error {
|
|
return nil
|
|
}
|
|
|
|
func (v *localVolume) unmount() error {
|
|
return nil
|
|
}
|
|
|
|
func unmount(_ string) {}
|
|
|
|
func (v *localVolume) postMount() error {
|
|
return nil
|
|
}
|
|
|
|
// restoreIfMounted is a no-op on Windows (because mounts are not supported).
|
|
func (v *localVolume) restoreIfMounted() error {
|
|
return nil
|
|
}
|
|
|
|
func (v *localVolume) CreatedAt() (time.Time, error) {
|
|
fileInfo, err := os.Stat(v.rootPath)
|
|
if err != nil {
|
|
return time.Time{}, err
|
|
}
|
|
ft := fileInfo.Sys().(*syscall.Win32FileAttributeData).CreationTime
|
|
return time.Unix(0, ft.Nanoseconds()), nil
|
|
}
|