@@ -957,6 +957,11 @@ func (c *Cluster) Update(oldSpec, newSpec *acidv1.Postgresql) error {
957957	defer  c .mu .Unlock ()
958958
959959	c .KubeClient .SetPostgresCRDStatus (c .clusterName (), acidv1 .ClusterStatusUpdating )
960+ 
961+ 	if  ! isInMaintenanceWindow (newSpec .Spec .MaintenanceWindows ) {
962+ 		// do not apply any major version related changes yet 
963+ 		newSpec .Spec .PostgresqlParam .PgVersion  =  oldSpec .Spec .PostgresqlParam .PgVersion 
964+ 	}
960965	c .setSpec (newSpec )
961966
962967	defer  func () {
@@ -1761,35 +1766,39 @@ func (c *Cluster) GetSwitchoverSchedule() string {
17611766}
17621767
17631768// Switchover does a switchover (via Patroni) to a candidate pod 
1764- func  (c  * Cluster ) Switchover (curMaster  * v1.Pod , candidate  spec.NamespacedName ) error  {
1769+ func  (c  * Cluster ) Switchover (curMaster  * v1.Pod , candidate  spec.NamespacedName ,  inMaintWindow   bool ) error  {
17651770	var  err  error 
1766- 	c .logger .Debugf ("switching over from %q to %q" , curMaster .Name , candidate )
1767- 
1768- 	if  ! isInMaintenanceWindow (c .Spec .MaintenanceWindows ) {
1769- 		c .logger .Infof ("postponing switchover, not in maintenance window" )
1770- 		schedule  :=  c .GetSwitchoverSchedule ()
1771- 
1772- 		if  err  :=  c .patroni .Switchover (curMaster , candidate .Name , schedule ); err  !=  nil  {
1773- 			return  fmt .Errorf ("could not schedule switchover: %v" , err )
1774- 		}
1775- 		c .logger .Infof ("switchover is scheduled at %s" , schedule )
1776- 		return  nil 
1777- 	}
17781771
1779- 	c .eventRecorder .Eventf (c .GetReference (), v1 .EventTypeNormal , "Switchover" , "Switching over from %q to %q" , curMaster .Name , candidate )
17801772	stopCh  :=  make (chan  struct {})
17811773	ch  :=  c .registerPodSubscriber (candidate )
17821774	defer  c .unregisterPodSubscriber (candidate )
17831775	defer  close (stopCh )
17841776
1785- 	if  err  =  c .patroni .Switchover (curMaster , candidate .Name , "" ); err  ==  nil  {
1777+ 	var  scheduled_at  string 
1778+ 	if  inMaintWindow  {
1779+ 		c .logger .Debugf ("switching over from %q to %q" , curMaster .Name , candidate )
1780+ 		c .eventRecorder .Eventf (c .GetReference (), v1 .EventTypeNormal , "Switchover" , "Switching over from %q to %q" , curMaster .Name , candidate )
1781+ 
1782+ 		scheduled_at  =  c .GetSwitchoverSchedule ()
1783+ 	} else  {
1784+ 		scheduled_at  =  "" 
1785+ 	}
1786+ 
1787+ 	if  err  =  c .patroni .Switchover (curMaster , candidate .Name , scheduled_at ); err  ==  nil  {
1788+ 		if  inMaintWindow  {
1789+ 			c .logger .Infof ("switchover is scheduled at %s" , scheduled_at )
1790+ 			return  nil 
1791+ 		}
17861792		c .logger .Debugf ("successfully switched over from %q to %q" , curMaster .Name , candidate )
17871793		c .eventRecorder .Eventf (c .GetReference (), v1 .EventTypeNormal , "Switchover" , "Successfully switched over from %q to %q" , curMaster .Name , candidate )
17881794		_ , err  =  c .waitForPodLabel (ch , stopCh , nil )
17891795		if  err  !=  nil  {
17901796			err  =  fmt .Errorf ("could not get master pod label: %v" , err )
17911797		}
17921798	} else  {
1799+ 		if  inMaintWindow  {
1800+ 			return  fmt .Errorf ("could not schedule switchover: %v" , err )
1801+ 		}
17931802		err  =  fmt .Errorf ("could not switch over from %q to %q: %v" , curMaster .Name , candidate , err )
17941803		c .eventRecorder .Eventf (c .GetReference (), v1 .EventTypeNormal , "Switchover" , "Switchover from %q to %q FAILED: %v" , curMaster .Name , candidate , err )
17951804	}
0 commit comments