diff --git a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java
index 72bdd80d64e..54cdbf96ca1 100644
--- a/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java
+++ b/chainbase/src/main/java/org/tron/common/storage/leveldb/LevelDbDataSourceImpl.java
@@ -18,10 +18,8 @@
import static org.fusesource.leveldbjni.JniDBFactory.factory;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Strings;
import com.google.common.collect.Sets;
import com.google.common.primitives.Bytes;
-import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -53,7 +51,6 @@
import org.tron.common.storage.WriteOptionsWrapper;
import org.tron.common.storage.metric.DbStat;
import org.tron.common.utils.FileUtil;
-import org.tron.common.utils.PropUtil;
import org.tron.common.utils.StorageUtils;
import org.tron.core.db.common.DbSourceInter;
import org.tron.core.db.common.iterator.StoreIterator;
@@ -73,9 +70,7 @@ public class LevelDbDataSourceImpl extends DbStat implements DbSourceInter.
*/
+
package org.tron.core.db.common;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import java.io.File;
+import java.nio.file.Paths;
import java.util.Map;
import java.util.Set;
+import org.tron.common.utils.FileUtil;
+import org.tron.common.utils.PropUtil;
import org.tron.core.db2.common.WrappedByteArray;
+import org.tron.core.exception.TronError;
public interface DbSourceInter extends BatchSourceInter,
Iterable> {
+ String ENGINE_KEY = "ENGINE";
+ String ENGINE_FILE = "engine.properties";
+ String ROCKSDB = "ROCKSDB";
+ String LEVELDB = "LEVELDB";
+
String getDBName();
void setDBName(String name);
@@ -53,4 +65,34 @@ public interface DbSourceInter extends BatchSourceInter,
Map prefixQuery(byte[] key);
+ static void checkOrInitEngine(String expectedEngine, String dir, TronError.ErrCode errCode) {
+ String engineFile = Paths.get(dir, ENGINE_FILE).toString();
+ File currentFile = new File(dir, "CURRENT");
+ if (ROCKSDB.equals(expectedEngine) && currentFile.exists()
+ && !Paths.get(engineFile).toFile().exists()) {
+ // if the CURRENT file exists, but the engine.properties file does not exist, it is LevelDB
+ // 000003.log CURRENT LOCK MANIFEST-000002
+ throw new TronError(
+ String.format("Cannot open %s database with %s engine.", LEVELDB, ROCKSDB), errCode);
+ }
+ if (FileUtil.createDirIfNotExists(dir)) {
+ if (!FileUtil.createFileIfNotExists(engineFile)) {
+ throw new TronError(String.format("Cannot create file: %s.", engineFile), errCode);
+ }
+ } else {
+ throw new TronError(String.format("Cannot create dir: %s.", dir), errCode);
+ }
+ String actualEngine = PropUtil.readProperty(engineFile, ENGINE_KEY);
+ // engine init
+ if (Strings.isNullOrEmpty(actualEngine)
+ && !PropUtil.writeProperty(engineFile, ENGINE_KEY, expectedEngine)) {
+ throw new TronError(String.format("Cannot write file: %s.", engineFile), errCode);
+ }
+ actualEngine = PropUtil.readProperty(engineFile, ENGINE_KEY);
+ if (!expectedEngine.equals(actualEngine)) {
+ throw new TronError(String.format(
+ "Cannot open %s database with %s engine.",
+ actualEngine, expectedEngine), errCode);
+ }
+ }
}
diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java
index edd91041f62..bbc3acfaec9 100644
--- a/framework/src/main/java/org/tron/core/config/args/Args.java
+++ b/framework/src/main/java/org/tron/core/config/args/Args.java
@@ -372,7 +372,7 @@ private static Map getOptionGroup() {
* set parameters.
*/
public static void setParam(final String[] args, final String confFileName) {
- Arch.throwUnsupportedJavaException();
+ Arch.throwIfUnsupportedJavaVersion();
clearParam(); // reset all parameters to avoid the influence in test
JCommander.newBuilder().addObject(PARAMETER).build().parse(args);
if (PARAMETER.version) {
diff --git a/framework/src/test/java/org/tron/common/storage/CheckOrInitEngineTest.java b/framework/src/test/java/org/tron/common/storage/CheckOrInitEngineTest.java
new file mode 100644
index 00000000000..90aac10c0b6
--- /dev/null
+++ b/framework/src/test/java/org/tron/common/storage/CheckOrInitEngineTest.java
@@ -0,0 +1,263 @@
+package org.tron.common.storage;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mockStatic;
+import static org.tron.core.db.common.DbSourceInter.ENGINE_FILE;
+import static org.tron.core.db.common.DbSourceInter.ENGINE_KEY;
+import static org.tron.core.db.common.DbSourceInter.LEVELDB;
+import static org.tron.core.db.common.DbSourceInter.ROCKSDB;
+import static org.tron.core.db.common.DbSourceInter.checkOrInitEngine;
+
+import com.google.common.base.Strings;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Paths;
+import org.junit.After;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.tron.common.utils.FileUtil;
+import org.tron.common.utils.PropUtil;
+import org.tron.core.exception.TronError;
+
+
+public class CheckOrInitEngineTest {
+
+ @Rule
+ public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+ private static final String ACCOUNT = "account";
+
+ @After
+ public void clearMocks() {
+ Mockito.clearAllCaches();
+ }
+
+ @Test
+ public void testLevelDbDetectedWhenExpectingRocksDb() throws IOException {
+ try (MockedStatic fileUtil = mockStatic(FileUtil.class);
+ MockedStatic propUtil = mockStatic(PropUtil.class);
+ MockedStatic strings = mockStatic(Strings.class)) {
+
+ String dir = temporaryFolder.newFolder(ACCOUNT).toString();
+ File currentFile = new File(dir, "CURRENT");
+ assertTrue(currentFile.createNewFile());
+ TronError.ErrCode errCode = TronError.ErrCode.ROCKSDB_INIT;
+ TronError exception = assertThrows(TronError.class, () ->
+ checkOrInitEngine(ROCKSDB, dir, errCode));
+ assertEquals("Cannot open LEVELDB database with ROCKSDB engine.",
+ exception.getMessage());
+ assertEquals(errCode, exception.getErrCode());
+ }
+ }
+
+ @Test
+ public void testCannotCreateDir() {
+ try (MockedStatic fileUtil = mockStatic(FileUtil.class)) {
+ String dir = "/invalid/path/that/cannot/be/created";
+
+ fileUtil.when(() -> FileUtil.createDirIfNotExists(dir)).thenReturn(false);
+ TronError.ErrCode errCode = TronError.ErrCode.LEVELDB_INIT;
+ TronError exception = assertThrows(TronError.class, () ->
+ checkOrInitEngine(LEVELDB, dir, errCode));
+ assertEquals("Cannot create dir: " + dir + ".", exception.getMessage());
+ assertEquals(errCode, exception.getErrCode());
+ }
+ }
+
+ @Test
+ public void testCannotCreateEngineFile() throws IOException {
+ try (MockedStatic fileUtil = mockStatic(FileUtil.class)) {
+ String dir = temporaryFolder.newFolder().toString();
+ String engineFile = Paths.get(dir, ENGINE_FILE).toString();
+ fileUtil.when(() -> FileUtil.createDirIfNotExists(dir)).thenReturn(true);
+ fileUtil.when(() -> FileUtil.createFileIfNotExists(engineFile)).thenReturn(false);
+ TronError.ErrCode errCode = TronError.ErrCode.ROCKSDB_INIT;
+ TronError exception = assertThrows(TronError.class, () ->
+ checkOrInitEngine(ROCKSDB, dir, errCode));
+
+ assertEquals("Cannot create file: " + engineFile + ".", exception.getMessage());
+ assertEquals(errCode, exception.getErrCode());
+ }
+ }
+
+ @Test
+ public void testCannotWritePropertyFile() throws IOException {
+ try (MockedStatic fileUtil = mockStatic(FileUtil.class);
+ MockedStatic propUtil = mockStatic(PropUtil.class);
+ MockedStatic strings = mockStatic(Strings.class)) {
+
+ String dir = temporaryFolder.newFolder().toString();
+ String engineFile = Paths.get(dir, ENGINE_FILE).toString();
+
+ fileUtil.when(() -> FileUtil.createDirIfNotExists(dir)).thenReturn(true);
+ fileUtil.when(() -> FileUtil.createFileIfNotExists(engineFile)).thenReturn(true);
+
+ propUtil.when(() -> PropUtil.readProperty(engineFile, ENGINE_KEY)).thenReturn(null);
+ strings.when(() -> Strings.isNullOrEmpty(null)).thenReturn(true);
+
+ propUtil.when(() -> PropUtil.writeProperty(engineFile, ENGINE_KEY, ROCKSDB))
+ .thenReturn(false);
+
+ TronError.ErrCode errCode = TronError.ErrCode.LEVELDB_INIT;
+
+ TronError exception = assertThrows(TronError.class, () ->
+ checkOrInitEngine(ROCKSDB, dir, errCode));
+
+ assertEquals("Cannot write file: " + engineFile + ".", exception.getMessage());
+ assertEquals(errCode, exception.getErrCode());
+ }
+
+ }
+
+ @Test
+ public void testEngineMismatch() throws IOException {
+ try (MockedStatic fileUtil = mockStatic(FileUtil.class);
+ MockedStatic propUtil = mockStatic(PropUtil.class);
+ MockedStatic strings = mockStatic(Strings.class)) {
+
+ String dir = temporaryFolder.newFolder(ACCOUNT).toString();
+ String engineFile = Paths.get(dir, ENGINE_FILE).toString();
+
+ fileUtil.when(() -> FileUtil.createDirIfNotExists(dir)).thenReturn(true);
+ fileUtil.when(() -> FileUtil.createFileIfNotExists(engineFile)).thenReturn(true);
+
+ propUtil.when(() -> PropUtil.readProperty(engineFile, ENGINE_KEY)).thenReturn(LEVELDB);
+ strings.when(() -> Strings.isNullOrEmpty(LEVELDB)).thenReturn(false);
+
+ TronError.ErrCode errCode = TronError.ErrCode.ROCKSDB_INIT;
+
+ TronError exception = assertThrows(TronError.class, () ->
+ checkOrInitEngine(ROCKSDB, dir, errCode));
+
+ assertEquals("Cannot open LEVELDB database with ROCKSDB engine.",
+ exception.getMessage());
+ assertEquals(errCode, exception.getErrCode());
+ }
+ }
+
+ @Test
+ public void testSuccessfulFirstTimeInit() throws IOException {
+ try (MockedStatic fileUtil = mockStatic(FileUtil.class);
+ MockedStatic propUtil = mockStatic(PropUtil.class);
+ MockedStatic strings = mockStatic(Strings.class)) {
+
+ String dir = temporaryFolder.newFolder(ACCOUNT).toString();
+ String engineFile = Paths.get(dir, ENGINE_FILE).toString();
+
+ fileUtil.when(() -> FileUtil.createDirIfNotExists(dir)).thenReturn(true);
+ fileUtil.when(() -> FileUtil.createFileIfNotExists(engineFile)).thenReturn(true);
+
+ propUtil.when(() -> PropUtil.readProperty(engineFile, ENGINE_KEY))
+ .thenReturn(null)
+ .thenReturn(LEVELDB);
+ strings.when(() -> Strings.isNullOrEmpty(null)).thenReturn(true);
+
+ propUtil.when(() -> PropUtil.writeProperty(engineFile, ENGINE_KEY, LEVELDB))
+ .thenReturn(true);
+
+ TronError.ErrCode errCode = TronError.ErrCode.LEVELDB_INIT;
+ checkOrInitEngine(LEVELDB, dir, errCode);
+ }
+ }
+
+ @Test
+ public void testSuccessfulExistingEngine() throws IOException {
+ try (MockedStatic fileUtil = mockStatic(FileUtil.class);
+ MockedStatic propUtil = mockStatic(PropUtil.class);
+ MockedStatic strings = mockStatic(Strings.class)) {
+
+ String dir = temporaryFolder.newFolder(ACCOUNT).toString();
+ String engineFile = Paths.get(dir, ENGINE_FILE).toString();
+
+ fileUtil.when(() -> FileUtil.createDirIfNotExists(dir)).thenReturn(true);
+ fileUtil.when(() -> FileUtil.createFileIfNotExists(engineFile)).thenReturn(true);
+ propUtil.when(() -> PropUtil.readProperty(engineFile, ENGINE_KEY)).thenReturn(ROCKSDB);
+ strings.when(() -> Strings.isNullOrEmpty(ROCKSDB)).thenReturn(false);
+
+ TronError.ErrCode errCode = TronError.ErrCode.ROCKSDB_INIT;
+ checkOrInitEngine(ROCKSDB, dir, errCode);
+ }
+ }
+
+ @Test
+ /**
+ * 000003.log CURRENT LOCK MANIFEST-000002
+ */
+ public void testCurrentFileExistsWithNoEngineFile() throws IOException {
+ try (MockedStatic fileUtil = mockStatic(FileUtil.class);
+ MockedStatic propUtil = mockStatic(PropUtil.class);
+ MockedStatic strings = mockStatic(Strings.class)) {
+
+ String dir = temporaryFolder.newFolder(ACCOUNT).toString();
+ String engineFile = Paths.get(dir, ENGINE_FILE).toString();
+ File currentFile = new File(dir, "CURRENT");
+ assertTrue(currentFile.createNewFile());
+
+ fileUtil.when(() -> FileUtil.createDirIfNotExists(dir)).thenReturn(true);
+ fileUtil.when(() -> FileUtil.createFileIfNotExists(engineFile)).thenReturn(true);
+ propUtil.when(() -> PropUtil.readProperty(engineFile, ENGINE_KEY)).thenReturn(LEVELDB);
+ strings.when(() -> Strings.isNullOrEmpty(LEVELDB)).thenReturn(false);
+
+ TronError.ErrCode errCode = TronError.ErrCode.LEVELDB_INIT;
+
+ checkOrInitEngine(LEVELDB, dir, errCode);
+ }
+ }
+
+ @Test
+ /**
+ * 000003.log CURRENT LOCK MANIFEST-000002 engine.properties(RocksDB)
+ */
+ public void testCurrentFileExistsEngineFileExists() throws IOException {
+ try (MockedStatic fileUtil = mockStatic(FileUtil.class);
+ MockedStatic propUtil = mockStatic(PropUtil.class);
+ MockedStatic strings = mockStatic(Strings.class)) {
+
+ String dir = temporaryFolder.newFolder(ACCOUNT).toString();
+ String engineFile = Paths.get(dir, ENGINE_FILE).toString();
+
+ File currentFile = new File(dir, "CURRENT");
+ File engineFileObj = new File(engineFile);
+ assertTrue(currentFile.createNewFile());
+ assertTrue(engineFileObj.createNewFile());
+
+
+ fileUtil.when(() -> FileUtil.createDirIfNotExists(dir)).thenReturn(true);
+ fileUtil.when(() -> FileUtil.createFileIfNotExists(engineFile)).thenReturn(true);
+
+ propUtil.when(() -> PropUtil.readProperty(engineFile, ENGINE_KEY)).thenReturn(ROCKSDB);
+ strings.when(() -> Strings.isNullOrEmpty(ROCKSDB)).thenReturn(false);
+
+ TronError.ErrCode errCode = TronError.ErrCode.ROCKSDB_INIT;
+ checkOrInitEngine(ROCKSDB, dir, errCode);
+ }
+ }
+
+ @Test
+ public void testEmptyStringEngine() throws IOException {
+ try (MockedStatic fileUtil = mockStatic(FileUtil.class);
+ MockedStatic propUtil = mockStatic(PropUtil.class);
+ MockedStatic strings = mockStatic(Strings.class)) {
+
+ String dir = temporaryFolder.newFolder("account").toString();
+ String engineFile = Paths.get(dir, ENGINE_FILE).toString();
+
+ fileUtil.when(() -> FileUtil.createDirIfNotExists(dir)).thenReturn(true);
+ fileUtil.when(() -> FileUtil.createFileIfNotExists(engineFile)).thenReturn(true);
+
+ propUtil.when(() -> PropUtil.readProperty(engineFile, ENGINE_KEY))
+ .thenReturn("").thenReturn(ROCKSDB);
+ strings.when(() -> Strings.isNullOrEmpty("")).thenReturn(true);
+
+ propUtil.when(() -> PropUtil.writeProperty(engineFile, ENGINE_KEY, ROCKSDB))
+ .thenReturn(true);
+ TronError.ErrCode errCode = TronError.ErrCode.ROCKSDB_INIT;
+ checkOrInitEngine(ROCKSDB, dir, errCode);
+ }
+ }
+}
diff --git a/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java b/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java
index c8b29c3020d..b5cfd15761e 100644
--- a/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java
+++ b/framework/src/test/java/org/tron/common/storage/leveldb/LevelDbDataSourceImplTest.java
@@ -421,11 +421,8 @@ public void testCheckOrInitEngine() {
try {
dataSource = new LevelDbDataSourceImpl(dir, "test_engine");
dataSource.initDB();
- } catch (Exception e) {
- Assert.assertEquals(String.format(
- "Cannot open RocksDB database '%s' with LevelDB engine."
- + " Set db.engine=ROCKSDB or use LevelDB database. ", "test_engine"),
- e.getMessage());
+ } catch (TronError e) {
+ Assert.assertEquals("Cannot open ROCKSDB database with LEVELDB engine.", e.getMessage());
}
}
@@ -441,9 +438,7 @@ public void testLevelDbOpenRocksDb() {
rocksDb.closeDB();
LevelDbDataSourceImpl levelDB =
new LevelDbDataSourceImpl(StorageUtils.getOutputDirectoryByDbName(name), name);
- exception.expectMessage(String.format(
- "Cannot open RocksDB database '%s' with LevelDB engine."
- + " Set db.engine=ROCKSDB or use LevelDB database. ", name));
+ exception.expectMessage("Cannot open ROCKSDB database with LEVELDB engine.");
levelDB.initDB();
}
diff --git a/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java b/framework/src/test/java/org/tron/common/storage/rocksdb/RocksDbDataSourceImplTest.java
similarity index 95%
rename from framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java
rename to framework/src/test/java/org/tron/common/storage/rocksdb/RocksDbDataSourceImplTest.java
index 8f42c44e3b9..3ccbb703710 100644
--- a/framework/src/test/java/org/tron/common/storage/leveldb/RocksDbDataSourceImplTest.java
+++ b/framework/src/test/java/org/tron/common/storage/rocksdb/RocksDbDataSourceImplTest.java
@@ -1,4 +1,4 @@
-package org.tron.common.storage.leveldb;
+package org.tron.common.storage.rocksdb;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -34,7 +34,7 @@
import org.tron.common.error.TronDBException;
import org.tron.common.parameter.CommonParameter;
import org.tron.common.storage.WriteOptionsWrapper;
-import org.tron.common.storage.rocksdb.RocksDbDataSourceImpl;
+import org.tron.common.storage.leveldb.LevelDbDataSourceImpl;
import org.tron.common.utils.ByteArray;
import org.tron.common.utils.FileUtil;
import org.tron.common.utils.PropUtil;
@@ -314,11 +314,8 @@ public void testCheckOrInitEngine() {
dataSource = new RocksDbDataSourceImpl(dir, "test_engine");
try {
dataSource.initDB();
- } catch (Exception e) {
- Assert.assertEquals(String.format(
- "Cannot open LevelDB database '%s' with RocksDB engine."
- + " Set db.engine=LEVELDB or use RocksDB database. ", "test_engine"),
- e.getMessage());
+ } catch (TronError e) {
+ Assert.assertEquals("Cannot open LEVELDB database with ROCKSDB engine.", e.getMessage());
}
Assert.assertNull(dataSource.getDatabase());
PropUtil.writeProperty(enginePath, "ENGINE", "ROCKSDB");
@@ -448,10 +445,7 @@ public void testRocksDbOpenLevelDb() {
levelDb.putData(key1, value1);
levelDb.closeDB();
RocksDbDataSourceImpl rocksDb = new RocksDbDataSourceImpl(output, name);
- expectedException.expectMessage(
- String.format(
- "Cannot open LevelDB database '%s' with RocksDB engine."
- + " Set db.engine=LEVELDB or use RocksDB database. ", name));
+ expectedException.expectMessage("Cannot open LEVELDB database with ROCKSDB engine.");
rocksDb.initDB();
}
@@ -474,10 +468,7 @@ public void testRocksDbOpenLevelDb2() {
}
Assert.assertFalse(engineFile.exists());
RocksDbDataSourceImpl rocksDb = new RocksDbDataSourceImpl(output, name);
- expectedException.expectMessage(
- String.format(
- "Cannot open LevelDB database '%s' with RocksDB engine."
- + " Set db.engine=LEVELDB or use RocksDB database. ", name));
+ expectedException.expectMessage("Cannot open LEVELDB database with ROCKSDB engine.");
rocksDb.initDB();
}
diff --git a/platform/src/main/java/common/org/tron/common/arch/Arch.java b/platform/src/main/java/common/org/tron/common/arch/Arch.java
index 20744d755a4..e9edf8945d4 100644
--- a/platform/src/main/java/common/org/tron/common/arch/Arch.java
+++ b/platform/src/main/java/common/org/tron/common/arch/Arch.java
@@ -69,7 +69,7 @@ public static boolean isJava8() {
return javaSpecificationVersion().equals("1.8");
}
- public static void throwUnsupportedJavaException() {
+ public static void throwIfUnsupportedJavaVersion() {
if (isX86() && !isJava8()) {
logger.info(withAll());
throw new UnsupportedOperationException(String.format(
@@ -78,9 +78,10 @@ public static void throwUnsupportedJavaException() {
}
}
- public static void throwUnsupportedArm64Exception() {
+ public static void throwIfUnsupportedArm64Exception(String message) {
if (isArm64()) {
- throw new UnsupportedOperationException("unsupported on " + getOsArch() + " architecture");
+ throw new UnsupportedOperationException(
+ message + ": unsupported on " + getOsArch() + " architecture");
}
}
}
diff --git a/plugins/src/main/java/common/org/tron/plugins/DbRoot.java b/plugins/src/main/java/common/org/tron/plugins/DbRoot.java
index 7c33219e180..45854bbebdc 100644
--- a/plugins/src/main/java/common/org/tron/plugins/DbRoot.java
+++ b/plugins/src/main/java/common/org/tron/plugins/DbRoot.java
@@ -67,16 +67,24 @@ public Integer call() throws Exception {
.errorText("Specify at least one exit database: --db dbName."));
return 404;
}
- List task = ProgressBar.wrap(dbs.stream(), "root task").parallel()
- .map(this::calcMerkleRoot).collect(Collectors.toList());
- task.forEach(this::printInfo);
- int code = (int) task.stream().filter(r -> r.code == 1).count();
- if (code > 0) {
+ try {
+ List task = ProgressBar.wrap(dbs.stream(), "root task").parallel()
+ .map(this::calcMerkleRoot).collect(Collectors.toList());
+ task.forEach(this::printInfo);
+ int code = (int) task.stream().filter(r -> r.code == 1).count();
+ if (code > 0) {
+ spec.commandLine().getErr().println(spec.commandLine().getColorScheme()
+ .errorText("There are some errors, please check toolkit.log for detail."));
+ }
+ spec.commandLine().getOut().println("root task done.");
+ return code;
+ } catch (Exception e) {
+ logger.error("{}", e);
spec.commandLine().getErr().println(spec.commandLine().getColorScheme()
- .errorText("There are some errors, please check toolkit.log for detail."));
+ .errorText(e.getMessage()));
+ spec.commandLine().usage(System.out);
+ return 1;
}
- spec.commandLine().getOut().println("root task done.");
- return code;
}
private Ret calcMerkleRoot(String name) {
diff --git a/plugins/src/main/java/common/org/tron/plugins/utils/DBUtils.java b/plugins/src/main/java/common/org/tron/plugins/utils/DBUtils.java
index 507a8ad798e..e003b098a43 100644
--- a/plugins/src/main/java/common/org/tron/plugins/utils/DBUtils.java
+++ b/plugins/src/main/java/common/org/tron/plugins/utils/DBUtils.java
@@ -66,7 +66,7 @@ static Operator valueOf(byte b) {
public static final String ROCKSDB = "ROCKSDB";
public static DB newLevelDb(Path db) throws IOException {
- Arch.throwUnsupportedArm64Exception();
+ Arch.throwIfUnsupportedArm64Exception(LEVELDB);
File file = db.toFile();
org.iq80.leveldb.Options dbOptions = newDefaultLevelDbOptions();
if (MARKET_PAIR_PRICE_TO_ORDER.equalsIgnoreCase(file.getName())) {