66 "fmt"
77 "strings"
88
9+ "github.com/Masterminds/semver"
910 "github.com/zalando/postgres-operator/pkg/spec"
1011 "github.com/zalando/postgres-operator/pkg/util"
1112 v1 "k8s.io/api/core/v1"
@@ -170,6 +171,38 @@ func (c *Cluster) majorVersionUpgrade() error {
170171 return nil
171172 }
172173
174+ members , err := c .patroni .GetClusterMembers (masterPod )
175+ if err != nil {
176+ c .logger .Error ("could not get cluster members data from Patroni API, skipping major version upgrade" )
177+ return err
178+ }
179+ patroniData , err := c .patroni .GetMemberData (masterPod )
180+ if err != nil {
181+ c .logger .Error ("could not get members data from Patroni API, skipping major version upgrade" )
182+ return err
183+ }
184+ patroniVer , err := semver .NewVersion (patroniData .Patroni .Version )
185+ if err != nil {
186+ c .logger .Error ("error parsing Patroni version" )
187+ patroniVer , _ = semver .NewVersion ("3.0.4" )
188+ }
189+ verConstraint , _ := semver .NewConstraint (">= 3.0.4" )
190+ checkStreaming , _ := verConstraint .Validate (patroniVer )
191+
192+ for _ , member := range members {
193+ if PostgresRole (member .Role ) == Leader {
194+ continue
195+ }
196+ if checkStreaming && member .State != "streaming" {
197+ c .logger .Infof ("skipping major version upgrade, replica %s is not streaming from primary" , member .Name )
198+ return nil
199+ }
200+ if member .Lag > 16 * 1024 * 1024 {
201+ c .logger .Infof ("skipping major version upgrade, replication lag on member %s is too high" , member .Name )
202+ return nil
203+ }
204+ }
205+
173206 isUpgradeSuccess := true
174207 numberOfPods := len (pods )
175208 if allRunning && masterPod != nil {
@@ -187,19 +220,21 @@ func (c *Cluster) majorVersionUpgrade() error {
187220 }
188221
189222 resultIdCheck = strings .TrimSuffix (resultIdCheck , "\n " )
190- var result string
223+ var result , scriptErrMsg string
191224 if resultIdCheck != "0" {
192225 c .logger .Infof ("user id was identified as: %s, hence default user is non-root already" , resultIdCheck )
193226 result , err = c .ExecCommand (podName , "/bin/bash" , "-c" , upgradeCommand )
227+ scriptErrMsg , _ = c .ExecCommand (podName , "/bin/bash" , "-c" , "tail -n 1 last_upgrade.log" )
194228 } else {
195229 c .logger .Infof ("user id was identified as: %s, using su to reach the postgres user" , resultIdCheck )
196230 result , err = c .ExecCommand (podName , "/bin/su" , "postgres" , "-c" , upgradeCommand )
231+ scriptErrMsg , _ = c .ExecCommand (podName , "/bin/bash" , "-c" , "tail -n 1 last_upgrade.log" )
197232 }
198233 if err != nil {
199234 isUpgradeSuccess = false
200235 c .annotatePostgresResource (isUpgradeSuccess )
201- c .eventRecorder .Eventf (c .GetReference (), v1 .EventTypeWarning , "Major Version Upgrade" , "upgrade from %d to %d FAILED: %v" , c .currentMajorVersion , desiredVersion , err )
202- return err
236+ c .eventRecorder .Eventf (c .GetReference (), v1 .EventTypeWarning , "Major Version Upgrade" , "upgrade from %d to %d FAILED: %v" , c .currentMajorVersion , desiredVersion , scriptErrMsg )
237+ return fmt . Errorf ( scriptErrMsg )
203238 }
204239
205240 c .annotatePostgresResource (isUpgradeSuccess )
0 commit comments