From 5c6dcc65e2579f30831d8d4199619755c63e4e09 Mon Sep 17 00:00:00 2001 From: annielzy <148128409+annielzy@users.noreply.github.com> Date: Fri, 17 Jul 2026 02:56:48 -0700 Subject: [PATCH] Preserve sync quorum in primary PDB without master selector (#3119) * Use minAvalable=SynchronousNodeCount + 1 in primary PDB when master selector is disabled --------- Co-authored-by: Felix Kunde Co-authored-by: Ida Novindasari --- pkg/cluster/k8sres.go | 6 ++++++ pkg/cluster/k8sres_test.go | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index 09cffea36..505977ed9 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -2278,6 +2278,12 @@ func (c *Cluster) generatePrimaryPodDisruptionBudget() *policyv1.PodDisruptionBu labels[c.OpConfig.PodRoleLabel] = string(Master) } + // When master selector is disabled and synchronous_mode_strict is on, require + // master + synchronous_node_count (default 1) healthy pods for write quorum. + if pdbMasterLabelSelector != nil && !*pdbMasterLabelSelector && minAvailable.IntVal > 0 && c.Spec.SynchronousModeStrict { + minAvailable = intstr.FromInt32(int32(c.Spec.SynchronousNodeCount + 1)) + } + return &policyv1.PodDisruptionBudget{ ObjectMeta: metav1.ObjectMeta{ Name: c.PrimaryPodDisruptionBudgetName(), diff --git a/pkg/cluster/k8sres_test.go b/pkg/cluster/k8sres_test.go index d51efb085..cb2655777 100644 --- a/pkg/cluster/k8sres_test.go +++ b/pkg/cluster/k8sres_test.go @@ -2691,13 +2691,13 @@ func TestGeneratePodDisruptionBudget(t *testing.T) { k8sutil.KubernetesClient{}, acidv1.Postgresql{ ObjectMeta: metav1.ObjectMeta{Name: "myapp-database", Namespace: "myapp"}, - Spec: acidv1.PostgresSpec{TeamID: "myapp", NumberOfInstances: 3}}, + Spec: acidv1.PostgresSpec{TeamID: "myapp", NumberOfInstances: 3, Patroni: acidv1.Patroni{SynchronousModeStrict: true, SynchronousNodeCount: 1}}}, logger, eventRecorder), check: []func(cluster *Cluster, podDisruptionBudget *policyv1.PodDisruptionBudget) error{ testPodDisruptionBudgetOwnerReference, hasName("postgres-myapp-database-pdb"), - hasMinAvailable(1), + hasMinAvailable(2), testLabelsAndSelectors(true), }, },