Skip to content

Commit 51e0eea

Browse files
committed
Update Error Handling for Volume Functions
The getPVCName(), getRepoPVCNames() and getPGPVCNames() functions now return any errors encountered when obtaining PersistentVolumeClaim (PVC) names. This will ensure errors bubble up to the main reconcile functions as needed (for instance, to requeue in the event that an attempt to List PVCs fails due to a transient error), while also ensuring errors are handled differently that other non-error scenarios (e.g. currently an error when getting a PVC name produces the same result as a missing PVC). Issue: [ch11966]
1 parent beba233 commit 51e0eea

File tree

5 files changed

+71
-26
lines changed

5 files changed

+71
-26
lines changed

internal/controller/postgrescluster/instance.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1026,9 +1026,14 @@ func (r *Reconciler) reconcileInstance(
10261026
spec, instanceCertificates, instanceConfigMap, &instance.Spec.Template)
10271027
}
10281028

1029+
// Get the pgBackRest repo PVC names
1030+
var repoPVCNames map[string]string
1031+
if err == nil {
1032+
repoPVCNames, err = r.getRepoPVCNames(ctx, cluster)
1033+
}
10291034
// Add pgBackRest containers, volumes, etc. to the instance Pod spec
10301035
if err == nil {
1031-
err = addPGBackRestToInstancePodSpec(cluster, &instance.Spec.Template, instance, r.getRepoPVCNames(ctx, cluster))
1036+
err = addPGBackRestToInstancePodSpec(cluster, &instance.Spec.Template, instance, repoPVCNames)
10321037
}
10331038

10341039
// Add pgMonitor resources to the instance Pod spec

