@@ -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 ) {
@@ -369,8 +381,7 @@ func (ctrl *resizeController) pvNeedResize(pvc *v1.PersistentVolumeClaim, pv *v1
369
381
// 3. Mark pvc as resizing finished(no error, no need to resize fs), need resizing fs or resize failed.
370
382
func (ctrl * resizeController ) resizePVC (pvc * v1.PersistentVolumeClaim , pv * v1.PersistentVolume ) error {
371
383
if updatedPVC , err := ctrl .markPVCResizeInProgress (pvc ); err != nil {
372
- klog .Errorf ("Mark pvc %q as resizing failed: %v" , util .PVCKey (pvc ), err )
373
- return err
384
+ return fmt .Errorf ("marking pvc %q as resizing failed: %v" , util .PVCKey (pvc ), err )
374
385
} else if updatedPVC != nil {
375
386
pvc = updatedPVC
376
387
}
@@ -406,7 +417,6 @@ func (ctrl *resizeController) resizePVC(pvc *v1.PersistentVolumeClaim, pv *v1.Pe
406
417
// Record an event to indicate that resize operation is failed.
407
418
ctrl .eventRecorder .Eventf (pvc , v1 .EventTypeWarning , util .VolumeResizeFailed , err .Error ())
408
419
}
409
-
410
420
return err
411
421
}
412
422
@@ -426,18 +436,17 @@ func (ctrl *resizeController) resizeVolume(
426
436
newSize , fsResizeRequired , err := ctrl .resizer .Resize (pv , requestSize )
427
437
428
438
if err != nil {
429
- klog .Errorf ("Resize volume %q by resizer %q failed: %v" , pv .Name , ctrl .name , err )
430
439
// if this error was a in-use error then it must be tracked so as we don't retry without
431
440
// first verifying if volume is in-use
432
441
if inUseError (err ) {
433
442
ctrl .usedPVCs .addPVCWithInUseError (pvc )
434
443
}
435
- return newSize , fsResizeRequired , fmt .Errorf ("resize volume %s failed: %v" , pv .Name , err )
444
+ return newSize , fsResizeRequired , fmt .Errorf ("resize volume %q by resizer %q failed: %v" , pv .Name , ctrl . name , err )
436
445
}
437
446
klog .V (4 ).Infof ("Resize volume succeeded for volume %q, start to update PV's capacity" , pv .Name )
438
447
439
- if err := util . UpdatePVCapacity (pv , newSize , ctrl . kubeClient ); err != nil {
440
- klog . Errorf ( "Update capacity of PV %q to %s failed: %v" , pv . Name , newSize . String (), err )
448
+ err = ctrl . updatePVCapacity (pv , newSize )
449
+ if err != nil {
441
450
return newSize , fsResizeRequired , err
442
451
}
443
452
klog .V (4 ).Infof ("Update capacity of PV %q to %s succeeded" , pv .Name , newSize .String ())
@@ -455,7 +464,15 @@ func (ctrl *resizeController) markPVCResizeInProgress(pvc *v1.PersistentVolumeCl
455
464
newPVC := pvc .DeepCopy ()
456
465
newPVC .Status .Conditions = util .MergeResizeConditionsOfPVC (newPVC .Status .Conditions ,
457
466
[]v1.PersistentVolumeClaimCondition {progressCondition })
458
- return util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient )
467
+ updatedPVC , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient )
468
+ if err != nil {
469
+ return nil , err
470
+ }
471
+ err = ctrl .claims .Update (updatedPVC )
472
+ if err != nil {
473
+ return nil , fmt .Errorf ("error updating PVC %s in local cache: %v" , util .PVCKey (newPVC ), err )
474
+ }
475
+ return updatedPVC , nil
459
476
}
460
477
461
478
func (ctrl * resizeController ) markPVCResizeFinished (
@@ -464,9 +481,14 @@ func (ctrl *resizeController) markPVCResizeFinished(
464
481
newPVC := pvc .DeepCopy ()
465
482
newPVC .Status .Capacity [v1 .ResourceStorage ] = newSize
466
483
newPVC .Status .Conditions = util .MergeResizeConditionsOfPVC (pvc .Status .Conditions , []v1.PersistentVolumeClaimCondition {})
467
- if _ , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient ); err != nil {
468
- klog .Errorf ("Mark PVC %q as resize finished failed: %v" , util .PVCKey (pvc ), err )
469
- return err
484
+ updatedPVC , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient )
485
+ if err != nil {
486
+ return fmt .Errorf ("Mark PVC %q as resize finished failed: %v" , util .PVCKey (pvc ), err )
487
+ }
488
+
489
+ err = ctrl .claims .Update (updatedPVC )
490
+ if err != nil {
491
+ return fmt .Errorf ("error updating PVC %s in local cache: %v" , util .PVCKey (newPVC ), err )
470
492
}
471
493
472
494
klog .V (4 ).Infof ("Resize PVC %q finished" , util .PVCKey (pvc ))
@@ -475,6 +497,20 @@ func (ctrl *resizeController) markPVCResizeFinished(
475
497
return nil
476
498
}
477
499
500
+ func (ctrl * resizeController ) updatePVCapacity (pv * v1.PersistentVolume , newCapacity resource.Quantity ) error {
501
+ klog .V (4 ).Infof ("Resize volume succeeded for volume %q, start to update PV's capacity" , pv .Name )
502
+ updatedPV , err := util .UpdatePVCapacity (pv , newCapacity , ctrl .kubeClient )
503
+
504
+ if err != nil {
505
+ return fmt .Errorf ("updating capacity of PV %q to %s failed: %v" , pv .Name , newCapacity .String (), err )
506
+ }
507
+ err = ctrl .volumes .Update (updatedPV )
508
+ if err != nil {
509
+ return fmt .Errorf ("error updating PV %s: %v" , updatedPV .Name , err )
510
+ }
511
+ return nil
512
+ }
513
+
478
514
func (ctrl * resizeController ) markPVCAsFSResizeRequired (pvc * v1.PersistentVolumeClaim ) error {
479
515
pvcCondition := v1.PersistentVolumeClaimCondition {
480
516
Type : v1 .PersistentVolumeClaimFileSystemResizePending ,
@@ -486,10 +522,17 @@ 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 {
490
- klog .Errorf ("Mark PVC %q as file system resize required failed: %v" , util .PVCKey (pvc ), err )
491
- return err
525
+ updatedPVC , err := util .PatchPVCStatus (pvc , newPVC , ctrl .kubeClient )
526
+
527
+ if err != nil {
528
+ return fmt .Errorf ("Mark PVC %q as file system resize required failed: %v" , util .PVCKey (pvc ), err )
492
529
}
530
+
531
+ err = ctrl .claims .Update (updatedPVC )
532
+ if err != nil {
533
+ return fmt .Errorf ("error updating pvc %s in local cache: %v" , util .PVCKey (updatedPVC ), err )
534
+ }
535
+
493
536
klog .V (4 ).Infof ("Mark PVC %q as file system resize required" , util .PVCKey (pvc ))
494
537
ctrl .eventRecorder .Eventf (pvc , v1 .EventTypeNormal ,
495
538
util .FileSystemResizeRequired , "Require file system resize of volume on node" )
0 commit comments