@@ -81,8 +81,8 @@ type Reconciler struct {
81
81
82
82
// Reconcile reconciles a ConfigMap in a namespace managed by the PostgreSQL Operator
83
83
func (r * Reconciler ) Reconcile (
84
- ctx context.Context , request reconcile.Request ) (reconcile. Result , error ,
85
- ) {
84
+ ctx context.Context , request reconcile.Request ,
85
+ ) (reconcile. Result , error ) {
86
86
ctx , span := r .Tracer .Start (ctx , "Reconcile" )
87
87
log := logging .FromContext (ctx )
88
88
defer span .End ()
@@ -100,6 +100,11 @@ func (r *Reconciler) Reconcile(
100
100
return runtime .ErrorWithBackoff (err )
101
101
}
102
102
103
+ log .V (1 ).Info ("starting reconciliation" ,
104
+ "cluster" , request .Name ,
105
+ "namespace" , request .Namespace ,
106
+ "clusterwide" , cluster .Spec .Standby == nil )
107
+
103
108
// Set any defaults that may not have been stored in the API. No DeepCopy
104
109
// is necessary because controller-runtime makes a copy before returning
105
110
// from its cache.
@@ -111,6 +116,19 @@ func (r *Reconciler) Reconcile(
111
116
112
117
// Keep a copy of cluster prior to any manipulations.
113
118
before := cluster .DeepCopy ()
119
+ var err error
120
+ result := reconcile.Result {}
121
+ defer func () {
122
+ if ! equality .Semantic .DeepEqual (before .Status , cluster .Status ) {
123
+ statusErr := r .Client .Status ().Patch (ctx , cluster , client .MergeFrom (before ), r .Owner )
124
+ if statusErr != nil {
125
+ log .Error (statusErr , "patching cluster status" )
126
+ }
127
+ if err == nil {
128
+ err = statusErr
129
+ }
130
+ }
131
+ }()
114
132
115
133
// NOTE(cbandy): When a namespace is deleted, objects owned by a
116
134
// PostgresCluster may be deleted before the PostgresCluster is deleted.
@@ -235,8 +253,11 @@ func (r *Reconciler) Reconcile(
235
253
// Set huge_pages = try if a hugepages resource limit > 0, otherwise set "off"
236
254
postgres .SetHugePages (cluster , & pgParameters )
237
255
256
+ result := reconcile.Result {}
257
+
238
258
if err == nil {
239
259
rootCA , err = r .reconcileRootCertificate (ctx , cluster )
260
+ log .V (1 ).Info ("reconciled root certificate" , "cluster" , cluster .Name , "error" , err )
240
261
}
241
262
242
263
if err == nil {
@@ -248,43 +269,49 @@ func (r *Reconciler) Reconcile(
248
269
// return is no longer needed, and reconciliation can proceed normally.
249
270
returnEarly , err := r .reconcileDirMoveJobs (ctx , cluster )
250
271
if err != nil || returnEarly {
272
+ log .V (1 ).Info ("waiting for directory move jobs" , "cluster" , cluster .Name , "error" , err )
251
273
return runtime .ErrorWithBackoff (errors .Join (err , patchClusterStatus ()))
252
274
}
253
275
}
254
276
if err == nil {
255
277
clusterVolumes , err = r .observePersistentVolumeClaims (ctx , cluster )
278
+ log .V (1 ).Info ("observed persistent volume claims" , "cluster" , cluster .Name , "count" , len (clusterVolumes ), "error" , err )
256
279
}
257
280
if err == nil {
258
281
clusterVolumes , err = r .configureExistingPVCs (ctx , cluster , clusterVolumes )
282
+ log .V (1 ).Info ("configured existing PVCs" , "cluster" , cluster .Name , "count" , len (clusterVolumes ), "error" , err )
259
283
}
260
284
if err == nil {
261
285
instances , err = r .observeInstances (ctx , cluster )
286
+ log .V (1 ).Info ("observed instances" , "cluster" , cluster .Name , "error" , err )
262
287
}
263
288
264
- result := reconcile.Result {}
265
-
266
289
if err == nil {
267
290
var requeue time.Duration
268
291
if requeue , err = r .reconcilePatroniStatus (ctx , cluster , instances ); err == nil && requeue > 0 {
269
292
result .RequeueAfter = requeue
293
+ log .V (1 ).Info ("requeuing for patroni status" , "cluster" , cluster .Name , "after" , requeue )
270
294
}
271
295
}
272
296
if err == nil {
273
297
err = r .reconcilePatroniSwitchover (ctx , cluster , instances )
298
+ log .V (1 ).Info ("reconciled patroni switchover" , "cluster" , cluster .Name , "error" , err )
274
299
}
275
300
// reconcile the Pod service before reconciling any data source in case it is necessary
276
301
// to start Pods during data source reconciliation that require network connections (e.g.
277
302
// if it is necessary to start a dedicated repo host to bootstrap a new cluster using its
278
303
// own existing backups).
279
304
if err == nil {
280
305
clusterPodService , err = r .reconcileClusterPodService (ctx , cluster )
306
+ log .V (1 ).Info ("reconciled cluster pod service" , "cluster" , cluster .Name , "error" , err )
281
307
}
282
308
// reconcile the RBAC resources before reconciling any data source in case
283
309
// restore/move Job pods require the ServiceAccount to access any data source.
284
310
// e.g., we are restoring from an S3 source using an IAM for access
285
311
// - https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-technical-overview.html
286
312
if err == nil {
287
313
instanceServiceAccount , err = r .reconcileRBACResources (ctx , cluster )
314
+ log .V (1 ).Info ("reconciled RBAC resources" , "cluster" , cluster .Name , "error" , err )
288
315
}
289
316
// First handle reconciling any data source configured for the PostgresCluster. This includes
290
317
// reconciling the data source defined to bootstrap a new cluster, as well as a reconciling
@@ -298,88 +325,112 @@ func (r *Reconciler) Reconcile(
298
325
// can proceed normally.
299
326
returnEarly , err := r .reconcileDataSource (ctx , cluster , instances , clusterVolumes , rootCA )
300
327
if err != nil || returnEarly {
328
+ log .V (1 ).Info ("waiting for data source initialization" , "cluster" , cluster .Name , "error" , err )
301
329
return runtime .ErrorWithBackoff (errors .Join (err , patchClusterStatus ()))
302
330
}
303
331
}
304
332
if err == nil {
333
+ log .V (1 ).Info ("reconciling cluster config map" , "cluster" , cluster .Name )
305
334
clusterConfigMap , err = r .reconcileClusterConfigMap (ctx , cluster , pgHBAs , pgParameters )
306
335
}
307
336
if err == nil {
337
+ log .V (1 ).Info ("reconciling replication secret" , "cluster" , cluster .Name )
308
338
clusterReplicationSecret , err = r .reconcileReplicationSecret (ctx , cluster , rootCA )
309
339
}
310
340
if err == nil {
341
+ log .V (1 ).Info ("reconciling patroni leader lease" , "cluster" , cluster .Name )
311
342
patroniLeaderService , err = r .reconcilePatroniLeaderLease (ctx , cluster )
312
343
}
313
344
if err == nil {
345
+ log .V (1 ).Info ("reconciling cluster primary service" , "cluster" , cluster .Name )
314
346
primaryService , err = r .reconcileClusterPrimaryService (ctx , cluster , patroniLeaderService )
315
347
}
316
348
if err == nil {
349
+ log .V (1 ).Info ("reconciling cluster replica service" , "cluster" , cluster .Name )
317
350
replicaService , err = r .reconcileClusterReplicaService (ctx , cluster )
318
351
}
319
352
if err == nil {
353
+ log .V (1 ).Info ("reconciling cluster certificate" , "cluster" , cluster .Name )
320
354
primaryCertificate , err = r .reconcileClusterCertificate (ctx , rootCA , cluster , primaryService , replicaService )
321
355
}
322
356
if err == nil {
357
+ log .V (1 ).Info ("reconciling patroni distributed configuration" , "cluster" , cluster .Name )
323
358
err = r .reconcilePatroniDistributedConfiguration (ctx , cluster )
324
359
}
325
360
if err == nil {
361
+ log .V (1 ).Info ("reconciling patroni dynamic configuration" , "cluster" , cluster .Name )
326
362
err = r .reconcilePatroniDynamicConfiguration (ctx , cluster , instances , pgHBAs , pgParameters )
327
363
}
328
364
if err == nil {
365
+ log .V (1 ).Info ("reconciling monitoring secret" , "cluster" , cluster .Name )
329
366
monitoringSecret , err = r .reconcileMonitoringSecret (ctx , cluster )
330
367
}
331
368
if err == nil {
369
+ log .V (1 ).Info ("reconciling exporter queries config" , "cluster" , cluster .Name )
332
370
exporterQueriesConfig , err = r .reconcileExporterQueriesConfig (ctx , cluster )
333
371
}
334
372
if err == nil {
373
+ log .V (1 ).Info ("reconciling exporter web config" , "cluster" , cluster .Name )
335
374
exporterWebConfig , err = r .reconcileExporterWebConfig (ctx , cluster )
336
375
}
337
376
if err == nil {
377
+ log .V (1 ).Info ("reconciling instance sets" , "cluster" , cluster .Name )
338
378
err = r .reconcileInstanceSets (
339
379
ctx , cluster , clusterConfigMap , clusterReplicationSecret , rootCA ,
340
380
clusterPodService , instanceServiceAccount , instances , patroniLeaderService ,
341
381
primaryCertificate , clusterVolumes , exporterQueriesConfig , exporterWebConfig )
342
382
}
343
383
344
384
if err == nil {
385
+ log .V (1 ).Info ("reconciling postgres databases" , "cluster" , cluster .Name )
345
386
err = r .reconcilePostgresDatabases (ctx , cluster , instances )
346
387
}
347
388
if err == nil {
389
+ log .V (1 ).Info ("reconciling postgres users" , "cluster" , cluster .Name )
348
390
err = r .reconcilePostgresUsers (ctx , cluster , instances )
349
391
}
350
392
351
393
if err == nil {
394
+ log .V (1 ).Info ("reconciling pgbackrest" , "cluster" , cluster .Name )
352
395
var next reconcile.Result
353
396
if next , err = r .reconcilePGBackRest (ctx , cluster , instances , rootCA ); err == nil && ! next .IsZero () {
354
397
result .Requeue = result .Requeue || next .Requeue
355
398
if next .RequeueAfter > 0 {
356
399
result .RequeueAfter = next .RequeueAfter
400
+ log .V (1 ).Info ("requeuing for pgbackrest" , "cluster" , cluster .Name , "after" , next .RequeueAfter )
357
401
}
358
402
}
359
403
}
360
404
if err == nil {
405
+ log .V (1 ).Info ("reconciling pgbouncer" , "cluster" , cluster .Name )
361
406
err = r .reconcilePGBouncer (ctx , cluster , instances , primaryCertificate , rootCA )
362
407
}
363
408
if err == nil {
409
+ log .V (1 ).Info ("reconciling pgmonitor" , "cluster" , cluster .Name )
364
410
err = r .reconcilePGMonitor (ctx , cluster , instances , monitoringSecret )
365
411
}
366
412
if err == nil {
413
+ log .V (1 ).Info ("reconciling database init sql" , "cluster" , cluster .Name )
367
414
err = r .reconcileDatabaseInitSQL (ctx , cluster , instances )
368
415
}
369
416
if err == nil {
417
+ log .V (1 ).Info ("reconciling pgadmin" , "cluster" , cluster .Name )
370
418
err = r .reconcilePGAdmin (ctx , cluster )
371
419
}
372
420
if err == nil {
373
- // This is after [Reconciler.rolloutInstances] to ensure that recreating
374
- // Pods takes precedence.
421
+ log .V (1 ).Info ("handling patroni restarts" , "cluster" , cluster .Name )
375
422
err = r .handlePatroniRestarts (ctx , cluster , instances )
376
423
}
377
424
378
425
// at this point everything reconciled successfully, and we can update the
379
426
// observedGeneration
380
427
cluster .Status .ObservedGeneration = cluster .GetGeneration ()
381
428
382
- log .V (1 ).Info ("reconciled cluster" )
429
+ log .V (1 ).Info ("reconciliation completed" ,
430
+ "cluster" , cluster .Name ,
431
+ "error" , err ,
432
+ "requeue" , result .Requeue ,
433
+ "requeueAfter" , result .RequeueAfter )
383
434
384
435
return result , errors .Join (err , patchClusterStatus ())
385
436
}
0 commit comments