Kaynağa Gözat

Add 'consistent', 'cached', and 'delegated' mode flags

This adds 'consistency' mode flags to the mount command line argument.
Initially, the valid 'consistency' flags are 'consistent', 'cached',
'delegated', and 'default'.

Signed-off-by: David Sheets <dsheets@docker.com>
Signed-off-by: Jeremy Yallop <yallop@docker.com>
David Sheets 8 yıl önce
ebeveyn
işleme
f13297c0be
3 değiştirilmiş dosya ile 31 ekleme ve 4 silme
  1. 18 3
      api/types/mount/mount.go
  2. 2 0
      opts/mount.go
  3. 11 1
      volume/volume_unix.go

+ 18 - 3
api/types/mount/mount.go

@@ -23,9 +23,10 @@ type Mount struct {
 	// Source specifies the name of the mount. Depending on mount type, this
 	// may be a volume name or a host path, or even ignored.
 	// Source is not supported for tmpfs (must be an empty value)
-	Source   string `json:",omitempty"`
-	Target   string `json:",omitempty"`
-	ReadOnly bool   `json:",omitempty"`
+	Source      string      `json:",omitempty"`
+	Target      string      `json:",omitempty"`
+	ReadOnly    bool        `json:",omitempty"`
+	Consistency Consistency `json:",omitempty"`
 
 	BindOptions   *BindOptions   `json:",omitempty"`
 	VolumeOptions *VolumeOptions `json:",omitempty"`
@@ -60,6 +61,20 @@ var Propagations = []Propagation{
 	PropagationSlave,
 }
 
+// Consistency represents the consistency requirements of a mount.
+type Consistency string
+
+const (
+	// ConsistencyFull guarantees bind-mount-like consistency
+	ConsistencyFull Consistency = "consistent"
+	// ConsistencyCached mounts can cache read data and FS structure
+	ConsistencyCached Consistency = "cached"
+	// ConsistencyDelegated mounts can cache read and written data and structure
+	ConsistencyDelegated Consistency = "delegated"
+	// ConsistencyDefault provides "consistent" behavior unless overridden
+	ConsistencyDefault Consistency = "default"
+)
+
 // BindOptions defines options specific to mounts of type "bind".
 type BindOptions struct {
 	Propagation Propagation `json:",omitempty"`

+ 2 - 0
opts/mount.go

@@ -95,6 +95,8 @@ func (m *MountOpt) Set(value string) error {
 			if err != nil {
 				return fmt.Errorf("invalid value for %s: %s", key, value)
 			}
+		case "consistency":
+			mount.Consistency = mounttypes.Consistency(strings.ToLower(value))
 		case "bind-propagation":
 			bindOptions().Propagation = mounttypes.Propagation(strings.ToLower(value))
 		case "volume-nocopy":

+ 11 - 1
volume/volume_unix.go

@@ -30,6 +30,13 @@ var labelModes = map[string]bool{
 	"z": true,
 }
 
+// consistency modes
+var consistencyModes = map[mounttypes.Consistency]bool{
+	mounttypes.ConsistencyFull:      true,
+	mounttypes.ConsistencyCached:    true,
+	mounttypes.ConsistencyDelegated: true,
+}
+
 // BackwardsCompatible decides whether this mount point can be
 // used in old versions of Docker or not.
 // Only bind mounts and local volumes can be used in old versions of Docker.
@@ -62,6 +69,7 @@ func ValidMountMode(mode string) bool {
 	labelModeCount := 0
 	propagationModeCount := 0
 	copyModeCount := 0
+	consistencyModeCount := 0
 
 	for _, o := range strings.Split(mode, ",") {
 		switch {
@@ -73,13 +81,15 @@ func ValidMountMode(mode string) bool {
 			propagationModeCount++
 		case copyModeExists(o):
 			copyModeCount++
+		case consistencyModes[mounttypes.Consistency(o)]:
+			consistencyModeCount++
 		default:
 			return false
 		}
 	}
 
 	// Only one string for each mode is allowed.
-	if rwModeCount > 1 || labelModeCount > 1 || propagationModeCount > 1 || copyModeCount > 1 {
+	if rwModeCount > 1 || labelModeCount > 1 || propagationModeCount > 1 || copyModeCount > 1 || consistencyModeCount > 1 {
 		return false
 	}
 	return true