Skip to content

Commit

Permalink
Add 'consistent', 'cached', and 'delegated' mode flags
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Jeremy Yallop <[email protected]>
  • Loading branch information
David Sheets authored and yallop committed Mar 1, 2017
1 parent ce79f6b commit f13297c
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 4 deletions.
21 changes: 18 additions & 3 deletions api/types/mount/mount.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down Expand Up @@ -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"`
Expand Down
2 changes: 2 additions & 0 deletions opts/mount.go
Original file line number Diff line number Diff line change
Expand Up @@ -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":
Expand Down
12 changes: 11 additions & 1 deletion volume/volume_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -62,6 +69,7 @@ func ValidMountMode(mode string) bool {
labelModeCount := 0
propagationModeCount := 0
copyModeCount := 0
consistencyModeCount := 0

for _, o := range strings.Split(mode, ",") {
switch {
Expand All @@ -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
Expand Down

0 comments on commit f13297c

Please sign in to comment.