diff --git a/modAionImpl/src/org/aion/zero/impl/AionBlockchainImpl.java b/modAionImpl/src/org/aion/zero/impl/AionBlockchainImpl.java index 38fe69da4a..be31b4c274 100644 --- a/modAionImpl/src/org/aion/zero/impl/AionBlockchainImpl.java +++ b/modAionImpl/src/org/aion/zero/impl/AionBlockchainImpl.java @@ -761,7 +761,8 @@ public synchronized ImportResult tryToConnect(final Block block) { LOG.error("Unable to dump heap due to exception:", e); } - System.exit(0); + // requested shutdown + System.exit(SystemExitCodes.NORMAL); } return tryToConnectInternal(block, System.currentTimeMillis() / THOUSAND_MS); } @@ -1401,7 +1402,7 @@ private RetValidPreBlock generatePreBlock(Block block) { } } catch (VMException e) { LOG.error("Shutdown due to a VM fatal error.", e); - System.exit(-1); + System.exit(SystemExitCodes.FATAL_VM_ERROR); } } @@ -1456,7 +1457,7 @@ private AionBlockSummary applyBlock(Block block) { } } catch (VMException e) { LOG.error("Shutdown due to a VM fatal error.", e); - System.exit(-1); + System.exit(SystemExitCodes.FATAL_VM_ERROR); } } Map rewards = addReward(block); diff --git a/modAionImpl/src/org/aion/zero/impl/AionHub.java b/modAionImpl/src/org/aion/zero/impl/AionHub.java index aababbf214..5e8ca5ff10 100644 --- a/modAionImpl/src/org/aion/zero/impl/AionHub.java +++ b/modAionImpl/src/org/aion/zero/impl/AionHub.java @@ -98,8 +98,6 @@ public static AionHub inst() { return Holder.INSTANCE; } - public static final int INIT_ERROR_EXIT_CODE = -1; - public AionHub() { initializeHub(CfgAion.inst(), AionBlockchainImpl.inst(), AionRepositoryImpl.inst(), false); } @@ -299,7 +297,7 @@ private void loadBlockchain() { this.repository.getBlockStore().load(); } catch (RuntimeException re) { genLOG.error("Fatal: can't load blockstore; exiting.", re); - System.exit(INIT_ERROR_EXIT_CODE); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } // Note: if block DB corruption, the bestBlock may not match with the indexDB. @@ -479,7 +477,7 @@ private void loadBlockchain() { + "\t3) Reboot with correct genesis and empty database\n", genesisHash == null ? "null" : ByteUtil.toHexString(genesisHash), databaseGenHash == null ? "null" : ByteUtil.toHexString(databaseGenHash)); - System.exit(INIT_ERROR_EXIT_CODE); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } if (!Arrays.equals(blockchain.getBestBlock().getStateRoot(), EMPTY_TRIE_HASH)) { @@ -555,7 +553,7 @@ private void registerBlockEvents() { this.eventMgr.registerEvent(evts); } else { genLOG.error("Event manager is null!"); - System.exit(INIT_ERROR_EXIT_CODE); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } } } diff --git a/modAionImpl/src/org/aion/zero/impl/SystemExitCodes.java b/modAionImpl/src/org/aion/zero/impl/SystemExitCodes.java index 3a8df9df77..540e0a2ca3 100644 --- a/modAionImpl/src/org/aion/zero/impl/SystemExitCodes.java +++ b/modAionImpl/src/org/aion/zero/impl/SystemExitCodes.java @@ -6,4 +6,6 @@ public class SystemExitCodes { public static final int NORMAL = 0; public static final int OUT_OF_DISK_SPACE = 1; public static final int DATABASE_CORRUPTION = 2; + public static final int FATAL_VM_ERROR = 3; + public static final int INITIALIZATION_ERROR = 4; } diff --git a/modAionImpl/src/org/aion/zero/impl/blockchain/AionImpl.java b/modAionImpl/src/org/aion/zero/impl/blockchain/AionImpl.java index b4b476bc80..d556cc5c28 100644 --- a/modAionImpl/src/org/aion/zero/impl/blockchain/AionImpl.java +++ b/modAionImpl/src/org/aion/zero/impl/blockchain/AionImpl.java @@ -25,6 +25,7 @@ import org.aion.vm.BulkExecutor; import org.aion.vm.exception.VMException; import org.aion.zero.impl.AionHub; +import org.aion.zero.impl.SystemExitCodes; import org.aion.zero.impl.config.CfgAion; import org.aion.zero.impl.tx.TxCollector; import org.aion.zero.impl.types.AionBlock; @@ -155,7 +156,7 @@ public long estimateTxNrg(AionTransaction tx, Block block) { .getEnergyUsed(); } catch (VMException e) { LOG_GEN.error("Shutdown due to a VM fatal error.", e); - System.exit(-1); + System.exit(SystemExitCodes.FATAL_VM_ERROR); return 0; } finally { repository.rollback(); @@ -197,7 +198,7 @@ public AionTxReceipt callConstant(AionTransaction tx, Block block) { .getReceipt(); } catch (VMException e) { LOG_GEN.error("Shutdown due to a VM fatal error.", e); - System.exit(-1); + System.exit(SystemExitCodes.FATAL_VM_ERROR); return null; } finally { repository.rollback(); diff --git a/modAionImpl/src/org/aion/zero/impl/blockchain/AionPendingStateImpl.java b/modAionImpl/src/org/aion/zero/impl/blockchain/AionPendingStateImpl.java index 8f3ec75b54..9175c4c69f 100644 --- a/modAionImpl/src/org/aion/zero/impl/blockchain/AionPendingStateImpl.java +++ b/modAionImpl/src/org/aion/zero/impl/blockchain/AionPendingStateImpl.java @@ -54,6 +54,7 @@ import org.aion.vm.BulkExecutor; import org.aion.vm.exception.VMException; import org.aion.zero.impl.AionBlockchainImpl; +import org.aion.zero.impl.SystemExitCodes; import org.aion.zero.impl.config.CfgAion; import org.aion.zero.impl.core.IAionBlockchain; import org.aion.zero.impl.db.AionRepositoryImpl; @@ -1116,7 +1117,7 @@ private AionTxExecSummary executeTx(AionTransaction tx, boolean inPool) { bestBlk.getNumber()); } catch (VMException e) { LOGGER_VM.error("Shutdown due to a VM fatal error.", e); - System.exit(-1); + System.exit(SystemExitCodes.FATAL_VM_ERROR); return null; } } diff --git a/modAionImpl/src/org/aion/zero/impl/cli/Cli.java b/modAionImpl/src/org/aion/zero/impl/cli/Cli.java index b9e8b746b9..ab5e2bf5cc 100644 --- a/modAionImpl/src/org/aion/zero/impl/cli/Cli.java +++ b/modAionImpl/src/org/aion/zero/impl/cli/Cli.java @@ -30,6 +30,7 @@ import org.aion.util.conversions.Hex; import org.aion.vm.LongLivedAvm; import org.aion.zero.impl.AionBlockchainImpl; +import org.aion.zero.impl.SystemExitCodes; import org.aion.zero.impl.Version; import org.aion.zero.impl.config.Network; import org.aion.zero.impl.db.DBUtils; @@ -54,8 +55,8 @@ public class Cli { public enum ReturnType { RUN(2), - EXIT(0), - ERROR(1); + EXIT(SystemExitCodes.NORMAL), + ERROR(SystemExitCodes.INITIALIZATION_ERROR); private final int value; ReturnType(int _value) { @@ -1201,7 +1202,7 @@ private String readPasswordFromReader(String prompt, BufferedReader reader) { } catch (IOException e) { System.err.println("Error reading from BufferedReader: " + reader); e.printStackTrace(); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } return null; // Make compiler happy; never get here. } @@ -1227,7 +1228,7 @@ private void createKeystoreDirIfMissing() { System.out.println( "Ssl keystore directory could not be created. " + "Please check user permissions or create directory manually."); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } System.out.println(); } @@ -1238,7 +1239,7 @@ private void checkConsoleExists(Console console) { if (console == null) { System.out.println( "No console found. This command can only be run interactively in a console environment."); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } } @@ -1247,7 +1248,7 @@ private String getCertName(Console console) { String certName = console.readLine(); if ((certName == null) || (certName.isEmpty())) { System.out.println("Error: no certificate name entered."); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } return certName; } @@ -1262,13 +1263,13 @@ private String getCertPass(Console console) { + " characters):\n")); if (certPass.isEmpty()) { System.out.println("Error: no certificate password entered."); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } else if (certPass.length() < minPassLen) { System.out.println( "Error: certificate password must be at least " + minPassLen + " characters long."); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } return certPass; } diff --git a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java index c491f63dac..f15ead75aa 100644 --- a/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java +++ b/modAionImpl/src/org/aion/zero/impl/config/CfgAion.java @@ -27,6 +27,7 @@ import org.aion.zero.exceptions.HeaderStructureException; import org.aion.zero.impl.AionGenesis; import org.aion.zero.impl.GenesisBlockLoader; +import org.aion.zero.impl.SystemExitCodes; /** @author chris */ public final class CfgAion extends Cfg { @@ -112,7 +113,7 @@ private void closeFileInputStream(final FileInputStream fis) { fis.close(); } catch (IOException e) { System.out.println(""); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } } } @@ -183,7 +184,7 @@ public void dbFromXML() { } } catch (Exception e) { System.out.println(""); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } finally { closeFileInputStream(fis); } @@ -270,7 +271,7 @@ public boolean fromXML(File cfgFile) { closeFileInputStream(fis); } catch (Exception e) { System.out.println(""); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } // checks for absolute path for database @@ -400,14 +401,14 @@ public void toXML(final String[] args, File file) { } catch (Exception e) { e.printStackTrace(); System.out.println(""); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } finally { if (sw != null) { try { sw.close(); } catch (XMLStreamException e) { System.out.println(""); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } } } diff --git a/modAionImpl/src/org/aion/zero/impl/db/AionRepositoryImpl.java b/modAionImpl/src/org/aion/zero/impl/db/AionRepositoryImpl.java index 0866da4c05..e33a9aea6c 100644 --- a/modAionImpl/src/org/aion/zero/impl/db/AionRepositoryImpl.java +++ b/modAionImpl/src/org/aion/zero/impl/db/AionRepositoryImpl.java @@ -4,7 +4,6 @@ import static org.aion.crypto.HashUtil.EMPTY_TRIE_HASH; import static org.aion.crypto.HashUtil.h256; import static org.aion.util.bytes.ByteUtil.EMPTY_BYTE_ARRAY; -import static org.aion.zero.impl.AionHub.INIT_ERROR_EXIT_CODE; import com.google.common.annotations.VisibleForTesting; import java.math.BigInteger; @@ -44,6 +43,7 @@ import org.aion.util.bytes.ByteUtil; import org.aion.util.conversions.Hex; import org.aion.util.types.ByteArrayWrapper; +import org.aion.zero.impl.SystemExitCodes; import org.aion.zero.impl.config.CfgAion; import org.aion.zero.impl.sync.DatabaseType; import org.aion.zero.impl.types.AionTxInfo; @@ -106,7 +106,7 @@ private void init() { LOGGEN.error("Shutdown due to failure to initialize repository."); // the above message does not get logged without the printStackTrace below e.printStackTrace(); - System.exit(INIT_ERROR_EXIT_CODE); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } } diff --git a/modAionImpl/src/org/aion/zero/impl/sync/TaskImportBlocks.java b/modAionImpl/src/org/aion/zero/impl/sync/TaskImportBlocks.java index 183ac12e1a..d75c5e43a4 100644 --- a/modAionImpl/src/org/aion/zero/impl/sync/TaskImportBlocks.java +++ b/modAionImpl/src/org/aion/zero/impl/sync/TaskImportBlocks.java @@ -28,6 +28,7 @@ import org.aion.p2p.P2pConstant; import org.aion.util.types.ByteArrayWrapper; import org.aion.zero.impl.AionBlockchainImpl; +import org.aion.zero.impl.SystemExitCodes; import org.aion.zero.impl.db.AionBlockStore; import org.aion.zero.impl.sync.PeerState.Mode; import org.aion.zero.impl.sync.statistics.BlockType; @@ -269,8 +270,8 @@ private PeerState processBatch(PeerState givenState, List batch, String d log.error(" ", e); if (e.getMessage() != null && e.getMessage().contains("No space left on device")) { - log.error("Shutdown due to lack of disk space."); - System.exit(0); + log.error("Shutdown due to lack of disk space.", e); + System.exit(SystemExitCodes.OUT_OF_DISK_SPACE); } break; } @@ -698,8 +699,8 @@ private int importFromStorage(PeerState state, long first, long last) { log.error(" ", e); if (e.getMessage() != null && e.getMessage().contains("No space left on device")) { - log.error("Shutdown due to lack of disk space."); - System.exit(0); + log.error("Shutdown due to lack of disk space.", e); + System.exit(SystemExitCodes.OUT_OF_DISK_SPACE); } } } diff --git a/modApiServer/src/org/aion/api/server/http/nano/NanoRpcServer.java b/modApiServer/src/org/aion/api/server/http/nano/NanoRpcServer.java index 0b644d03a4..d09a35b3fe 100644 --- a/modApiServer/src/org/aion/api/server/http/nano/NanoRpcServer.java +++ b/modApiServer/src/org/aion/api/server/http/nano/NanoRpcServer.java @@ -13,6 +13,7 @@ import org.aion.api.server.http.RpcServerBuilder; import org.aion.log.AionLoggerFactory; import org.aion.log.LogEnum; +import org.aion.zero.impl.SystemExitCodes; import org.slf4j.Logger; public class NanoRpcServer extends RpcServer { @@ -125,7 +126,7 @@ public void start() { } catch (Exception e) { LOG.error("", hostName, port); LOG.error(""); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } } diff --git a/modApiServer/src/org/aion/api/server/http/undertow/UndertowRpcServer.java b/modApiServer/src/org/aion/api/server/http/undertow/UndertowRpcServer.java index cb26b28d38..e338ce2088 100644 --- a/modApiServer/src/org/aion/api/server/http/undertow/UndertowRpcServer.java +++ b/modApiServer/src/org/aion/api/server/http/undertow/UndertowRpcServer.java @@ -12,6 +12,7 @@ import org.aion.api.server.http.RpcServerBuilder; import org.aion.log.AionLoggerFactory; import org.aion.log.LogEnum; +import org.aion.zero.impl.SystemExitCodes; import org.slf4j.Logger; public class UndertowRpcServer extends RpcServer { @@ -175,7 +176,7 @@ public void start() { } catch (Exception e) { LOG.error("", hostName, port); LOG.error(""); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } } diff --git a/modBoot/src/org/aion/Aion.java b/modBoot/src/org/aion/Aion.java index ff88e039d0..36e1d3d0cb 100644 --- a/modBoot/src/org/aion/Aion.java +++ b/modBoot/src/org/aion/Aion.java @@ -1,6 +1,5 @@ package org.aion; -import static java.lang.System.exit; import static org.aion.crypto.ECKeyFac.ECKeyType.ED25519; import static org.aion.crypto.HashUtil.H256Type.BLAKE2B_256; import static org.aion.zero.impl.Version.KERNEL_VERSION; @@ -46,6 +45,7 @@ import org.aion.solidity.Compiler; import org.aion.utils.NativeLibrary; import org.aion.vm.LongLivedAvm; +import org.aion.zero.impl.SystemExitCodes; import org.aion.zero.impl.blockchain.AionFactory; import org.aion.zero.impl.blockchain.IAionChain; import org.aion.zero.impl.cli.Cli; @@ -79,7 +79,7 @@ public static void main(String args[]) { ReturnType ret = new Cli().call(args, cfg); if (ret != ReturnType.RUN) { - exit(ret.getValue()); + System.exit(ret.getValue()); } Properties p = cfg.getFork().getProperties(); @@ -101,7 +101,7 @@ public static void main(String args[]) { checkZmqKeyPair(); } catch (Exception e) { System.out.println("Check zmq keypair fail! " + e.toString()); - exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } } @@ -109,7 +109,7 @@ public static void main(String args[]) { String UUID = cfg.getId(); if (!UUID.matches("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}")) { System.out.println("Invalid UUID; please check setting in config.xml"); - exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } ServiceLoader.load(EventMgrModule.class); @@ -395,7 +395,7 @@ private static void checkZmqKeyPair() throws IOException { System.out.println( "zmq keystore directory could not be created. " + "Please check user permissions or create directory manually."); - System.exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } System.out.println(); } @@ -481,7 +481,7 @@ private static char[] getSslPassword(CfgAion cfg) { System.out.println( "SSL-certificate-use requested with RPC server and no console found. " + "Please set the ssl password in the config file (insecure) to run kernel non-interactively with this option."); - exit(1); + System.exit(SystemExitCodes.INITIALIZATION_ERROR); } else { console.printf("---------------------------------------------\n"); console.printf("----------- INTERACTION REQUIRED ------------\n"); diff --git a/modDbImpl/src/org/aion/db/impl/leveldb/LevelDB.java b/modDbImpl/src/org/aion/db/impl/leveldb/LevelDB.java index cc7a7b8850..09c8c6ac63 100644 --- a/modDbImpl/src/org/aion/db/impl/leveldb/LevelDB.java +++ b/modDbImpl/src/org/aion/db/impl/leveldb/LevelDB.java @@ -126,7 +126,8 @@ public boolean open() { if (e1.getMessage() != null && e1.getMessage().contains("No space left on device")) { LOG.error("Shutdown due to lack of disk space."); - System.exit(0); + // defined as SystemExitCodes.OUT_OF_DISK_SPACE in modAionImpl + System.exit(1); } try {