Skip to content

Commit 1aabd2e

Browse files
committed
handle autoUpgrade case with test
1 parent 8b27b06 commit 1aabd2e

File tree

6 files changed

+71
-30
lines changed

6 files changed

+71
-30
lines changed

hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/upgrade/DowngradeHandler.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,4 @@ public interface DowngradeHandler {
4444
Pair<Map<ConfigProperty, String>, List<ConfigProperty>> downgrade(
4545
HoodieWriteConfig config, HoodieEngineContext context, String instantTime,
4646
SupportsUpgradeDowngrade upgradeDowngradeHelper);
47-
4847
}

hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/upgrade/EightToSevenDowngradeHandler.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,6 @@
9494
public class EightToSevenDowngradeHandler implements DowngradeHandler {
9595

9696
private static final Logger LOG = LoggerFactory.getLogger(EightToSevenDowngradeHandler.class);
97-
98-
9997
private static final Set<String> SUPPORTED_METADATA_PARTITION_PATHS = getSupportedMetadataPartitionPaths();
10098

10199
@Override

hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/upgrade/NineToEightDowngradeHandler.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import java.util.Map;
3131

3232
public class NineToEightDowngradeHandler implements DowngradeHandler {
33-
3433
@Override
3534
public Pair<Map<ConfigProperty, String>, List<ConfigProperty>> downgrade(HoodieWriteConfig config,
3635
HoodieEngineContext context,

hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/upgrade/UpgradeDowngrade.java

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ public class UpgradeDowngrade {
6363
Pair.of(8, 9) // EightToNineUpgradeHandler
6464
));
6565

66-
private static final Set<Pair<Integer, Integer>> DOWNGRADE_HANDLERS_REQUIRING_ROLLBACK_AND_COMPACT = new HashSet<>(Arrays.asList(
66+
private static final Set<Pair<Integer, Integer>> DOWNGRADE_HANDLERS_REQUIRING_ROLLBACK_ANDCOMPACT = new HashSet<>(Arrays.asList(
6767
Pair.of(8, 7), // EightToSevenDowngradeHandler
6868
Pair.of(9, 8), // NineToEightDowngradeHandler
69-
Pair.of(6, 5) // SixToFiveDowngradeHadler
69+
Pair.of(6, 5) // SixToFiveDowngradeHandler
7070
));
7171

7272
private final SupportsUpgradeDowngrade upgradeDowngradeHelper;
@@ -147,12 +147,22 @@ public boolean needsUpgrade(HoodieTableVersion toWriteVersion) {
147147
public void run(HoodieTableVersion toVersion, String instantTime) {
148148
// Fetch version from property file and current version
149149
HoodieTableVersion fromVersion = metaClient.getTableConfig().getTableVersion();
150+
// Determine if we are upgrading or downgrading
151+
boolean isUpgrade = fromVersion.versionCode() < toVersion.versionCode();
152+
if (isUpgrade && !config.autoUpgrade()) {
153+
// if we are attempting to upgrade and auto-upgrade is disabled
154+
// we set the write config table version to bounded by the current hudi table version
155+
// and then exit out the upgrade process
156+
LOG.warn("AUTO_UPGRADE_VERSION was explicitly disabled, skipping table version upgrade process");
157+
return;
158+
}
159+
150160
if (!needsUpgradeOrDowngrade(toVersion)) {
151161
return;
152162
}
153163

154-
// Perform rollback and compaction if any handlers need it - this must happen at the very beginning
155-
rollbackAndCompactIfNeeded(fromVersion, toVersion);
164+
// Perform rollback and compaction only if a specific handler requires it, before upgrade/downgrade process
165+
performRollbackAndCompactionIfRequired(fromVersion, toVersion, isUpgrade);
156166

157167
// Change metadata table version automatically
158168
if (toVersion.versionCode() >= HoodieTableVersion.FOUR.versionCode()) {
@@ -179,8 +189,7 @@ public void run(HoodieTableVersion toVersion, String instantTime) {
179189
LOG.info("Attempting to move table from version " + fromVersion + " to " + toVersion);
180190
Map<ConfigProperty, String> tablePropsToAdd = new Hashtable<>();
181191
List<ConfigProperty> tablePropsToRemove = new ArrayList<>();
182-
boolean isDowngrade = false;
183-
if (fromVersion.versionCode() < toVersion.versionCode()) {
192+
if (isUpgrade) {
184193
// upgrade
185194
while (fromVersion.versionCode() < toVersion.versionCode()) {
186195
HoodieTableVersion nextVersion = HoodieTableVersion.fromVersionCode(fromVersion.versionCode() + 1);
@@ -189,7 +198,6 @@ public void run(HoodieTableVersion toVersion, String instantTime) {
189198
}
190199
} else {
191200
// downgrade
192-
isDowngrade = true;
193201
while (fromVersion.versionCode() > toVersion.versionCode()) {
194202
HoodieTableVersion prevVersion = HoodieTableVersion.fromVersionCode(fromVersion.versionCode() - 1);
195203
Pair<Map<ConfigProperty, String>, List<ConfigProperty>> tablePropsToAddAndRemove = downgrade(fromVersion, prevVersion, instantTime);
@@ -222,7 +230,7 @@ public void run(HoodieTableVersion toVersion, String instantTime) {
222230
HoodieTableConfig.update(metaClient.getStorage(),
223231
metaClient.getMetaPath(), metaClient.getTableConfig().getProps());
224232

225-
if (metaClient.getTableConfig().isMetadataTableAvailable() && toVersion.equals(HoodieTableVersion.SIX) && isDowngrade) {
233+
if (metaClient.getTableConfig().isMetadataTableAvailable() && toVersion.equals(HoodieTableVersion.SIX) && !isUpgrade) {
226234
// NOTE: Add empty deltacommit to metadata table. The compaction instant format has changed in version 8.
227235
// It no longer has a suffix of "001" for the compaction instant. Due to that, the timeline instant
228236
// comparison logic in metadata table will fail after LSM timeline downgrade.
@@ -297,22 +305,20 @@ protected Pair<Map<ConfigProperty, String>, List<ConfigProperty>> downgrade(Hood
297305
}
298306

299307
/**
300-
* Checks if any handlers in the upgrade/downgrade path need rollback and compaction and performs it once before starting.
301-
* This ensures rollback and compaction happens only when needed and only once at the very beginning of the process.
308+
* Checks if any handlers in the upgrade/downgrade path require running rollback and compaction before starting process.
302309
*
303310
* @param fromVersion the current table version
304311
* @param toVersion the target table version
305312
*/
306-
private void rollbackAndCompactIfNeeded(HoodieTableVersion fromVersion, HoodieTableVersion toVersion) {
307-
// Check if any handlers in the upgrade/downgrade path need rollback and compaction
308-
boolean needsRollbackAndCompact = false;
309-
if (fromVersion.versionCode() < toVersion.versionCode()) {
313+
private void performRollbackAndCompactionIfRequired(HoodieTableVersion fromVersion, HoodieTableVersion toVersion, boolean isUpgrade) {
314+
boolean requireRollbackAndCompaction = false;
315+
if (isUpgrade) {
310316
// Check upgrade handlers
311317
HoodieTableVersion checkVersion = fromVersion;
312318
while (checkVersion.versionCode() < toVersion.versionCode()) {
313319
HoodieTableVersion nextVersion = HoodieTableVersion.fromVersionCode(checkVersion.versionCode() + 1);
314320
if (UPGRADE_HANDLERS_REQUIRING_ROLLBACK_AND_COMPACT.contains(Pair.of(checkVersion.versionCode(), nextVersion.versionCode()))) {
315-
needsRollbackAndCompact = true;
321+
requireRollbackAndCompaction = true;
316322
break;
317323
}
318324
checkVersion = nextVersion;
@@ -322,21 +328,17 @@ private void rollbackAndCompactIfNeeded(HoodieTableVersion fromVersion, HoodieTa
322328
HoodieTableVersion checkVersion = fromVersion;
323329
while (checkVersion.versionCode() > toVersion.versionCode()) {
324330
HoodieTableVersion prevVersion = HoodieTableVersion.fromVersionCode(checkVersion.versionCode() - 1);
325-
if (DOWNGRADE_HANDLERS_REQUIRING_ROLLBACK_AND_COMPACT.contains(Pair.of(checkVersion.versionCode(), prevVersion.versionCode()))) {
326-
needsRollbackAndCompact = true;
331+
if (DOWNGRADE_HANDLERS_REQUIRING_ROLLBACK_ANDCOMPACT.contains(Pair.of(checkVersion.versionCode(), prevVersion.versionCode()))) {
332+
requireRollbackAndCompaction = true;
327333
break;
328334
}
329335
checkVersion = prevVersion;
330336
}
331337
}
332-
333-
// Perform rollback and compaction once if any handler needs it
334-
if (needsRollbackAndCompact) {
335-
LOG.info("Performing rollback and compaction before upgrade/downgrade operations");
336-
HoodieTable table = upgradeDowngradeHelper.getTable(config, context);
337-
UpgradeDowngradeUtils.rollbackFailedWritesAndCompact(table, context, config, upgradeDowngradeHelper,
338-
HoodieTableType.MERGE_ON_READ.equals(metaClient.getTableType()),
339-
metaClient.getTableConfig().getTableVersion());
338+
if (requireRollbackAndCompaction) {
339+
LOG.info("Rolling back failed writes and compacting table before upgrade/downgrade");
340+
UpgradeDowngradeUtils.rollbackFailedWritesAndCompact(upgradeDowngradeHelper.getTable(config, context),
341+
context, config, upgradeDowngradeHelper, HoodieTableType.MERGE_ON_READ.equals(metaClient.getTableType()), metaClient.getTableConfig().getTableVersion());
340342
}
341343
}
342344
}

hudi-client/hudi-client-common/src/main/java/org/apache/hudi/table/upgrade/UpgradeHandler.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,4 @@ public interface UpgradeHandler {
4141
Map<ConfigProperty, String> upgrade(
4242
HoodieWriteConfig config, HoodieEngineContext context, String instantTime,
4343
SupportsUpgradeDowngrade upgradeDowngradeHelper);
44-
4544
}

hudi-client/hudi-spark-client/src/test/java/org/apache/hudi/table/upgrade/TestUpgradeDowngrade.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,50 @@ public void testUpgradeFourToFiveWithMetadataTableFailure() throws Exception {
460460
"Main table version should remain unchanged when metadata table upgrade fails");
461461
}
462462

463+
@Test
464+
public void testAutoUpgradeDisabledDuringUpgrade() throws Exception {
465+
// Follow same setup of testUpgradeFourToFiveInternal
466+
String tableName = metaClient.getTableConfig().getTableName();
467+
cleanUp();
468+
initSparkContexts();
469+
initPath();
470+
initTestDataGenerator();
471+
472+
Map<String, String> params = new HashMap<>();
473+
addNewTableParamsToProps(params, tableName);
474+
Properties properties = new Properties();
475+
params.forEach((k, v) -> properties.setProperty(k, v));
476+
477+
initMetaClient(getTableType(), properties);
478+
// Create config with auto-upgrade disabled
479+
HoodieWriteConfig cfg = getConfigBuilder()
480+
.withRollbackUsingMarkers(false)
481+
.withWriteTableVersion(6)
482+
.withAutoUpgradeVersion(false) // Disable auto-upgrade
483+
.withProps(params)
484+
.build();
485+
486+
SparkRDDWriteClient client = getHoodieWriteClient(cfg);
487+
// Write inserts to establish table
488+
doInsert(client);
489+
490+
// Downgrade to version 4 first
491+
downgradeTableConfigsFromFiveToFour(cfg);
492+
493+
metaClient = HoodieTableMetaClient.reload(metaClient);
494+
HoodieTableVersion originalVersion = metaClient.getTableConfig().getTableVersion();
495+
assertEquals(HoodieTableVersion.FOUR, originalVersion, "Table should be at version 4 before test");
496+
497+
// Attempt upgrade from version 4 to 5 with auto-upgrade disabled
498+
new UpgradeDowngrade(metaClient, cfg, context, SparkUpgradeDowngradeHelper.getInstance())
499+
.run(HoodieTableVersion.FIVE, null);
500+
501+
// Verify that upgrade was skipped and table version remains unchanged
502+
metaClient = HoodieTableMetaClient.reload(metaClient);
503+
assertEquals(HoodieTableVersion.FOUR, metaClient.getTableConfig().getTableVersion(),
504+
"Table version should remain at 4 when auto-upgrade is disabled");
505+
}
506+
463507
private void testUpgradeFourToFiveInternal(boolean assertDefaultPartition, boolean skipDefaultPartitionValidation, boolean isHiveStyle) throws Exception {
464508
String tableName = metaClient.getTableConfig().getTableName();
465509
// clean up and re instantiate meta client w/ right table props

0 commit comments

Comments
 (0)