@@ -36,6 +36,7 @@ import (
36
36
metadata "github.com/checkpoint-restore/checkpointctl/lib"
37
37
"github.com/containers/storage/pkg/archive"
38
38
"github.com/go-logr/logr"
39
+ "k8s.io/apimachinery/pkg/api/resource"
39
40
"k8s.io/apimachinery/pkg/runtime"
40
41
kubelettypes "k8s.io/kubelet/pkg/types"
41
42
ctrl "sigs.k8s.io/controller-runtime"
@@ -54,24 +55,18 @@ const (
54
55
BySize
55
56
)
56
57
57
- // Constants for unit conversion
58
- const (
59
- KB = 1024
60
- MB = 1024 * KB
61
- )
62
-
63
58
var (
64
59
GarbageCollector garbageCollector
65
60
policyMutex sync.RWMutex
66
61
checkpointDirectory string = "/var/lib/kubelet/checkpoints"
67
62
quit chan bool
68
- maxCheckpointsPerContainer int = 10
69
- maxCheckpointsPerPod int = 20
70
- maxCheckpointsPerNamespace int = 30
71
- maxCheckpointSize int = math . MaxInt32
72
- maxTotalSizePerPod int = math . MaxInt32
73
- maxTotalSizePerContainer int = math . MaxInt32
74
- maxTotalSizePerNamespace int = math . MaxInt32
63
+ maxCheckpointsPerContainer int = 10
64
+ maxCheckpointsPerPod int = 20
65
+ maxCheckpointsPerNamespace int = 30
66
+ maxCheckpointSize resource. Quantity = resource . MustParse ( "1Ei" )
67
+ maxTotalSizePerPod resource. Quantity = resource . MustParse ( "1Ei" )
68
+ maxTotalSizePerContainer resource. Quantity = resource . MustParse ( "1Ei" )
69
+ maxTotalSizePerNamespace resource. Quantity = resource . MustParse ( "1Ei" )
75
70
containerPolicies []criuorgv1.ContainerPolicySpec
76
71
podPolicies []criuorgv1.PodPolicySpec
77
72
namespacePolicies []criuorgv1.NamespacePolicySpec
@@ -124,10 +119,10 @@ func resetAllPoliciesToDefault(log logr.Logger) {
124
119
maxCheckpointsPerContainer = 10
125
120
maxCheckpointsPerPod = 20
126
121
maxCheckpointsPerNamespace = 30
127
- maxCheckpointSize = math . MaxInt32
128
- maxTotalSizePerContainer = math . MaxInt32
129
- maxTotalSizePerPod = math . MaxInt32
130
- maxTotalSizePerNamespace = math . MaxInt32
122
+ maxCheckpointSize = resource . MustParse ( "1Ei" )
123
+ maxTotalSizePerContainer = resource . MustParse ( "1Ei" )
124
+ maxTotalSizePerPod = resource . MustParse ( "1Ei" )
125
+ maxTotalSizePerNamespace = resource . MustParse ( "1Ei" )
131
126
132
127
containerPolicies = nil
133
128
podPolicies = nil
@@ -155,24 +150,24 @@ func (r *CheckpointRestoreOperatorReconciler) handleGlobalPolicies(log logr.Logg
155
150
log .Info ("Changed MaxCheckpointsPerNamespace" , "maxCheckpointsPerNamespace" , maxCheckpointsPerNamespace )
156
151
}
157
152
158
- if globalPolicies .MaxCheckpointSize != nil && * globalPolicies . MaxCheckpointSize >= 0 {
159
- maxCheckpointSize = * globalPolicies .MaxCheckpointSize * MB
160
- log .Info ("Changed MaxCheckpointSize" , "maxCheckpointSize" , maxCheckpointSize )
153
+ if globalPolicies .MaxCheckpointSize != nil {
154
+ maxCheckpointSize = * globalPolicies .MaxCheckpointSize
155
+ log .Info ("Changed MaxCheckpointSize" , "maxCheckpointSize" , maxCheckpointSize . String () )
161
156
}
162
157
163
- if globalPolicies .MaxTotalSizePerNamespace != nil && * globalPolicies . MaxTotalSizePerNamespace >= 0 {
164
- maxTotalSizePerNamespace = * globalPolicies .MaxTotalSizePerNamespace * MB
165
- log .Info ("Changed MaxTotalSizePerNamespace" , "maxTotalSizePerNamespace" , maxTotalSizePerNamespace )
158
+ if globalPolicies .MaxTotalSizePerNamespace != nil {
159
+ maxTotalSizePerNamespace = * globalPolicies .MaxTotalSizePerNamespace
160
+ log .Info ("Changed MaxTotalSizePerNamespace" , "maxTotalSizePerNamespace" , maxTotalSizePerNamespace . String () )
166
161
}
167
162
168
- if globalPolicies .MaxTotalSizePerPod != nil && * globalPolicies . MaxTotalSizePerPod >= 0 {
169
- maxTotalSizePerPod = * globalPolicies .MaxTotalSizePerPod * MB
170
- log .Info ("Changed MaxTotalSizePerPod" , "maxTotalSizePerPod" , maxTotalSizePerPod )
163
+ if globalPolicies .MaxTotalSizePerPod != nil {
164
+ maxTotalSizePerPod = * globalPolicies .MaxTotalSizePerPod
165
+ log .Info ("Changed MaxTotalSizePerPod" , "maxTotalSizePerPod" , maxTotalSizePerPod . String () )
171
166
}
172
167
173
- if globalPolicies .MaxTotalSizePerContainer != nil && * globalPolicies . MaxTotalSizePerContainer >= 0 {
174
- maxTotalSizePerContainer = * globalPolicies .MaxTotalSizePerContainer * MB
175
- log .Info ("Changed MaxTotalSizePerContainer" , "maxTotalSizePerContainer" , maxTotalSizePerContainer )
168
+ if globalPolicies .MaxTotalSizePerContainer != nil {
169
+ maxTotalSizePerContainer = * globalPolicies .MaxTotalSizePerContainer
170
+ log .Info ("Changed MaxTotalSizePerContainer" , "maxTotalSizePerContainer" , maxTotalSizePerContainer . String () )
176
171
}
177
172
}
178
173
@@ -332,38 +327,47 @@ func getCheckpointArchiveInformation(log logr.Logger, checkpointPath string) (*c
332
327
333
328
type Policy struct {
334
329
MaxCheckpoints int
335
- MaxCheckpointSize int
336
- MaxTotalSize int
330
+ MaxCheckpointSize resource. Quantity
331
+ MaxTotalSize resource. Quantity
337
332
}
338
333
339
334
func applyPolicies (log logr.Logger , details * checkpointDetails ) {
340
335
policyMutex .Lock ()
341
336
defer policyMutex .Unlock ()
342
337
343
- toInfinity := func (value * int ) int {
338
+ // Function to handle default "infinity" value for count-based policies
339
+ toInfinityCount := func (value * int ) int {
344
340
if value == nil {
345
341
return math .MaxInt32
346
342
}
347
343
return * value
348
344
}
349
345
346
+ // Function to handle default "infinity" value for size-based policies
347
+ toInfinitySize := func (value * resource.Quantity ) resource.Quantity {
348
+ if value == nil {
349
+ return resource .MustParse ("1Ei" )
350
+ }
351
+ return * value
352
+ }
353
+
350
354
if policy := findContainerPolicy (details ); policy != nil {
351
355
handleCheckpointsForLevel (log , details , "container" , Policy {
352
- MaxCheckpoints : toInfinity (policy .MaxCheckpoints ),
353
- MaxCheckpointSize : toInfinity (policy .MaxCheckpointSize ) * MB ,
354
- MaxTotalSize : toInfinity (policy .MaxTotalSize ) * MB ,
356
+ MaxCheckpoints : toInfinityCount (policy .MaxCheckpoints ),
357
+ MaxCheckpointSize : toInfinitySize (policy .MaxCheckpointSize ),
358
+ MaxTotalSize : toInfinitySize (policy .MaxTotalSize ),
355
359
})
356
360
} else if policy := findPodPolicy (details ); policy != nil {
357
361
handleCheckpointsForLevel (log , details , "pod" , Policy {
358
- MaxCheckpoints : toInfinity (policy .MaxCheckpoints ),
359
- MaxCheckpointSize : toInfinity (policy .MaxCheckpointSize ) * MB ,
360
- MaxTotalSize : toInfinity (policy .MaxTotalSize ) * MB ,
362
+ MaxCheckpoints : toInfinityCount (policy .MaxCheckpoints ),
363
+ MaxCheckpointSize : toInfinitySize (policy .MaxCheckpointSize ),
364
+ MaxTotalSize : toInfinitySize (policy .MaxTotalSize ),
361
365
})
362
366
} else if policy := findNamespacePolicy (details ); policy != nil {
363
367
handleCheckpointsForLevel (log , details , "namespace" , Policy {
364
- MaxCheckpoints : toInfinity (policy .MaxCheckpoints ),
365
- MaxCheckpointSize : toInfinity (policy .MaxCheckpointSize ) * MB ,
366
- MaxTotalSize : toInfinity (policy .MaxTotalSize ) * MB ,
368
+ MaxCheckpoints : toInfinityCount (policy .MaxCheckpoints ),
369
+ MaxCheckpointSize : toInfinitySize (policy .MaxCheckpointSize ),
370
+ MaxTotalSize : toInfinitySize (policy .MaxTotalSize ),
367
371
})
368
372
} else {
369
373
// Apply global policies if no specific policy found
@@ -466,11 +470,11 @@ func handleCheckpointsForLevel(log logr.Logger, details *checkpointDetails, leve
466
470
log .Info ("MaxCheckpoints is less than or equal to 0, skipping checkpoint handling" , "level" , level , "policy.MaxCheckpoints" , policy .MaxCheckpoints )
467
471
return
468
472
}
469
- if policy .MaxCheckpointSize <= 0 {
473
+ if policy .MaxCheckpointSize . Value () <= 0 {
470
474
log .Info ("MaxCheckpointSize is less than or equal to 0, skipping checkpoint handling" , "level" , level , "policy.MaxCheckpointSize" , policy .MaxCheckpointSize )
471
475
return
472
476
}
473
- if policy .MaxTotalSize <= 0 {
477
+ if policy .MaxTotalSize . Value () <= 0 {
474
478
log .Info ("MaxTotalSize is less than or equal to 0, skipping checkpoint handling" , "level" , level , "policy.MaxTotalSize" , policy .MaxTotalSize )
475
479
return
476
480
}
@@ -529,7 +533,7 @@ func handleCheckpointsForLevel(log logr.Logger, details *checkpointDetails, leve
529
533
}
530
534
531
535
checkpointArchivesCounter := len (filteredArchives )
532
- totalSize := int64 ( 0 )
536
+ totalSize := resource . NewQuantity ( 0 , resource . BinarySI )
533
537
archiveSizes := make (map [string ]int64 )
534
538
archivesToDelete := make (map [int64 ]string )
535
539
@@ -540,16 +544,19 @@ func handleCheckpointsForLevel(log logr.Logger, details *checkpointDetails, leve
540
544
continue
541
545
}
542
546
543
- log .Info ("Checkpoint archive details" , "archive" , c , "size" , fi .Size (), "maxCheckpointSize" , policy .MaxCheckpointSize )
544
- if policy .MaxCheckpointSize > 0 && fi .Size () > int64 (policy .MaxCheckpointSize ) {
545
- log .Info ("Deleting checkpoint archive due to exceeding MaxCheckpointSize" , "archive" , c , "size" , fi .Size (), "maxCheckpointSize" , policy .MaxCheckpointSize )
547
+ currentSize := resource .NewQuantity (fi .Size (), resource .BinarySI )
548
+ log .Info ("Checkpoint archive details" , "archive" , c , "size" , currentSize .String (), "maxCheckpointSize" , policy .MaxCheckpointSize .String ())
549
+
550
+ if policy .MaxCheckpointSize .Cmp (* currentSize ) < 0 {
551
+ log .Info ("Deleting checkpoint archive due to exceeding MaxCheckpointSize" , "archive" , c , "size" , currentSize .String (), "maxCheckpointSize" , policy .MaxCheckpointSize .String ())
546
552
err := os .Remove (c )
547
553
if err != nil {
548
554
log .Error (err , "failed to remove checkpoint archive" , "archive" , c )
549
555
}
550
556
continue
551
557
}
552
- totalSize += fi .Size ()
558
+
559
+ totalSize .Add (* currentSize )
553
560
archiveSizes [c ] = fi .Size ()
554
561
archivesToDelete [fi .ModTime ().UnixMicro ()] = c
555
562
}
@@ -558,7 +565,7 @@ func handleCheckpointsForLevel(log logr.Logger, details *checkpointDetails, leve
558
565
if policy .MaxCheckpoints > 0 && checkpointArchivesCounter > policy .MaxCheckpoints {
559
566
excessCount := int64 (checkpointArchivesCounter - policy .MaxCheckpoints )
560
567
log .Info ("Checkpoint count exceeds limit" , "checkpointArchivesCounter" , checkpointArchivesCounter , "maxCheckpoints" , policy .MaxCheckpoints , "excessCount" , excessCount )
561
- toDelete := selectArchivesToDelete (log , checkpointArchives , archiveSizes , excessCount , ByCount )
568
+ toDelete := selectArchivesToDelete (log , filteredArchives , archiveSizes , excessCount , ByCount )
562
569
for _ , archive := range toDelete {
563
570
log .Info ("Deleting checkpoint archive due to excess count" , "archive" , archive )
564
571
err := os .Remove (archive )
@@ -573,19 +580,21 @@ func handleCheckpointsForLevel(log logr.Logger, details *checkpointDetails, leve
573
580
}
574
581
575
582
// Handle total size against maxTotalSize
576
- if policy .MaxTotalSize > 0 && totalSize > int64 (policy .MaxTotalSize ) {
577
- excessSize := totalSize - int64 (policy .MaxTotalSize )
578
- log .Info ("Total size of checkpoint archives exceeds limit" , "totalSize" , totalSize , "maxTotalSize" , policy .MaxTotalSize , "excessSize" , excessSize )
579
- toDelete := selectArchivesToDelete (log , filteredArchives , archiveSizes , excessSize , BySize )
583
+ if policy .MaxTotalSize .Cmp (* totalSize ) < 0 {
584
+ excessSize := totalSize .DeepCopy ()
585
+ excessSize .Sub (policy .MaxTotalSize )
586
+ log .Info ("Total size of checkpoint archives exceeds limit" , "totalSize" , totalSize .String (), "maxTotalSize" , policy .MaxTotalSize .String (), "excessSize" , excessSize .String ())
587
+ toDelete := selectArchivesToDelete (log , filteredArchives , archiveSizes , excessSize .Value (), BySize )
580
588
for _ , archive := range toDelete {
581
589
log .Info ("Deleting checkpoint archive due to excess size" , "archive" , archive )
582
590
err := os .Remove (archive )
583
591
if err != nil {
584
- log .Error (err , "Removal of checkpoint archive failed" , "archive" , archive )
592
+ log .Error (err , "removal of checkpoint archive failed" , "archive" , archive )
585
593
}
586
- totalSize -= archiveSizes [archive ]
594
+ currentSize := resource .NewQuantity (archiveSizes [archive ], resource .BinarySI )
595
+ totalSize .Sub (* currentSize )
587
596
delete (archiveSizes , archive )
588
- if totalSize <= int64 ( policy .MaxTotalSize ) {
597
+ if policy .MaxTotalSize . Cmp ( * totalSize ) >= 0 {
589
598
break
590
599
}
591
600
}
0 commit comments