internal/controller/postgrescluster/pgbackrest.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -581,8 +581,13 @@ func (r *Reconciler) generateRepoHostIntent(ctx context.Context,
581581
postgresCluster.Spec.Backups.PGBackRest.RepoHost.Dedicated.Resources); err != nil {
582582
return nil, errors.WithStack(err)
583583
}
584+
// Get the pgBackRest repo PVC names
585+
repoPVCNames, err := r.getRepoPVCNames(ctx, postgresCluster)
586+
if err != nil {
587+
return nil, errors.WithStack(err)
588+
}
584589
if err := pgbackrest.AddRepoVolumesToPod(postgresCluster, &repo.Spec.Template,
585-
r.getRepoPVCNames(ctx, postgresCluster), naming.PGBackRestRepoContainerName); err != nil {
590+
repoPVCNames, naming.PGBackRestRepoContainerName); err != nil {
586591
return nil, errors.WithStack(err)
587592
}
588593
// add configs to pod
@@ -623,7 +628,10 @@ func (r *Reconciler) generateRepoVolumeIntent(ctx context.Context,
623628
meta := naming.PGBackRestRepoVolume(postgresCluster, repoName)
624629

625630
// but if there is an existing volume for this PVC, use it
626-
repoPVCNames := r.getRepoPVCNames(ctx, postgresCluster)
631+
repoPVCNames, err := r.getRepoPVCNames(ctx, postgresCluster)
632+
if err != nil {
633+
return nil, errors.WithStack(err)
634+
}
627635
if repoPVCNames[repoName] != "" {
628636
meta = metav1.ObjectMeta{
629637
Name: repoPVCNames[repoName],

internal/controller/postgrescluster/postgres.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,11 @@ func (r *Reconciler) reconcilePostgresDataVolume(
463463
}
464464

465465
var pvc *v1.PersistentVolumeClaim
466-
if existingPVCName := r.getPGPVCNames(ctx, cluster, labelMap); existingPVCName != "" {
466+
existingPVCName, err := r.getPGPVCNames(ctx, cluster, labelMap)
467+
if err != nil {
468+
return nil, errors.WithStack(err)
469+
}
470+
if existingPVCName != "" {
467471
pvc = &corev1.PersistentVolumeClaim{ObjectMeta: metav1.ObjectMeta{
468472
Namespace: cluster.GetNamespace(),
469473
Name: existingPVCName,
@@ -474,7 +478,7 @@ func (r *Reconciler) reconcilePostgresDataVolume(
474478

475479
pvc.SetGroupVersionKind(corev1.SchemeGroupVersion.WithKind("PersistentVolumeClaim"))
476480

477-
err := errors.WithStack(r.setControllerReference(cluster, pvc))
481+
err = errors.WithStack(r.setControllerReference(cluster, pvc))
478482

479483
pvc.Annotations = naming.Merge(
480484
cluster.Spec.Metadata.GetAnnotationsOrNil(),
@@ -515,7 +519,11 @@ func (r *Reconciler) reconcilePostgresWALVolume(
515519
}
516520

517521
var pvc *v1.PersistentVolumeClaim
518-
if existingPVCName := r.getPGPVCNames(ctx, cluster, labelMap); existingPVCName != "" {
522+
existingPVCName, err := r.getPGPVCNames(ctx, cluster, labelMap)
523+
if err != nil {
524+
return nil, errors.WithStack(err)
525+
}
526+
if existingPVCName != "" {
519527
pvc = &corev1.PersistentVolumeClaim{ObjectMeta: metav1.ObjectMeta{
520528
Namespace: cluster.GetNamespace(),
521529
Name: existingPVCName,
@@ -572,7 +580,7 @@ func (r *Reconciler) reconcilePostgresWALVolume(
572580
return pvc, err
573581
}
574582

575-
err := errors.WithStack(r.setControllerReference(cluster, pvc))
583+
err = errors.WithStack(r.setControllerReference(cluster, pvc))
576584

577585
pvc.Annotations = naming.Merge(
578586
cluster.Spec.Metadata.GetAnnotationsOrNil(),

internal/controller/postgrescluster/volumes.go

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -210,15 +210,15 @@ func (r *Reconciler) getPVCName(
210210
ctx context.Context,
211211
cluster *v1beta1.PostgresCluster,
212212
selector labels.Selector,
213-
) string {
213+
) (string, error) {
214214

215215
pvcs := &v1.PersistentVolumeClaimList{}
216216
err := r.Client.List(ctx, pvcs,
217217
client.InNamespace(cluster.Namespace),
218218
client.MatchingLabelsSelector{Selector: selector},
219219
)
220220
if err != nil {
221-
return ""
221+
return "", errors.WithStack(err)
222222
}
223223

224224
if len(pvcs.Items) > 0 {
@@ -229,18 +229,18 @@ func (r *Reconciler) getPVCName(
229229
&pvcs.Items[j].CreationTimestamp)
230230
})
231231

232-
return pvcs.Items[0].Name
232+
return pvcs.Items[0].Name, nil
233233
}
234234

235-
return ""
235+
return "", nil
236236
}
237237

238238
// getRepoPVCNames returns a map containing the names of repo PVCs that have
239239
// the appropriate labels for each defined pgBackRest repo, if found.
240240
func (r *Reconciler) getRepoPVCNames(
241241
ctx context.Context,
242242
cluster *v1beta1.PostgresCluster,
243-
) map[string]string {
243+
) (map[string]string, error) {
244244

245245
repoPVCs := make(map[string]string)
246246
for _, repo := range cluster.Spec.Backups.PGBackRest.Repos {
@@ -260,29 +260,35 @@ func (r *Reconciler) getRepoPVCNames(
260260
MatchLabels: labelMap,
261261
})
262262
if err != nil {
263-
return nil
263+
return nil, errors.WithStack(err)
264264
}
265265

266-
repoPVCs[repo.Name] = r.getPVCName(ctx, cluster, selector)
266+
repoPVCs[repo.Name], err = r.getPVCName(ctx, cluster, selector)
267+
if err != nil {
268+
return nil, errors.WithStack(err)
269+
}
267270
}
268271

269-
return repoPVCs
272+
return repoPVCs, nil
270273
}
271274

272275
// getPGPVCName returns the name of a PVC that has the provided labels, if found.
273276
func (r *Reconciler) getPGPVCNames(
274277
ctx context.Context,
275278
cluster *v1beta1.PostgresCluster, labelMap map[string]string,
276-
) string {
279+
) (string, error) {
277280

278281
selector, err := naming.AsSelector(metav1.LabelSelector{
279282
MatchLabels: labelMap,
280283
})
281284
if err != nil {
282-
return ""
285+
return "", errors.WithStack(err)
283286
}
284287

285-
name := r.getPVCName(ctx, cluster, selector)
288+
name, err := r.getPVCName(ctx, cluster, selector)
289+
if err != nil {
290+
return "", errors.WithStack(err)
291+
}
286292

287-
return name
293+
return name, nil
288294
}

internal/controller/postgrescluster/volumes_test.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -574,35 +574,49 @@ func TestGetPVCNameMethods(t *testing.T) {
574574
})
575575

576576
assert.NilError(t, err)
577-
assert.Assert(t, reconciler.getPVCName(ctx, cluster, selector) == "testpgdatavol")
577+
578+
pvcName, err := reconciler.getPVCName(ctx, cluster, selector)
579+
assert.NilError(t, err)
580+
581+
assert.Assert(t, pvcName == "testpgdatavol")
578582

579583
})
580584

581585
t.Run("get pgdata PVC", func(t *testing.T) {
582586

583-
assert.Assert(t, reconciler.getPGPVCNames(ctx, cluster, map[string]string{
587+
pvcNames, err := reconciler.getPGPVCNames(ctx, cluster, map[string]string{
584588
naming.LabelCluster: cluster.Name,
585589
naming.LabelInstanceSet: "testinstance1",
586590
naming.LabelInstance: "testinstance1-abcd",
587591
naming.LabelRole: naming.RolePostgresData,
588-
}) == "testpgdatavol")
592+
})
593+
assert.NilError(t, err)
594+
595+
assert.Assert(t, pvcNames == "testpgdatavol")
589596
})
590597

591598
t.Run("get wal PVC", func(t *testing.T) {
592599

593-
assert.Assert(t, reconciler.getPGPVCNames(ctx, cluster, map[string]string{
600+
pvcNames, err := reconciler.getPGPVCNames(ctx, cluster, map[string]string{
594601
naming.LabelCluster: cluster.Name,
595602
naming.LabelInstanceSet: "testinstance1",
596603
naming.LabelInstance: "testinstance1-abcd",
597604
naming.LabelRole: naming.RolePostgresWAL,
598-
}) == "testwalvol")
605+
})
606+
assert.NilError(t, err)
607+
608+
assert.Assert(t, pvcNames == "testwalvol")
599609
})
600610

601611
t.Run("get one repo PVC", func(t *testing.T) {
602612
expectedMap := map[string]string{
603613
"testrepo1": "testrepovol1",
604614
}
605-
assert.DeepEqual(t, reconciler.getRepoPVCNames(ctx, cluster), expectedMap)
615+
616+
repoPVCNames, err := reconciler.getRepoPVCNames(ctx, cluster)
617+
assert.NilError(t, err)
618+
619+
assert.DeepEqual(t, repoPVCNames, expectedMap)
606620
})
607621

608622
t.Run("get two repo PVCs", func(t *testing.T) {
@@ -620,6 +634,10 @@ func TestGetPVCNameMethods(t *testing.T) {
620634
"testrepo1": "testrepovol1",
621635
"testrepo2": "testrepovol2",
622636
}
623-
assert.DeepEqual(t, reconciler.getRepoPVCNames(ctx, cluster), expectedMap)
637+
638+
repoPVCNames, err := reconciler.getRepoPVCNames(ctx, cluster)
639+
assert.NilError(t, err)
640+
641+
assert.DeepEqual(t, repoPVCNames, expectedMap)
624642
})
625643
}

0 commit comments

Comments
 (0)