diff --git a/cli/command/service/opts.go b/cli/command/service/opts.go index 742db95ee9..36c8dbb641 100644 --- a/cli/command/service/opts.go +++ b/cli/command/service/opts.go @@ -235,17 +235,15 @@ type resourceOptions struct { resCPU opts.NanoCPUs resMemBytes opts.MemBytes resGenericResources []string - swapBytes opts.MemBytes - memSwappiness int64 } -func (r *resourceOptions) ToResourceRequirements(flags *pflag.FlagSet) (*swarm.ResourceRequirements, error) { +func (r *resourceOptions) ToResourceRequirements() (*swarm.ResourceRequirements, error) { generic, err := ParseGenericResources(r.resGenericResources) if err != nil { return nil, err } - resreq := &swarm.ResourceRequirements{ + return &swarm.ResourceRequirements{ Limits: &swarm.Limit{ NanoCPUs: r.limitCPU.Value(), MemoryBytes: r.limitMemBytes.Value(), @@ -256,20 +254,7 @@ func (r *resourceOptions) ToResourceRequirements(flags *pflag.FlagSet) (*swarm.R MemoryBytes: r.resMemBytes.Value(), GenericResources: generic, }, - } - - // SwapBytes and MemorySwappiness are *int64 (pointers), so we need to have - // a variable we can take a pointer to. Additionally, we need to ensure - // that these values are only set if they are set as options. - if flags.Changed(flagSwapBytes) { - swapBytes := r.swapBytes.Value() - resreq.SwapBytes = &swapBytes - } - if flags.Changed(flagMemSwappiness) { - resreq.MemorySwappiness = &r.memSwappiness - } - - return resreq, nil + }, nil } type restartPolicyOptions struct { @@ -749,7 +734,7 @@ func (options *serviceOptions) ToService(ctx context.Context, apiClient client.N return networks[i].Target < networks[j].Target }) - resources, err := options.resources.ToResourceRequirements(flags) + resources, err := options.resources.ToResourceRequirements() if err != nil { return service, err } @@ -904,10 +889,6 @@ func addServiceFlags(flags *pflag.FlagSet, options *serviceOptions, defaultFlagV flags.Var(&options.resources.resMemBytes, flagReserveMemory, "Reserve Memory") flags.Int64Var(&options.resources.limitPids, flagLimitPids, 0, "Limit maximum number of processes (default 0 = unlimited)") flags.SetAnnotation(flagLimitPids, "version", []string{"1.41"}) - flags.Var(&options.resources.swapBytes, flagSwapBytes, "Swap Bytes (-1 for unlimited)") - flags.SetAnnotation(flagLimitPids, "version", []string{"1.52"}) - flags.Int64Var(&options.resources.memSwappiness, flagMemSwappiness, -1, "Tune memory swappiness (0-100), -1 to reset to default") - flags.SetAnnotation(flagLimitPids, "version", []string{"1.52"}) flags.Var(&options.stopGrace, flagStopGracePeriod, flagDesc(flagStopGracePeriod, "Time to wait before force killing a container (ns|us|ms|s|m|h)")) flags.Var(&options.replicas, flagReplicas, "Number of tasks") @@ -1092,8 +1073,6 @@ const ( flagUlimitAdd = "ulimit-add" flagUlimitRemove = "ulimit-rm" flagOomScoreAdj = "oom-score-adj" - flagSwapBytes = "memory-swap" - flagMemSwappiness = "memory-swappiness" ) func toNetipAddrSlice(ips []string) []netip.Addr { diff --git a/cli/command/service/opts_test.go b/cli/command/service/opts_test.go index d11d9a2e1a..563c42e9a4 100644 --- a/cli/command/service/opts_test.go +++ b/cli/command/service/opts_test.go @@ -163,10 +163,8 @@ func TestResourceOptionsToResourceRequirements(t *testing.T) { }, } - flags := newCreateCommand(nil).Flags() - for _, opt := range incorrectOptions { - _, err := opt.ToResourceRequirements(flags) + _, err := opt.ToResourceRequirements() assert.Check(t, is.ErrorContains(err, "")) } @@ -180,41 +178,12 @@ func TestResourceOptionsToResourceRequirements(t *testing.T) { } for _, opt := range correctOptions { - r, err := opt.ToResourceRequirements(flags) + r, err := opt.ToResourceRequirements() assert.NilError(t, err) assert.Check(t, is.Len(r.Reservations.GenericResources, len(opt.resGenericResources))) } } -func TestResourceOptionsToResourceRequirementsSwap(t *testing.T) { - // first, check that no flag set means no field set in the return - flags := newCreateCommand(nil).Flags() - - // These should be the default values of the field. - swapOptions := resourceOptions{ - swapBytes: 0, - memSwappiness: -1, - } - - r, err := swapOptions.ToResourceRequirements(flags) - assert.NilError(t, err) - assert.Check(t, is.Nil(r.SwapBytes)) - assert.Check(t, is.Nil(r.MemorySwappiness)) - - // now set the flags and some values - flags.Set(flagSwapBytes, "86000") - flags.Set(flagMemSwappiness, "23") - swapOptions.swapBytes = 86000 - swapOptions.memSwappiness = 23 - - r, err = swapOptions.ToResourceRequirements(flags) - assert.NilError(t, err) - assert.Check(t, r.SwapBytes != nil) - assert.Check(t, is.Equal(*(r.SwapBytes), int64(86000))) - assert.Check(t, r.MemorySwappiness != nil) - assert.Check(t, is.Equal(*(r.MemorySwappiness), int64(23))) -} - func TestToServiceNetwork(t *testing.T) { nws := []network.Inspect{ { diff --git a/cli/compose/convert/service.go b/cli/compose/convert/service.go index ee14f088df..5fbc289d83 100644 --- a/cli/compose/convert/service.go +++ b/cli/compose/convert/service.go @@ -560,10 +560,6 @@ func convertResources(source composetypes.Resources) (*swarm.ResourceRequirement GenericResources: generic, } } - // These fields are themselves pointers -- we can simply assign, no need to - // nil-check them. Nil is nil. - resources.SwapBytes = source.MemswapLimit - resources.MemorySwappiness = source.MemSwappiness return resources, nil } diff --git a/cli/compose/convert/service_test.go b/cli/compose/convert/service_test.go index 5ce1690401..b5999fe6ea 100644 --- a/cli/compose/convert/service_test.go +++ b/cli/compose/convert/service_test.go @@ -81,9 +81,6 @@ func TestConvertExtraHosts(t *testing.T) { } func TestConvertResourcesFull(t *testing.T) { - // create some variables so we can get pointers - memswap := int64(72090) - swappiness := int64(27) source := composetypes.Resources{ Limits: &composetypes.ResourceLimit{ NanoCPUs: "0.003", @@ -93,8 +90,6 @@ func TestConvertResourcesFull(t *testing.T) { NanoCPUs: "0.002", MemoryBytes: composetypes.UnitBytes(200000000), }, - MemswapLimit: &memswap, - MemSwappiness: &swappiness, } resources, err := convertResources(source) assert.NilError(t, err) @@ -108,8 +103,6 @@ func TestConvertResourcesFull(t *testing.T) { NanoCPUs: 2000000, MemoryBytes: 200000000, }, - SwapBytes: &memswap, - MemorySwappiness: &swappiness, } assert.Check(t, is.DeepEqual(expected, resources)) } diff --git a/cli/compose/loader/full-example.yml b/cli/compose/loader/full-example.yml index 0a008fe5c7..d353b52846 100644 --- a/cli/compose/loader/full-example.yml +++ b/cli/compose/loader/full-example.yml @@ -79,8 +79,6 @@ services: - discrete_resource_spec: kind: 'ssd' value: 1 - memswap_limit: 86000 - mem_swappiness: 27 restart_policy: condition: on-failure delay: 5s diff --git a/cli/compose/loader/full-struct_test.go b/cli/compose/loader/full-struct_test.go index 060a6d40bf..36de0c3a40 100644 --- a/cli/compose/loader/full-struct_test.go +++ b/cli/compose/loader/full-struct_test.go @@ -108,8 +108,6 @@ func services(workingDir, homeDir string) []types.ServiceConfig { }, }, }, - MemswapLimit: int64Ptr(86000), - MemSwappiness: int64Ptr(27), }, RestartPolicy: &types.RestartPolicy{ Condition: "on-failure", diff --git a/cli/compose/loader/loader_test.go b/cli/compose/loader/loader_test.go index dabf50a38f..0ecdcf1e02 100644 --- a/cli/compose/loader/loader_test.go +++ b/cli/compose/loader/loader_test.go @@ -970,10 +970,6 @@ func uint32Ptr(value uint32) *uint32 { return &value } -func int64Ptr(value int64) *int64 { - return &value -} - func TestFullExample(t *testing.T) { skip.If(t, runtime.GOOS == "windows", "FIXME: substitutes platform-specific HOME-dirs and requires platform-specific golden files; see https://github.com/docker/cli/pull/4610") diff --git a/cli/compose/loader/testdata/full-example.json.golden b/cli/compose/loader/testdata/full-example.json.golden index 4f0a08d970..891469df31 100644 --- a/cli/compose/loader/testdata/full-example.json.golden +++ b/cli/compose/loader/testdata/full-example.json.golden @@ -181,9 +181,7 @@ } } ] - }, - "memswap_limit": 86000, - "mem_swappiness": 27 + } }, "restart_policy": { "condition": "on-failure", diff --git a/cli/compose/loader/testdata/full-example.yaml.golden b/cli/compose/loader/testdata/full-example.yaml.golden index a69b7d2f31..80b95abec5 100644 --- a/cli/compose/loader/testdata/full-example.yaml.golden +++ b/cli/compose/loader/testdata/full-example.yaml.golden @@ -73,8 +73,6 @@ services: - discrete_resource_spec: kind: ssd value: 1 - memswap_limit: 86000 - mem_swappiness: 27 restart_policy: condition: on-failure delay: 5s diff --git a/cli/compose/schema/data/config_schema_v3.14.json b/cli/compose/schema/data/config_schema_v3.14.json index 5189f8d018..8daa8892d6 100644 --- a/cli/compose/schema/data/config_schema_v3.14.json +++ b/cli/compose/schema/data/config_schema_v3.14.json @@ -1,12 +1,12 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "id": "config_schema_v3.14.json", + "id": "config_schema_v3.13.json", "type": "object", "properties": { "version": { "type": "string", - "default": "3.14" + "default": "3.13" }, "services": { @@ -413,12 +413,6 @@ "generic_resources": {"$ref": "#/definitions/generic_resources"} }, "additionalProperties": false - }, - "memswap_limit": { - "type": "integer" - }, - "mem_swappiness": { - "type": "integer" } }, "additionalProperties": false diff --git a/cli/compose/types/types.go b/cli/compose/types/types.go index a55eec1d2a..fdc0eb44fe 100644 --- a/cli/compose/types/types.go +++ b/cli/compose/types/types.go @@ -307,10 +307,8 @@ type UpdateConfig struct { // Resources the resource limits and reservations type Resources struct { - Limits *ResourceLimit `yaml:",omitempty" json:"limits,omitempty"` - Reservations *Resource `yaml:",omitempty" json:"reservations,omitempty"` - MemswapLimit *int64 `mapstructure:"memswap_limit" yaml:"memswap_limit,omitempty" json:"memswap_limit,omitempty"` - MemSwappiness *int64 `mapstructure:"mem_swappiness" yaml:"mem_swappiness,omitempty" json:"mem_swappiness,omitempty"` + Limits *ResourceLimit `yaml:",omitempty" json:"limits,omitempty"` + Reservations *Resource `yaml:",omitempty" json:"reservations,omitempty"` } // ResourceLimit is a resource to be limited diff --git a/docs/reference/commandline/service_create.md b/docs/reference/commandline/service_create.md index fb550533c4..2fd9d6d9d0 100644 --- a/docs/reference/commandline/service_create.md +++ b/docs/reference/commandline/service_create.md @@ -40,8 +40,6 @@ Create a new service | `--log-driver` | `string` | | Logging driver for service | | `--log-opt` | `list` | | Logging driver options | | `--max-concurrent` | `uint` | | Number of job tasks to run concurrently (default equal to --replicas) | -| `--memory-swap` | `bytes` | `0` | Swap Bytes (-1 for unlimited) | -| `--memory-swappiness` | `int64` | `-1` | Tune memory swappiness (0-100), -1 to reset to default | | `--mode` | `string` | `replicated` | Service mode (`replicated`, `global`, `replicated-job`, `global-job`) | | [`--mount`](#mount) | `mount` | | Attach a filesystem mount to the service | | `--name` | `string` | | Service name | diff --git a/docs/reference/commandline/service_update.md b/docs/reference/commandline/service_update.md index 64f81b07e8..f3564bcc1f 100644 --- a/docs/reference/commandline/service_update.md +++ b/docs/reference/commandline/service_update.md @@ -53,8 +53,6 @@ Update a service | `--log-driver` | `string` | | Logging driver for service | | `--log-opt` | `list` | | Logging driver options | | `--max-concurrent` | `uint` | | Number of job tasks to run concurrently (default equal to --replicas) | -| `--memory-swap` | `bytes` | `0` | Swap Bytes (-1 for unlimited) | -| `--memory-swappiness` | `int64` | `-1` | Tune memory swappiness (0-100), -1 to reset to default | | [`--mount-add`](#mount-add) | `mount` | | Add or update a mount on a service | | `--mount-rm` | `list` | | Remove a mount by its target path | | [`--network-add`](#network-add) | `network` | | Add a network |