6
6
"fmt"
7
7
"strings"
8
8
9
+ "github.com/Masterminds/semver"
9
10
"github.com/zalando/postgres-operator/pkg/spec"
10
11
"github.com/zalando/postgres-operator/pkg/util"
11
12
v1 "k8s.io/api/core/v1"
@@ -170,6 +171,38 @@ func (c *Cluster) majorVersionUpgrade() error {
170
171
return nil
171
172
}
172
173
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
+
173
206
isUpgradeSuccess := true
174
207
numberOfPods := len (pods )
175
208
if allRunning && masterPod != nil {
@@ -187,19 +220,21 @@ func (c *Cluster) majorVersionUpgrade() error {
187
220
}
188
221
189
222
resultIdCheck = strings .TrimSuffix (resultIdCheck , "\n " )
190
- var result string
223
+ var result , scriptErrMsg string
191
224
if resultIdCheck != "0" {
192
225
c .logger .Infof ("user id was identified as: %s, hence default user is non-root already" , resultIdCheck )
193
226
result , err = c .ExecCommand (podName , "/bin/bash" , "-c" , upgradeCommand )
227
+ scriptErrMsg , _ = c .ExecCommand (podName , "/bin/bash" , "-c" , "tail -n 1 last_upgrade.log" )
194
228
} else {
195
229
c .logger .Infof ("user id was identified as: %s, using su to reach the postgres user" , resultIdCheck )
196
230
result , err = c .ExecCommand (podName , "/bin/su" , "postgres" , "-c" , upgradeCommand )
231
+ scriptErrMsg , _ = c .ExecCommand (podName , "/bin/bash" , "-c" , "tail -n 1 last_upgrade.log" )
197
232
}
198
233
if err != nil {
199
234
isUpgradeSuccess = false
200
235
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 )
203
238
}
204
239
205
240
c .annotatePostgresResource (isUpgradeSuccess )
0 commit comments