1
0
mirror of https://github.com/docker/cli.git synced 2026-01-26 15:41:42 +03:00

Revert "Add memory swap to swarm"

This reverts commit 71828f2792.

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
This commit is contained in:
Paweł Gronowski
2025-11-10 17:43:59 +01:00
parent ee244f2f44
commit e0716b571f
13 changed files with 11 additions and 98 deletions

View File

@@ -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 {

View File

@@ -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{
{

View File

@@ -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
}

View File

@@ -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))
}

View File

@@ -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

View File

@@ -108,8 +108,6 @@ func services(workingDir, homeDir string) []types.ServiceConfig {
},
},
},
MemswapLimit: int64Ptr(86000),
MemSwappiness: int64Ptr(27),
},
RestartPolicy: &types.RestartPolicy{
Condition: "on-failure",

View File

@@ -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")

View File

@@ -181,9 +181,7 @@
}
}
]
},
"memswap_limit": 86000,
"mem_swappiness": 27
}
},
"restart_policy": {
"condition": "on-failure",

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 |

View File

@@ -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 |