@@ -26,7 +26,6 @@ import (
26
26
"google.golang.org/grpc/codes"
27
27
"google.golang.org/grpc/status"
28
28
v1 "k8s.io/api/core/v1"
29
- k8serrors "k8s.io/apimachinery/pkg/api/errors"
30
29
"k8s.io/apimachinery/pkg/api/resource"
31
30
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32
31
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@@ -55,15 +54,18 @@ type resizeController struct {
55
54
kubeClient kubernetes.Interface
56
55
claimQueue workqueue.RateLimitingInterface
57
56
eventRecorder record.EventRecorder
58
- pvLister corelisters.PersistentVolumeLister
59
57
pvSynced cache.InformerSynced
60
- pvcLister corelisters.PersistentVolumeClaimLister
61
58
pvcSynced cache.InformerSynced
62
59
63
60
usedPVCs * inUsePVCStore
64
61
65
- podLister corelisters.PodLister
66
- podListerSynced cache.InformerSynced
62
+ podLister corelisters.PodLister
63
+ podListerSynced cache.InformerSynced
64
+
65
+ // a cache to store PersistentVolume objects
66
+ volumes cache.Store
67
+ // a cache to store PersistentVolumeClaim objects
68
+ claims cache.Store
67
69
handleVolumeInUseError bool
68
70
}
69
71
@@ -91,11 +93,11 @@ func NewResizeController(
91
93
name : name ,
92
94
resizer : resizer ,
93
95
kubeClient : kubeClient ,
94
- pvLister : pvInformer .Lister (),
95
96
pvSynced : pvInformer .Informer ().HasSynced ,
96
- pvcLister : pvcInformer .Lister (),
97
97
pvcSynced : pvcInformer .Informer ().HasSynced ,
98
98
claimQueue : claimQueue ,
99
+ volumes : pvInformer .Informer ().GetStore (),
100
+ claims : pvcInformer .Informer ().GetStore (),
99
101
eventRecorder : eventRecorder ,
100
102
usedPVCs : newUsedPVCStore (),
101
103
handleVolumeInUseError : handleVolumeInUseError ,
@@ -266,6 +268,7 @@ func (ctrl *resizeController) syncPVCs() {
266
268
267
269
if err := ctrl .syncPVC (key .(string )); err != nil {
268
270
// Put PVC back to the queue so that we can retry later.
271
+ klog .Errorf ("Error syncing PVC: %v" , err )
269
272
ctrl .claimQueue .AddRateLimited (key )
270
273
} else {
271
274
ctrl .claimQueue .Forget (key )
@@ -278,33 +281,42 @@ func (ctrl *resizeController) syncPVC(key string) error {
278
281
279
282
namespace , name , err := cache .SplitMetaNamespaceKey (key )
280
283
if err != nil {
281
- klog .Errorf ("Split meta namespace key of pvc %s failed: %v" , key , err )
282
- return err
284
+ return fmt .Errorf ("getting namespace and name from key %s failed: %v" , key , err )
283
285
}
284
286
285
- pvc , err := ctrl .pvcLister . PersistentVolumeClaims ( namespace ). Get ( name )
287
+ pvcObject , exists , err := ctrl .claims . GetByKey ( key )
286
288
if err != nil {
287
- if k8serrors .IsNotFound (err ) {
288
- klog .V (3 ).Infof ("PVC %s/%s is deleted, no need to process it" , namespace , name )
289
- return nil
290
- }
291
- klog .Errorf ("Get PVC %s/%s failed: %v" , namespace , name , err )
292
- return err
289
+ return fmt .Errorf ("getting PVC %s/%s failed: %v" , namespace , name , err )
290
+ }
291
+
292
+ if ! exists {
293
+ klog .V (3 ).Infof ("PVC %s/%s is deleted or does not exist" , namespace , name )
294
+ return nil
295
+ }
296
+
297
+ pvc , ok := pvcObject .(* v1.PersistentVolumeClaim )
298
+ if ! ok {
299
+ return fmt .Errorf ("expected PVC got: %v" , pvcObject )
293
300
}
294
301
295
302
if ! ctrl .pvcNeedResize (pvc ) {
296
303
klog .V (4 ).Infof ("No need to resize PVC %q" , util .PVCKey (pvc ))
297
304
return nil
298
305
}
299
306
300
- pv , err := ctrl .pvLister . Get (pvc .Spec .VolumeName )
307
+ volumeObj , exists , err := ctrl .volumes . GetByKey (pvc .Spec .VolumeName )
301
308
if err != nil {
302
- if k8serrors .IsNotFound (err ) {
303
- klog .V (3 ).Infof ("PV %s is deleted, no need to process it" , pvc .Spec .VolumeName )
304
- return nil
305
- }
306
- klog .Errorf ("Get PV %q of pvc %q failed: %v" , pvc .Spec .VolumeName , util .PVCKey (pvc ), err )
307
- return err
309
+ return fmt .Errorf ("Get PV %q of pvc %q failed: %v" , pvc .Spec .VolumeName , util .PVCKey (pvc ), err )
310
+ }
311
+
312
+ if ! exists {
313
+ klog .Warningf ("PV %q bound to PVC %s not found" , pvc .Spec .VolumeName , util .PVCKey (pvc ))
314
+ return nil
315
+ }
316
+
317
+ pv , ok := volumeObj .(* v1.PersistentVolume )
318
+ if ! ok {
319
+ return fmt .Errorf ("expected volume but got %+v" , volumeObj )
308
320
}
309
321
310
322
if ! ctrl .pvNeedResize (pvc , pv ) {
@@ -375,6 +387,12 @@ func (ctrl *resizeController) resizePVC(pvc *v1.PersistentVolumeClaim, pv *v1.Pe
375
387
pvc = updatedPVC
376
388
}
377
389
390
+ err := ctrl .claims .Update (pvc )
391
+ if err != nil {
392
+ klog .Errorf ("error updating PVC %s in cache: %v" , util .PVCKey (pvc ), err )
393
+ return err
394
+ }
395
+
378
396
// if pvc previously failed to expand because it can't be expanded when in-use
379
397
// we must not try expansion here
380
398
if ctrl .usedPVCs .hasInUseErrors (pvc ) && ctrl .usedPVCs .checkForUse (pvc ) {
@@ -388,10 +406,10 @@ func (ctrl *resizeController) resizePVC(pvc *v1.PersistentVolumeClaim, pv *v1.Pe
388
406
ctrl .eventRecorder .Event (pvc , v1 .EventTypeNormal , util .VolumeResizing ,
389
407
fmt .Sprintf ("External resizer is resizing volume %s" , pv .Name ))
390
408
391
- err := func () error {
409
+ updatedPVC , err := func () ( * v1. PersistentVolumeClaim , error ) {
392
410
newSize , fsResizeRequired , err := ctrl .resizeVolume (pvc , pv )
393
411
if err != nil {
394
- return err
412
+ return pvc , err
395
413
}
396
414
397
415
if fsResizeRequired {
@@ -407,7 +425,7 @@ func (ctrl *resizeController) resizePVC(pvc *v1.PersistentVolumeClaim, pv *v1.Pe
407
425
ctrl .eventRecorder .Eventf (pvc , v1 .EventTypeWarning , util .VolumeResizeFailed , err .Error ())
408
426
}
409
427
410
- return err
428
+ return ctrl . claims . Update ( updatedPVC )
411
429
}
412
430
413
431
// resizeVolume resize the volume to request size, and update PV's capacity if succeeded.
@@ -435,11 +453,17 @@ func (ctrl *resizeController) resizeVolume(
435
453
return newSize , fsResizeRequired , fmt .Errorf ("resize volume %s failed: %v" , pv .Name , err )
436
454
}
437
455
klog .V (4 ).Infof ("Resize volume succeeded for volume %q, start to update PV's capacity" , pv .Name )
456
+ updatedPV , err := util .UpdatePVCapacity (pv , newSize , ctrl .kubeClient )
438
457
439
- if err := util . UpdatePVCapacity ( pv , newSize , ctrl . kubeClient ); err != nil {
458
+ if err != nil {
440
459
klog .Errorf ("Update capacity of PV %q to %s failed: %v" , pv .Name , newSize .String (), err )
441
460
return newSize , fsResizeRequired , err
442
461
}
462
+ err = ctrl .volumes .Update (updatedPV )
463
+ if err != nil {
464
+ klog .Errorf ("error updating PV %s: %v" , updatedPV .Name , err )
465
+ return newSize , fsResizeRequired , err
466
+ }
443
467
klog .V (4 ).Infof ("Update capacity of PV %q to %s succeeded" , pv .Name , newSize .String ())
444
468
445
469
return newSize , fsResizeRequired , nil
@@ -460,22 +484,23 @@ func (ctrl *resizeController) markPVCResizeInProgress(pvc *v1.PersistentVolumeCl
460
484
461
485
func (ctrl * resizeController ) markPVCResizeFinished (
462
486
pvc * v1.PersistentVolumeClaim ,
463
- newSize resource.Quantity ) error {
487
+ newSize resource.Quantity ) ( * v1. PersistentVolumeClaim , error ) {
464
488
newPVC := pvc .DeepCopy ()
465
489
newPVC .Status .Capacity [v1 .ResourceStorage ] = newSize
466
490
newPVC .Status .Conditions = util .MergeResizeConditionsOfPVC (pvc .Status .Conditions , []v1.PersistentVolumeClaimCondition {})
467
- if _ , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient ); err != nil {
491
+ updatedPVC , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient )
492
+ if err != nil {
468
493
klog .Errorf ("Mark PVC %q as resize finished failed: %v" , util .PVCKey (pvc ), err )
469
- return err
494
+ return nil , err
470
495
}
471
496
472
497
klog .V (4 ).Infof ("Resize PVC %q finished" , util .PVCKey (pvc ))
473
498
ctrl .eventRecorder .Eventf (pvc , v1 .EventTypeNormal , util .VolumeResizeSuccess , "Resize volume succeeded" )
474
499
475
- return nil
500
+ return updatedPVC , nil
476
501
}
477
502
478
- func (ctrl * resizeController ) markPVCAsFSResizeRequired (pvc * v1.PersistentVolumeClaim ) error {
503
+ func (ctrl * resizeController ) markPVCAsFSResizeRequired (pvc * v1.PersistentVolumeClaim ) ( * v1. PersistentVolumeClaim , error ) {
479
504
pvcCondition := v1.PersistentVolumeClaimCondition {
480
505
Type : v1 .PersistentVolumeClaimFileSystemResizePending ,
481
506
Status : v1 .ConditionTrue ,
@@ -486,15 +511,18 @@ func (ctrl *resizeController) markPVCAsFSResizeRequired(pvc *v1.PersistentVolume
486
511
newPVC .Status .Conditions = util .MergeResizeConditionsOfPVC (newPVC .Status .Conditions ,
487
512
[]v1.PersistentVolumeClaimCondition {pvcCondition })
488
513
489
- if _ , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient ); err != nil {
514
+ updatedPVC , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient )
515
+
516
+ if err != nil {
490
517
klog .Errorf ("Mark PVC %q as file system resize required failed: %v" , util .PVCKey (pvc ), err )
491
- return err
518
+ return nil , err
492
519
}
520
+
493
521
klog .V (4 ).Infof ("Mark PVC %q as file system resize required" , util .PVCKey (pvc ))
494
522
ctrl .eventRecorder .Eventf (pvc , v1 .EventTypeNormal ,
495
523
util .FileSystemResizeRequired , "Require file system resize of volume on node" )
496
524
497
- return nil
525
+ return updatedPVC , nil
498
526
}
499
527
500
528
func parsePod (obj interface {}) * v1.Pod {
0 commit comments