@@ -55,15 +55,18 @@ type resizeController struct {
55
55
kubeClient kubernetes.Interface
56
56
claimQueue workqueue.RateLimitingInterface
57
57
eventRecorder record.EventRecorder
58
- pvLister corelisters.PersistentVolumeLister
59
58
pvSynced cache.InformerSynced
60
- pvcLister corelisters.PersistentVolumeClaimLister
61
59
pvcSynced cache.InformerSynced
62
60
63
61
usedPVCs * inUsePVCStore
64
62
65
- podLister corelisters.PodLister
66
- podListerSynced cache.InformerSynced
63
+ podLister corelisters.PodLister
64
+ podListerSynced cache.InformerSynced
65
+
66
+ // a Cache to store PersistentVolume objects
67
+ volumes cache.Store
68
+ // a cache to store PersistentVolumeClaim objects
69
+ claims cache.Store
67
70
handleVolumeInUseError bool
68
71
}
69
72
@@ -87,15 +90,17 @@ func NewResizeController(
87
90
claimQueue := workqueue .NewNamedRateLimitingQueue (
88
91
pvcRateLimiter , fmt .Sprintf ("%s-pvc" , name ))
89
92
93
+ pvcInformer .Informer ().GetStore ().Get ("foo" )
94
+
90
95
ctrl := & resizeController {
91
96
name : name ,
92
97
resizer : resizer ,
93
98
kubeClient : kubeClient ,
94
- pvLister : pvInformer .Lister (),
95
99
pvSynced : pvInformer .Informer ().HasSynced ,
96
- pvcLister : pvcInformer .Lister (),
97
100
pvcSynced : pvcInformer .Informer ().HasSynced ,
98
101
claimQueue : claimQueue ,
102
+ volumes : pvInformer .Informer ().GetStore (),
103
+ claims : pvcInformer .Informer ().GetStore (),
99
104
eventRecorder : eventRecorder ,
100
105
usedPVCs : newUsedPVCStore (),
101
106
handleVolumeInUseError : handleVolumeInUseError ,
@@ -282,22 +287,30 @@ func (ctrl *resizeController) syncPVC(key string) error {
282
287
return err
283
288
}
284
289
285
- pvc , err := ctrl .pvcLister . PersistentVolumeClaims ( namespace ). Get ( name )
290
+ pvcObject , exists , err := ctrl .claims . GetByKey ( key )
286
291
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
- }
292
+
291
293
klog .Errorf ("Get PVC %s/%s failed: %v" , namespace , name , err )
292
294
return err
293
295
}
294
296
297
+ if ! exists {
298
+ klog .V (3 ).Infof ("PVC %s/%s is deleted or does not exist" , namespace , name )
299
+ return nil
300
+ }
301
+
302
+ pvc , ok := pvcObject .(* v1.PersistentVolumeClaim )
303
+ if ! ok {
304
+ klog .Errorf ("expected PVC got: %v" , pvcObject )
305
+ return fmt .Errorf ("expected PVC got: %v" , pvcObject )
306
+ }
307
+
295
308
if ! ctrl .pvcNeedResize (pvc ) {
296
309
klog .V (4 ).Infof ("No need to resize PVC %q" , util .PVCKey (pvc ))
297
310
return nil
298
311
}
299
312
300
- pv , err := ctrl .pvLister . Get (pvc .Spec .VolumeName )
313
+ volumeObj , exists , err := ctrl .volumes . GetByKey (pvc .Spec .VolumeName )
301
314
if err != nil {
302
315
if k8serrors .IsNotFound (err ) {
303
316
klog .V (3 ).Infof ("PV %s is deleted, no need to process it" , pvc .Spec .VolumeName )
@@ -307,6 +320,16 @@ func (ctrl *resizeController) syncPVC(key string) error {
307
320
return err
308
321
}
309
322
323
+ if ! exists {
324
+ return fmt .Errorf ("PV %q bound to PVC %s not found" , pvc .Spec .VolumeName , util .PVCKey (pvc ))
325
+ }
326
+
327
+ pv , ok := volumeObj .(* v1.PersistentVolume )
328
+ if ! ok {
329
+ klog .Errorf ("expected volume but got %+v" , volumeObj )
330
+ return fmt .Errorf ("expected volume but got %+v" , volumeObj )
331
+ }
332
+
310
333
if ! ctrl .pvNeedResize (pvc , pv ) {
311
334
klog .V (4 ).Infof ("No need to resize PV %q" , pv .Name )
312
335
return nil
@@ -375,6 +398,12 @@ func (ctrl *resizeController) resizePVC(pvc *v1.PersistentVolumeClaim, pv *v1.Pe
375
398
pvc = updatedPVC
376
399
}
377
400
401
+ err := ctrl .claims .Update (pvc )
402
+ if err != nil {
403
+ klog .Errorf ("error updating PVC %s in cache: %v" , util .PVCKey (pvc ), err )
404
+ return err
405
+ }
406
+
378
407
// if pvc previously failed to expand because it can't be expanded when in-use
379
408
// we must not try expansion here
380
409
if ctrl .usedPVCs .hasInUseErrors (pvc ) && ctrl .usedPVCs .checkForUse (pvc ) {
@@ -388,10 +417,10 @@ func (ctrl *resizeController) resizePVC(pvc *v1.PersistentVolumeClaim, pv *v1.Pe
388
417
ctrl .eventRecorder .Event (pvc , v1 .EventTypeNormal , util .VolumeResizing ,
389
418
fmt .Sprintf ("External resizer is resizing volume %s" , pv .Name ))
390
419
391
- err := func () error {
420
+ updatedPVC , err := func () ( * v1. PersistentVolumeClaim , error ) {
392
421
newSize , fsResizeRequired , err := ctrl .resizeVolume (pvc , pv )
393
422
if err != nil {
394
- return err
423
+ return pvc , err
395
424
}
396
425
397
426
if fsResizeRequired {
@@ -407,7 +436,7 @@ func (ctrl *resizeController) resizePVC(pvc *v1.PersistentVolumeClaim, pv *v1.Pe
407
436
ctrl .eventRecorder .Eventf (pvc , v1 .EventTypeWarning , util .VolumeResizeFailed , err .Error ())
408
437
}
409
438
410
- return err
439
+ return ctrl . claims . Update ( updatedPVC )
411
440
}
412
441
413
442
// resizeVolume resize the volume to request size, and update PV's capacity if succeeded.
@@ -435,11 +464,17 @@ func (ctrl *resizeController) resizeVolume(
435
464
return newSize , fsResizeRequired , fmt .Errorf ("resize volume %s failed: %v" , pv .Name , err )
436
465
}
437
466
klog .V (4 ).Infof ("Resize volume succeeded for volume %q, start to update PV's capacity" , pv .Name )
467
+ updatedPV , err := util .UpdatePVCapacity (pv , newSize , ctrl .kubeClient )
438
468
439
- if err := util . UpdatePVCapacity ( pv , newSize , ctrl . kubeClient ); err != nil {
469
+ if err != nil {
440
470
klog .Errorf ("Update capacity of PV %q to %s failed: %v" , pv .Name , newSize .String (), err )
441
471
return newSize , fsResizeRequired , err
442
472
}
473
+ err = ctrl .volumes .Update (updatedPV )
474
+ if err != nil {
475
+ klog .Errorf ("error updating PV %s: %v" , updatedPV .Name , err )
476
+ return newSize , fsResizeRequired , err
477
+ }
443
478
klog .V (4 ).Infof ("Update capacity of PV %q to %s succeeded" , pv .Name , newSize .String ())
444
479
445
480
return newSize , fsResizeRequired , nil
@@ -460,22 +495,23 @@ func (ctrl *resizeController) markPVCResizeInProgress(pvc *v1.PersistentVolumeCl
460
495
461
496
func (ctrl * resizeController ) markPVCResizeFinished (
462
497
pvc * v1.PersistentVolumeClaim ,
463
- newSize resource.Quantity ) error {
498
+ newSize resource.Quantity ) ( * v1. PersistentVolumeClaim , error ) {
464
499
newPVC := pvc .DeepCopy ()
465
500
newPVC .Status .Capacity [v1 .ResourceStorage ] = newSize
466
501
newPVC .Status .Conditions = util .MergeResizeConditionsOfPVC (pvc .Status .Conditions , []v1.PersistentVolumeClaimCondition {})
467
- if _ , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient ); err != nil {
502
+ updatedPVC , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient )
503
+ if err != nil {
468
504
klog .Errorf ("Mark PVC %q as resize finished failed: %v" , util .PVCKey (pvc ), err )
469
- return err
505
+ return nil , err
470
506
}
471
507
472
508
klog .V (4 ).Infof ("Resize PVC %q finished" , util .PVCKey (pvc ))
473
509
ctrl .eventRecorder .Eventf (pvc , v1 .EventTypeNormal , util .VolumeResizeSuccess , "Resize volume succeeded" )
474
510
475
- return nil
511
+ return updatedPVC , nil
476
512
}
477
513
478
- func (ctrl * resizeController ) markPVCAsFSResizeRequired (pvc * v1.PersistentVolumeClaim ) error {
514
+ func (ctrl * resizeController ) markPVCAsFSResizeRequired (pvc * v1.PersistentVolumeClaim ) ( * v1. PersistentVolumeClaim , error ) {
479
515
pvcCondition := v1.PersistentVolumeClaimCondition {
480
516
Type : v1 .PersistentVolumeClaimFileSystemResizePending ,
481
517
Status : v1 .ConditionTrue ,
@@ -486,15 +522,18 @@ func (ctrl *resizeController) markPVCAsFSResizeRequired(pvc *v1.PersistentVolume
486
522
newPVC .Status .Conditions = util .MergeResizeConditionsOfPVC (newPVC .Status .Conditions ,
487
523
[]v1.PersistentVolumeClaimCondition {pvcCondition })
488
524
489
- if _ , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient ); err != nil {
525
+ updatedPVC , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient )
526
+
527
+ if err != nil {
490
528
klog .Errorf ("Mark PVC %q as file system resize required failed: %v" , util .PVCKey (pvc ), err )
491
- return err
529
+ return nil , err
492
530
}
531
+
493
532
klog .V (4 ).Infof ("Mark PVC %q as file system resize required" , util .PVCKey (pvc ))
494
533
ctrl .eventRecorder .Eventf (pvc , v1 .EventTypeNormal ,
495
534
util .FileSystemResizeRequired , "Require file system resize of volume on node" )
496
535
497
- return nil
536
+ return updatedPVC , nil
498
537
}
499
538
500
539
func parsePod (obj interface {}) * v1.Pod {
0 commit comments