Skip to content

Commit 4f6b17a

Browse files
committed
Restore strict overlay limit semantics
1 parent 5309a67 commit 4f6b17a

3 files changed

Lines changed: 45 additions & 4 deletions

File tree

lib/instances/manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ type ImageUsageRecorderSetter interface {
7474

7575
// ResourceLimits contains configurable resource limits for instances
7676
type ResourceLimits struct {
77-
MaxOverlaySize int64 // Maximum overlay disk size in bytes per instance (0 = unlimited)
77+
MaxOverlaySize int64 // Maximum overlay disk size in bytes per instance
7878
MaxVcpusPerInstance int // Maximum vCPUs per instance (0 = unlimited)
7979
MaxMemoryPerInstance int64 // Maximum memory in bytes per instance (0 = unlimited)
8080
NamePatterns []NamedResourceLimit

lib/instances/name_limits.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func (l ResourceLimits) ForName(name string) ResourceLimits {
9797
func validateResourceLimitsForName(name string, limits ResourceLimits, overlaySize int64, vcpus int, totalMemory int64) error {
9898
effective := limits.ForName(name)
9999

100-
if effective.MaxOverlaySize > 0 && overlaySize > effective.MaxOverlaySize {
100+
if overlaySize > effective.MaxOverlaySize {
101101
return fmt.Errorf("overlay size %d exceeds maximum allowed size %d", overlaySize, effective.MaxOverlaySize)
102102
}
103103
if effective.MaxVcpusPerInstance > 0 && vcpus > effective.MaxVcpusPerInstance {

lib/instances/name_limits_test.go

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,14 @@ func TestResourceLimitsForName_FallsBackWhenFieldOmitted(t *testing.T) {
6464
assert.Equal(t, int64(32*1024*1024*1024), resolved.MaxMemoryPerInstance)
6565
}
6666

67-
func TestValidateResourceLimitsForName_ZeroOverrideMeansUnlimited(t *testing.T) {
67+
func TestValidateResourceLimitsForName_ZeroCpuAndMemoryOverrideMeansUnlimited(t *testing.T) {
6868
t.Parallel()
6969

7070
zeroInt := 0
7171
zeroBytes := int64(0)
7272
override, err := NewNamedResourceLimit("^burst-.*", NamedResourceLimitConfig{
7373
MaxVcpusPerInstance: &zeroInt,
7474
MaxMemoryPerInstance: &zeroBytes,
75-
MaxOverlaySize: &zeroBytes,
7675
})
7776
require.NoError(t, err)
7877

@@ -87,6 +86,27 @@ func TestValidateResourceLimitsForName_ZeroOverrideMeansUnlimited(t *testing.T)
8786
require.NoError(t, err)
8887
}
8988

89+
func TestValidateResourceLimitsForName_ZeroOverlayOverrideRejectsPositiveOverlay(t *testing.T) {
90+
t.Parallel()
91+
92+
zeroBytes := int64(0)
93+
override, err := NewNamedResourceLimit("^burst-.*", NamedResourceLimitConfig{
94+
MaxOverlaySize: &zeroBytes,
95+
})
96+
require.NoError(t, err)
97+
98+
limits := ResourceLimits{
99+
MaxOverlaySize: 5 * 1024 * 1024 * 1024,
100+
MaxVcpusPerInstance: 2,
101+
MaxMemoryPerInstance: 4 * 1024 * 1024 * 1024,
102+
NamePatterns: []NamedResourceLimit{override},
103+
}
104+
105+
err = validateResourceLimitsForName("burst-worker", limits, 1, 2, 4*1024*1024*1024)
106+
require.Error(t, err)
107+
assert.Contains(t, err.Error(), "overlay size 1 exceeds maximum allowed size 0")
108+
}
109+
90110
func TestValidateResourceLimitsForName_RejectsWhenResolvedLimitExceeded(t *testing.T) {
91111
t.Parallel()
92112

@@ -108,6 +128,27 @@ func TestValidateResourceLimitsForName_RejectsWhenResolvedLimitExceeded(t *testi
108128
assert.Contains(t, err.Error(), "vcpus 8 exceeds maximum allowed 4 per instance")
109129
}
110130

131+
func TestValidateResourceLimitsForName_GlobalOverlayLimitAppliesWhenNoPatternMatches(t *testing.T) {
132+
t.Parallel()
133+
134+
four := 4
135+
override, err := NewNamedResourceLimit("^db-.*", NamedResourceLimitConfig{
136+
MaxVcpusPerInstance: &four,
137+
})
138+
require.NoError(t, err)
139+
140+
limits := ResourceLimits{
141+
MaxOverlaySize: 10 * 1024 * 1024 * 1024,
142+
MaxVcpusPerInstance: 16,
143+
MaxMemoryPerInstance: 64 * 1024 * 1024 * 1024,
144+
NamePatterns: []NamedResourceLimit{override},
145+
}
146+
147+
err = validateResourceLimitsForName("cache-primary", limits, 20*1024*1024*1024, 8, 16*1024*1024*1024)
148+
require.Error(t, err)
149+
assert.Contains(t, err.Error(), "overlay size 21474836480 exceeds maximum allowed size 10737418240")
150+
}
151+
111152
func TestValidateProvisionedResourceLimitsForName_RejectsProjectedTotal(t *testing.T) {
112153
t.Parallel()
113154

0 commit comments

Comments
 (0)