Skip to content

Commit 86d6ec8

Browse files
committed
[PLAT-20822]: Make minimum software vesion required for PG upgrade configurable.
Summary: Added changes to make minimum software vesion required for PG upgrade configurable Test Plan: Tested manually Reviewers: anijhawan Reviewed By: anijhawan Subscribers: yugaware Differential Revision: https://phorge.dev.yugabyte.com/D52968
1 parent 552fcda commit 86d6ec8

4 files changed

Lines changed: 113 additions & 4 deletions

File tree

managed/src/main/java/com/yugabyte/yw/commissioner/tasks/subtasks/check/CheckUpgrade.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@
4444
@Slf4j
4545
public class CheckUpgrade extends ServerSubTaskBase {
4646

47+
/**
48+
* Minimum DB version for YSQL major upgrade on preview release tracks (not runtime configurable).
49+
*/
50+
private static final String YSQL_MAJOR_UPGRADE_MIN_PREVIEW_DB_VERSION = "2.25.0.0-b1";
51+
4752
private final Config appConfig;
4853
private final AuditService auditService;
4954
private final SoftwareUpgradeHelper softwareUpgradeHelper;
@@ -216,13 +221,24 @@ private void validateYSQLMajorUpgrade(
216221
gFlagsValidation.ysqlMajorVersionUpgrade(currentVersion, newVersion);
217222
UserIntent currentIntent = universe.getUniverseDetails().getPrimaryCluster().userIntent;
218223
if (isYsqlMajorVersionUpgrade && currentIntent.enableYSQL) {
224+
String minStableDbVersion =
225+
confGetter.getConfForScope(universe, UniverseConfKeys.ysqlMajorUpgradeMinStableDbVersion);
219226
if (Util.compareYBVersions(
220-
currentVersion, "2024.2.3.0-b1", "2.25.0.0-b1", true /* suppressFormatError */)
227+
currentVersion,
228+
minStableDbVersion,
229+
YSQL_MAJOR_UPGRADE_MIN_PREVIEW_DB_VERSION,
230+
true /* suppressFormatError */)
221231
< 0) {
232+
String minVersionForMessage =
233+
Util.isStableVersion(currentVersion, true /* suppressFormatError */)
234+
? minStableDbVersion
235+
: YSQL_MAJOR_UPGRADE_MIN_PREVIEW_DB_VERSION;
222236
throw new PlatformServiceException(
223-
Status.BAD_REQUEST,
224-
"YSQL major version upgrade is only supported from 2024.2.3.0-b1. Please upgrade to a"
225-
+ " version >= 2024.2.3.0-b1 before proceeding with the upgrade.");
237+
BAD_REQUEST,
238+
String.format(
239+
"YSQL major version upgrade is only supported from %s. Please upgrade to a version "
240+
+ ">= %s before proceeding with the upgrade.",
241+
minVersionForMessage, minVersionForMessage));
226242
}
227243

228244
for (Cluster cluster : universe.getUniverseDetails().clusters) {

managed/src/main/java/com/yugabyte/yw/common/config/UniverseConfKeys.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1740,6 +1740,16 @@ public class UniverseConfKeys extends RuntimeConfigKeysModule {
17401740
"Skip auto flags and YSQL migration files validation",
17411741
ConfDataType.BooleanType,
17421742
ImmutableList.of(ConfKeyTags.PUBLIC));
1743+
public static final ConfKeyInfo<String> ysqlMajorUpgradeMinStableDbVersion =
1744+
new ConfKeyInfo<>(
1745+
"yb.upgrade.ysql_major_upgrade_min_stable_db_version",
1746+
ScopeType.UNIVERSE,
1747+
"YSQL major upgrade minimum stable DB version",
1748+
"Minimum DB software version required on stable release tracks before a YSQL major"
1749+
+ " version upgrade can proceed. Preview release tracks use a fixed platform"
1750+
+ " minimum. Use a valid YBA DB version string (for example 2024.2.3.0-b1).",
1751+
ConfDataType.StringType,
1752+
ImmutableList.of(ConfKeyTags.PUBLIC));
17431753
public static final ConfKeyInfo<Long> ybcPerDiskIoRequestSize =
17441754
new ConfKeyInfo<>(
17451755
"ybc.disk_io_request_size_bytes",

managed/src/main/resources/reference.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,7 @@ yb {
933933
# Default admin ops timeout for catalog upgrade is set to 60 minutes
934934
catalog_upgrade_admin_ops_timeout_ms = 3600000
935935
skip_autoflags_and_ysql_migration_files_validation = false
936+
ysql_major_upgrade_min_stable_db_version = "2024.2.3.0-b1"
936937
upgrade_master_stage_pause_duration_ms = 0
937938
upgrade_tserver_stage_pause_duration_ms = 0
938939
sleep_after_master_restart_ms = 180000

managed/src/test/java/com/yugabyte/yw/commissioner/tasks/subtasks/check/CheckUpgradeTest.java

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.yugabyte.yw.common.ModelFactory;
1818
import com.yugabyte.yw.common.PlatformServiceException;
1919
import com.yugabyte.yw.common.TestHelper;
20+
import com.yugabyte.yw.common.config.UniverseConfKeys;
2021
import com.yugabyte.yw.common.gflags.GFlagsValidation.AutoFlagDetails;
2122
import com.yugabyte.yw.common.gflags.GFlagsValidation.AutoFlagsPerServer;
2223
import com.yugabyte.yw.models.Universe;
@@ -182,4 +183,85 @@ public void testYsqlMigrationFilesAllPresent() throws Exception {
182183
task.initialize(params);
183184
task.run();
184185
}
186+
187+
@Test
188+
public void testYsqlMajorUpgradeRejectsStableBelowConfiguredMinimum() throws Exception {
189+
TestHelper.updateUniverseVersion(defaultUniverse, "2024.2.2.0-b1");
190+
CheckUpgrade.Params params = new CheckUpgrade.Params();
191+
params.setUniverseUUID(defaultUniverse.getUniverseUUID());
192+
params.ybSoftwareVersion = "2024.2.3.0-b1";
193+
when(mockGFlagsValidation.ysqlMajorVersionUpgrade(anyString(), anyString())).thenReturn(true);
194+
when(mockAutoFlagUtil.getPromotedAutoFlags(any(), any(), anyInt()))
195+
.thenReturn(ImmutableSet.of("FLAG_1"));
196+
AutoFlagDetails flag = new AutoFlagDetails();
197+
flag.name = "FLAG_1";
198+
AutoFlagsPerServer flagsPerServer = new AutoFlagsPerServer();
199+
flagsPerServer.autoFlagDetails = Arrays.asList(flag);
200+
when(mockGFlagsValidation.extractAutoFlags(any(), anyString())).thenReturn(flagsPerServer);
201+
when(mockGFlagsValidation.getYsqlMigrationFilesList("2024.2.2.0-b1"))
202+
.thenReturn(ImmutableSet.of("file1.sql"));
203+
when(mockGFlagsValidation.getYsqlMigrationFilesList("2024.2.3.0-b1"))
204+
.thenReturn(ImmutableSet.of("file1.sql"));
205+
206+
CheckUpgrade task = AbstractTaskBase.createTask(CheckUpgrade.class);
207+
task.initialize(params);
208+
PlatformServiceException exception =
209+
assertThrows(PlatformServiceException.class, () -> task.run());
210+
assertEquals(BAD_REQUEST, exception.getHttpStatus());
211+
assertTrue(exception.getMessage().contains("2024.2.3.0-b1"));
212+
}
213+
214+
@Test
215+
public void testYsqlMajorUpgradePassesStableWhenRuntimeMinimumLowered() throws Exception {
216+
factory
217+
.forUniverse(defaultUniverse)
218+
.setValue(UniverseConfKeys.ysqlMajorUpgradeMinStableDbVersion.getKey(), "2024.2.1.0-b1");
219+
TestHelper.updateUniverseVersion(defaultUniverse, "2024.2.2.0-b1");
220+
CheckUpgrade.Params params = new CheckUpgrade.Params();
221+
params.setUniverseUUID(defaultUniverse.getUniverseUUID());
222+
params.ybSoftwareVersion = "2024.2.3.0-b1";
223+
when(mockGFlagsValidation.ysqlMajorVersionUpgrade(anyString(), anyString())).thenReturn(true);
224+
when(mockAutoFlagUtil.getPromotedAutoFlags(any(), any(), anyInt()))
225+
.thenReturn(ImmutableSet.of("FLAG_1"));
226+
AutoFlagDetails flag = new AutoFlagDetails();
227+
flag.name = "FLAG_1";
228+
AutoFlagsPerServer flagsPerServer = new AutoFlagsPerServer();
229+
flagsPerServer.autoFlagDetails = Arrays.asList(flag);
230+
when(mockGFlagsValidation.extractAutoFlags(any(), anyString())).thenReturn(flagsPerServer);
231+
when(mockGFlagsValidation.getYsqlMigrationFilesList("2024.2.2.0-b1"))
232+
.thenReturn(ImmutableSet.of("file1.sql"));
233+
when(mockGFlagsValidation.getYsqlMigrationFilesList("2024.2.3.0-b1"))
234+
.thenReturn(ImmutableSet.of("file1.sql"));
235+
236+
CheckUpgrade task = AbstractTaskBase.createTask(CheckUpgrade.class);
237+
task.initialize(params);
238+
task.run();
239+
}
240+
241+
@Test
242+
public void testYsqlMajorUpgradeRejectsPreviewBelowHardcodedMinimum() throws Exception {
243+
TestHelper.updateUniverseVersion(defaultUniverse, "2.23.0.0-b1");
244+
CheckUpgrade.Params params = new CheckUpgrade.Params();
245+
params.setUniverseUUID(defaultUniverse.getUniverseUUID());
246+
params.ybSoftwareVersion = "2.25.0.0-b1";
247+
when(mockGFlagsValidation.ysqlMajorVersionUpgrade(anyString(), anyString())).thenReturn(true);
248+
when(mockAutoFlagUtil.getPromotedAutoFlags(any(), any(), anyInt()))
249+
.thenReturn(ImmutableSet.of("FLAG_1"));
250+
AutoFlagDetails flag = new AutoFlagDetails();
251+
flag.name = "FLAG_1";
252+
AutoFlagsPerServer flagsPerServer = new AutoFlagsPerServer();
253+
flagsPerServer.autoFlagDetails = Arrays.asList(flag);
254+
when(mockGFlagsValidation.extractAutoFlags(any(), anyString())).thenReturn(flagsPerServer);
255+
when(mockGFlagsValidation.getYsqlMigrationFilesList("2.23.0.0-b1"))
256+
.thenReturn(ImmutableSet.of("file1.sql"));
257+
when(mockGFlagsValidation.getYsqlMigrationFilesList("2.25.0.0-b1"))
258+
.thenReturn(ImmutableSet.of("file1.sql"));
259+
260+
CheckUpgrade task = AbstractTaskBase.createTask(CheckUpgrade.class);
261+
task.initialize(params);
262+
PlatformServiceException exception =
263+
assertThrows(PlatformServiceException.class, () -> task.run());
264+
assertEquals(BAD_REQUEST, exception.getHttpStatus());
265+
assertTrue(exception.getMessage().contains("2.25.0.0-b1"));
266+
}
185267
}

0 commit comments

Comments
 (0)