More debug output for trouble shooting of missing sync.

This commit is contained in:
Jan Mußler 2020-11-04 21:32:09 +01:00
parent c0e6270962
commit 1e10549e43
5 changed files with 49 additions and 23 deletions

View File

@ -598,6 +598,8 @@ func (c *Cluster) Update(oldSpec, newSpec *acidv1.Postgresql) error {
} }
}() }()
logNiceDiff(c.logger, oldSpec, newSpec)
if oldSpec.Spec.PostgresqlParam.PgVersion != newSpec.Spec.PostgresqlParam.PgVersion { // PG versions comparison if oldSpec.Spec.PostgresqlParam.PgVersion != newSpec.Spec.PostgresqlParam.PgVersion { // PG versions comparison
c.logger.Warningf("postgresql version change(%q -> %q) has no effect", c.logger.Warningf("postgresql version change(%q -> %q) has no effect",
oldSpec.Spec.PostgresqlParam.PgVersion, newSpec.Spec.PostgresqlParam.PgVersion) oldSpec.Spec.PostgresqlParam.PgVersion, newSpec.Spec.PostgresqlParam.PgVersion)
@ -610,7 +612,6 @@ func (c *Cluster) Update(oldSpec, newSpec *acidv1.Postgresql) error {
// Service // Service
if !reflect.DeepEqual(c.generateService(Master, &oldSpec.Spec), c.generateService(Master, &newSpec.Spec)) || if !reflect.DeepEqual(c.generateService(Master, &oldSpec.Spec), c.generateService(Master, &newSpec.Spec)) ||
!reflect.DeepEqual(c.generateService(Replica, &oldSpec.Spec), c.generateService(Replica, &newSpec.Spec)) { !reflect.DeepEqual(c.generateService(Replica, &oldSpec.Spec), c.generateService(Replica, &newSpec.Spec)) {
c.logger.Debugf("syncing services")
if err := c.syncServices(); err != nil { if err := c.syncServices(); err != nil {
c.logger.Errorf("could not sync services: %v", err) c.logger.Errorf("could not sync services: %v", err)
updateFailed = true updateFailed = true

View File

@ -6,6 +6,7 @@ import (
"strings" "strings"
"github.com/r3labs/diff" "github.com/r3labs/diff"
"github.com/sirupsen/logrus"
acidzalando "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do" acidzalando "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do"
acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1" acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1"
appsv1 "k8s.io/api/apps/v1" appsv1 "k8s.io/api/apps/v1"
@ -406,12 +407,12 @@ func (c *Cluster) generateConnectionPoolerService(connectionPooler *ConnectionPo
//delete connection pooler //delete connection pooler
func (c *Cluster) deleteConnectionPooler(role PostgresRole) (err error) { func (c *Cluster) deleteConnectionPooler(role PostgresRole) (err error) {
c.logger.Debugln("deleting connection pooler") c.logger.Infof("deleting connection pooler spilo-role=%s", role)
// Lack of connection pooler objects is not a fatal error, just log it if // Lack of connection pooler objects is not a fatal error, just log it if
// it was present before in the manifest // it was present before in the manifest
if c.ConnectionPooler[role] == nil || role == "" { if c.ConnectionPooler[role] == nil || role == "" {
c.logger.Infof("No connection pooler to delete") c.logger.Debugf("no connection pooler to delete")
return nil return nil
} }
@ -433,34 +434,34 @@ func (c *Cluster) deleteConnectionPooler(role PostgresRole) (err error) {
Delete(context.TODO(), deployment.Name, options) Delete(context.TODO(), deployment.Name, options)
if k8sutil.ResourceNotFound(err) { if k8sutil.ResourceNotFound(err) {
c.logger.Debugf("Connection pooler deployment was already deleted") c.logger.Debugf("connection pooler deployment was already deleted")
} else if err != nil { } else if err != nil {
return fmt.Errorf("could not delete deployment: %v", err) return fmt.Errorf("could not delete connection pooler deployment: %v", err)
} }
c.logger.Infof("Connection pooler deployment %q has been deleted for role %s", deployment.Name, role) c.logger.Infof("connection pooler deployment %s has been deleted for role %s", deployment.Name, role)
} }
// Repeat the same for the service object // Repeat the same for the service object
var service *v1.Service var service *v1.Service
service = c.ConnectionPooler[role].Service service = c.ConnectionPooler[role].Service
if service == nil { if service == nil {
c.logger.Infof("nil service to be deleted") c.logger.Debugf("no connection pooler service object to delete")
} } else {
if service != nil {
err = c.KubeClient. err = c.KubeClient.
Services(c.Namespace). Services(c.Namespace).
Delete(context.TODO(), service.Name, options) Delete(context.TODO(), service.Name, options)
if k8sutil.ResourceNotFound(err) { if k8sutil.ResourceNotFound(err) {
c.logger.Debugf("Connection pooler service was already deleted") c.logger.Debugf("connection pooler service was already deleted")
} else if err != nil { } else if err != nil {
return fmt.Errorf("could not delete service: %v", err) return fmt.Errorf("could not delete connection pooler service: %v", err)
} }
c.logger.Infof("Connection pooler service %q has been deleted for role %s", service.Name, role) c.logger.Infof("connection pooler service %s has been deleted for role %s", service.Name, role)
} }
c.ConnectionPooler[role] = nil c.ConnectionPooler[role] = nil
return nil return nil
} }
@ -475,7 +476,7 @@ func (c *Cluster) deleteConnectionPoolerSecret() (err error) {
Get(context.TODO(), secretName, metav1.GetOptions{}) Get(context.TODO(), secretName, metav1.GetOptions{})
if err != nil { if err != nil {
c.logger.Debugf("could not get connection pooler secret %q: %v", secretName, err) c.logger.Debugf("could not get connection pooler secret %s: %v", secretName, err)
} else { } else {
if err = c.deleteSecret(secret.UID, *secret); err != nil { if err = c.deleteSecret(secret.UID, *secret); err != nil {
return fmt.Errorf("could not delete pooler secret: %v", err) return fmt.Errorf("could not delete pooler secret: %v", err)
@ -493,7 +494,7 @@ func updateConnectionPoolerDeployment(KubeClient k8sutil.KubernetesClient, newDe
patchData, err := specPatch(newDeployment.Spec) patchData, err := specPatch(newDeployment.Spec)
if err != nil { if err != nil {
return nil, fmt.Errorf("could not form patch for the deployment: %v", err) return nil, fmt.Errorf("could not form patch for the connection pooler deployment: %v", err)
} }
// An update probably requires RetryOnConflict, but since only one operator // An update probably requires RetryOnConflict, but since only one operator
@ -508,7 +509,7 @@ func updateConnectionPoolerDeployment(KubeClient k8sutil.KubernetesClient, newDe
metav1.PatchOptions{}, metav1.PatchOptions{},
"") "")
if err != nil { if err != nil {
return nil, fmt.Errorf("could not patch deployment: %v", err) return nil, fmt.Errorf("could not patch connection pooler deployment: %v", err)
} }
return deployment, nil return deployment, nil
@ -518,7 +519,7 @@ func updateConnectionPoolerDeployment(KubeClient k8sutil.KubernetesClient, newDe
func updateConnectionPoolerAnnotations(KubeClient k8sutil.KubernetesClient, deployment *appsv1.Deployment, annotations map[string]string) (*appsv1.Deployment, error) { func updateConnectionPoolerAnnotations(KubeClient k8sutil.KubernetesClient, deployment *appsv1.Deployment, annotations map[string]string) (*appsv1.Deployment, error) {
patchData, err := metaAnnotationsPatch(annotations) patchData, err := metaAnnotationsPatch(annotations)
if err != nil { if err != nil {
return nil, fmt.Errorf("could not form patch for the deployment metadata: %v", err) return nil, fmt.Errorf("could not form patch for the connection pooler deployment metadata: %v", err)
} }
result, err := KubeClient.Deployments(deployment.Namespace).Patch( result, err := KubeClient.Deployments(deployment.Namespace).Patch(
context.TODO(), context.TODO(),
@ -657,7 +658,22 @@ func makeDefaultConnectionPoolerResources(config *config.Config) acidv1.Resource
} }
} }
func logPoolerEssentials(log *logrus.Entry, oldSpec, newSpec *acidv1.Postgresql) {
var v []string
for _, b := range []*bool{oldSpec.Spec.EnableConnectionPooler, oldSpec.Spec.EnableReplicaConnectionPooler, newSpec.Spec.EnableConnectionPooler, newSpec.Spec.EnableReplicaConnectionPooler} {
if b == nil {
v = append(v, "nil")
} else {
v = append(v, fmt.Sprintf("%v", *b))
}
}
log.Debugf("syncing connection pooler from (%v, %v) to (%v, %v)", v[0], v[1], v[2], v[3])
}
func (c *Cluster) syncConnectionPooler(oldSpec, newSpec *acidv1.Postgresql, LookupFunction InstallFunction) (SyncReason, error) { func (c *Cluster) syncConnectionPooler(oldSpec, newSpec *acidv1.Postgresql, LookupFunction InstallFunction) (SyncReason, error) {
logPoolerEssentials(c.logger, oldSpec, newSpec)
var reason SyncReason var reason SyncReason
var err error var err error
@ -767,7 +783,7 @@ func (c *Cluster) syncConnectionPoolerWorker(oldSpec, newSpec *acidv1.Postgresql
Get(context.TODO(), c.connectionPoolerName(role), metav1.GetOptions{}) Get(context.TODO(), c.connectionPoolerName(role), metav1.GetOptions{})
if err != nil && k8sutil.ResourceNotFound(err) { if err != nil && k8sutil.ResourceNotFound(err) {
msg := "Deployment %s for connection pooler synchronization is not found, create it" msg := "deployment %s for connection pooler synchronization is not found, create it"
c.logger.Warningf(msg, c.connectionPoolerName(role)) c.logger.Warningf(msg, c.connectionPoolerName(role))
deploymentSpec, err := c.generateConnectionPoolerDeployment(c.ConnectionPooler[role]) deploymentSpec, err := c.generateConnectionPoolerDeployment(c.ConnectionPooler[role])
@ -811,7 +827,7 @@ func (c *Cluster) syncConnectionPoolerWorker(oldSpec, newSpec *acidv1.Postgresql
newConnectionPooler = &acidv1.ConnectionPooler{} newConnectionPooler = &acidv1.ConnectionPooler{}
} }
c.logger.Infof("Old: %+v, New %+v", oldConnectionPooler, newConnectionPooler) c.logger.Infof("old: %+v, new %+v", oldConnectionPooler, newConnectionPooler)
var specSync bool var specSync bool
var specReason []string var specReason []string

View File

@ -150,6 +150,17 @@ func TestNeedConnectionPooler(t *testing.T) {
testName) testName)
} }
cluster.Spec = acidv1.PostgresSpec{
EnableConnectionPooler: boolToPointer(false),
EnableReplicaConnectionPooler: boolToPointer(false),
ConnectionPooler: nil,
}
if needMasterConnectionPooler(&cluster.Spec) {
t.Errorf("%s: Connection pooler is enabled with flag false and nil",
testName)
}
// Test for replica connection pooler // Test for replica connection pooler
cluster.Spec = acidv1.PostgresSpec{ cluster.Spec = acidv1.PostgresSpec{
ConnectionPooler: &acidv1.ConnectionPooler{}, ConnectionPooler: &acidv1.ConnectionPooler{},

View File

@ -43,15 +43,12 @@ func (c *Cluster) Sync(newSpec *acidv1.Postgresql) error {
return err return err
} }
c.logger.Debugf("syncing secrets")
//TODO: mind the secrets of the deleted/new users //TODO: mind the secrets of the deleted/new users
if err = c.syncSecrets(); err != nil { if err = c.syncSecrets(); err != nil {
err = fmt.Errorf("could not sync secrets: %v", err) err = fmt.Errorf("could not sync secrets: %v", err)
return err return err
} }
c.logger.Debugf("syncing services")
if err = c.syncServices(); err != nil { if err = c.syncServices(); err != nil {
err = fmt.Errorf("could not sync services: %v", err) err = fmt.Errorf("could not sync services: %v", err)
return err return err
@ -482,6 +479,7 @@ func (c *Cluster) syncSecrets() error {
err error err error
secret *v1.Secret secret *v1.Secret
) )
c.logger.Info("syncing secrets")
c.setProcessName("syncing secrets") c.setProcessName("syncing secrets")
secrets := c.generateUserSecrets() secrets := c.generateUserSecrets()

View File

@ -473,7 +473,7 @@ func (c *Controller) queueClusterEvent(informerOldSpec, informerNewSpec *acidv1.
if err := c.clusterEventQueues[workerID].Add(clusterEvent); err != nil { if err := c.clusterEventQueues[workerID].Add(clusterEvent); err != nil {
lg.Errorf("error while queueing cluster event: %v", clusterEvent) lg.Errorf("error while queueing cluster event: %v", clusterEvent)
} }
lg.Infof("%q event has been queued", eventType) lg.Infof("%s event has been queued", eventType)
if eventType != EventDelete { if eventType != EventDelete {
return return
@ -494,7 +494,7 @@ func (c *Controller) queueClusterEvent(informerOldSpec, informerNewSpec *acidv1.
if err != nil { if err != nil {
lg.Warningf("could not delete event from the queue: %v", err) lg.Warningf("could not delete event from the queue: %v", err)
} else { } else {
lg.Debugf("event %q has been discarded for the cluster", evType) lg.Debugf("event %s has been discarded for the cluster", evType)
} }
} }
} }