Skip to content

Commit 56f2cec

Browse files
author
vividcoder
committed
fix(config): fix ARM64 test failure by adding config validation
The test failed on ARM64 because Storage.getDbEngineFromConfig() silently overrode the user's config to ROCKSDB, which is unreasonable as it hides incompatible configuration from the user. Replace the silent override with an explicit validateConfig() check in Args that fails fast with IllegalArgumentException when LevelDB is configured on ARM64. This makes the incompatibility visible instead of silently swallowed.
1 parent c4cb0e1 commit 56f2cec

3 files changed

Lines changed: 25 additions & 11 deletions

File tree

common/src/main/java/org/tron/core/config/args/Storage.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.apache.commons.lang3.StringUtils;
3030
import org.iq80.leveldb.CompressionType;
3131
import org.iq80.leveldb.Options;
32-
import org.tron.common.arch.Arch;
3332
import org.tron.common.cache.CacheStrategies;
3433
import org.tron.common.cache.CacheType;
3534
import org.tron.common.utils.DbOptionalsUtils;
@@ -90,7 +89,6 @@ public class Storage {
9089
* Default values of directory
9190
*/
9291
private static final String DEFAULT_DB_ENGINE = "LEVELDB";
93-
private static final String ROCKS_DB_ENGINE = "ROCKSDB";
9492
private static final boolean DEFAULT_DB_SYNC = false;
9593
private static final boolean DEFAULT_EVENT_SUBSCRIBE_CONTRACT_PARSE = true;
9694
private static final String DEFAULT_DB_DIRECTORY = "database";
@@ -175,11 +173,6 @@ public class Storage {
175173
private final Map<String, Sha256Hash> dbRoots = Maps.newConcurrentMap();
176174

177175
public static String getDbEngineFromConfig(final Config config) {
178-
if (Arch.isArm64()) {
179-
// if is arm64 but config is leveldb, should throw exception?
180-
logger.warn("Arm64 architecture detected, using RocksDB as db engine, ignore config.");
181-
return ROCKS_DB_ENGINE;
182-
}
183176
return config.hasPath(DB_ENGINE_CONFIG_KEY)
184177
? config.getString(DB_ENGINE_CONFIG_KEY) : DEFAULT_DB_ENGINE;
185178
}

framework/src/main/java/org/tron/core/config/args/Args.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,20 @@ public static void setParam(final String[] args, final String confFileName) {
130130

131131
// 4. Init witness (depends on CLI witness flag)
132132
initLocalWitnesses(config, cmd);
133+
134+
// 5. Validate final configuration
135+
validateConfig();
136+
}
137+
138+
/**
139+
* Validate the final configuration after all layers (defaults, config, CLI) are applied.
140+
* Fails fast on incompatible configurations.
141+
*/
142+
private static void validateConfig() {
143+
if (Arch.isArm64() && "LEVELDB".equalsIgnoreCase(PARAMETER.storage.getDbEngine())) {
144+
throw new IllegalArgumentException(
145+
"LevelDB is not supported on ARM64 architecture, please use ROCKSDB");
146+
}
133147
}
134148

135149
/**

framework/src/test/java/org/tron/core/config/args/ArgsTest.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.tron.common.utils.DecodeUtil;
3939
import org.tron.common.utils.LocalWitnesses;
4040
import org.tron.common.utils.PublicMethod;
41+
import org.tron.common.arch.Arch;
4142
import org.tron.core.config.Configuration;
4243

4344
@Slf4j
@@ -323,15 +324,21 @@ public void testCliOverridesStorageConfig() {
323324
*
324325
* <p>config-test.conf defines: db.directory = "database", db.engine = "LEVELDB".
325326
* Without any CLI storage arguments, the Storage object should use these config values.
327+
* On ARM64, LEVELDB is not supported and validateConfig() should throw.
326328
*/
327329
@Test
328330
public void testConfigStorageDefaults() {
329-
Args.setParam(new String[] {}, TestConstants.TEST_CONF);
331+
if (Arch.isArm64()) {
332+
Assert.assertThrows(IllegalArgumentException.class,
333+
() -> Args.setParam(new String[] {}, TestConstants.TEST_CONF));
334+
} else {
335+
Args.setParam(new String[] {}, TestConstants.TEST_CONF);
330336

331-
CommonParameter parameter = Args.getInstance();
337+
CommonParameter parameter = Args.getInstance();
332338

333-
Assert.assertEquals("database", parameter.getStorage().getDbDirectory());
334-
Assert.assertEquals("LEVELDB", parameter.getStorage().getDbEngine());
339+
Assert.assertEquals("database", parameter.getStorage().getDbDirectory());
340+
Assert.assertEquals("LEVELDB", parameter.getStorage().getDbEngine());
341+
}
335342

336343
Args.clearParam();
337344
}

0 commit comments

Comments
 (0)