-
Notifications
You must be signed in to change notification settings - Fork 1.6k
fix(config): deprecate CLI params and add guardrails #6580
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Changes from all commits
f55e9cf
84027da
5b0e37b
9d6027a
75b1d10
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -7,6 +7,7 @@ | |
| import static org.tron.core.Constant.DEFAULT_PROPOSAL_EXPIRE_TIME; | ||
| import static org.tron.core.Constant.DYNAMIC_ENERGY_INCREASE_FACTOR_RANGE; | ||
| import static org.tron.core.Constant.DYNAMIC_ENERGY_MAX_FACTOR_RANGE; | ||
| import static org.tron.core.Constant.ENERGY_LIMIT_IN_CONSTANT_TX; | ||
| import static org.tron.core.Constant.MAX_PROPOSAL_EXPIRE_TIME; | ||
| import static org.tron.core.Constant.MIN_PROPOSAL_EXPIRE_TIME; | ||
| import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCE_TIMEOUT_PERCENT; | ||
|
|
@@ -83,6 +84,40 @@ | |
| @Component | ||
| public class Args extends CommonParameter { | ||
|
|
||
| /** | ||
| * Maps deprecated CLI option names to their config-file equivalents. | ||
| * Options not in this map have no config equivalent and are being removed entirely. | ||
| */ | ||
| private static final Map<String, String> DEPRECATED_CLI_TO_CONFIG; | ||
|
|
||
| static { | ||
| Map<String, String> m = new HashMap<>(); | ||
| m.put("--storage-db-directory", "storage.db.directory"); | ||
| m.put("--storage-db-engine", "storage.db.engine"); | ||
| m.put("--storage-db-synchronous", "storage.db.sync"); | ||
| m.put("--storage-index-directory", "storage.index.directory"); | ||
| m.put("--storage-index-switch", "storage.index.switch"); | ||
| m.put("--storage-transactionHistory-switch", "storage.transHistory.switch"); | ||
| m.put("--contract-parse-enable", "event.subscribe.contractParse"); | ||
| m.put("--support-constant", "vm.supportConstant"); | ||
| m.put("--max-energy-limit-for-constant", "vm.maxEnergyLimitForConstant"); | ||
| m.put("--lru-cache-size", "vm.lruCacheSize"); | ||
| m.put("--min-time-ratio", "vm.minTimeRatio"); | ||
| m.put("--max-time-ratio", "vm.maxTimeRatio"); | ||
| m.put("--save-internaltx", "vm.saveInternalTx"); | ||
| m.put("--save-featured-internaltx", "vm.saveFeaturedInternalTx"); | ||
| m.put("--save-cancel-all-unfreeze-v2-details", "vm.saveCancelAllUnfreezeV2Details"); | ||
| m.put("--long-running-time", "vm.longRunningTime"); | ||
| m.put("--max-connect-number", "node.maxHttpConnectNumber"); | ||
| m.put("--rpc-thread", "node.rpc.thread"); | ||
| m.put("--solidity-thread", "node.solidity.threads"); | ||
| m.put("--validate-sign-thread", "node.validateSignThreadNum"); | ||
| m.put("--trust-node", "node.trustNode"); | ||
| m.put("--history-balance-lookup", "storage.balance.history.lookup"); | ||
| m.put("--es", "event.subscribe.enable"); | ||
| DEPRECATED_CLI_TO_CONFIG = Collections.unmodifiableMap(m); | ||
| } | ||
|
|
||
| @Getter | ||
| private static String configFilePath = ""; | ||
|
|
||
|
|
@@ -152,7 +187,7 @@ public static void applyConfigParams( | |
|
|
||
| if (config.hasPath(ConfigKey.VM_MAX_ENERGY_LIMIT_FOR_CONSTANT)) { | ||
| long configLimit = config.getLong(ConfigKey.VM_MAX_ENERGY_LIMIT_FOR_CONSTANT); | ||
| PARAMETER.maxEnergyLimitForConstant = max(3_000_000L, configLimit, true); | ||
| PARAMETER.maxEnergyLimitForConstant = max(ENERGY_LIMIT_IN_CONSTANT_TX, configLimit, true); | ||
| } | ||
|
|
||
| if (config.hasPath(ConfigKey.VM_LRU_CACHE_SIZE)) { | ||
|
|
@@ -661,6 +696,9 @@ public static void applyConfigParams( | |
| PARAMETER.eventFilter = | ||
| config.hasPath(ConfigKey.EVENT_SUBSCRIBE_FILTER) ? getEventFilter(config) : null; | ||
|
|
||
| PARAMETER.eventSubscribe = config.hasPath(ConfigKey.EVENT_SUBSCRIBE_ENABLE) | ||
| && config.getBoolean(ConfigKey.EVENT_SUBSCRIBE_ENABLE); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It would be helpful to add test cases for the newly introduced
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added two test cases in
See 5bfa482. |
||
|
|
||
| if (config.hasPath(ConfigKey.ALLOW_SHIELDED_TRANSACTION_API)) { | ||
| PARAMETER.allowShieldedTransactionApi = | ||
| config.getBoolean(ConfigKey.ALLOW_SHIELDED_TRANSACTION_API); | ||
|
|
@@ -998,6 +1036,28 @@ private static void applyCLIParams(CLIParameter cmd, JCommander jc) { | |
| .map(ParameterDescription::getLongestName) | ||
| .collect(Collectors.toSet()); | ||
|
|
||
| jc.getParameters().stream() | ||
| .filter(ParameterDescription::isAssigned) | ||
| .filter(pd -> { | ||
| try { | ||
| return CLIParameter.class.getDeclaredField(pd.getParameterized().getName()) | ||
| .isAnnotationPresent(Deprecated.class); | ||
| } catch (NoSuchFieldException e) { | ||
| return false; | ||
| } | ||
| }) | ||
| .forEach(pd -> { | ||
| String cliOption = pd.getLongestName(); | ||
| String configKey = DEPRECATED_CLI_TO_CONFIG.get(cliOption); | ||
| if (configKey != null) { | ||
| logger.warn("CLI option '{}' is deprecated and will be removed in a future release." | ||
| + " Please use config key '{}' instead.", cliOption, configKey); | ||
| } else { | ||
| logger.warn("CLI option '{}' is deprecated and will be removed in a future release.", | ||
| cliOption); | ||
| } | ||
| }); | ||
|
|
||
| if (assigned.contains("--output-directory")) { | ||
| PARAMETER.outputDirectory = cmd.outputDirectory; | ||
| } | ||
|
|
@@ -1008,7 +1068,8 @@ private static void applyCLIParams(CLIParameter cmd, JCommander jc) { | |
| PARAMETER.supportConstant = cmd.supportConstant; | ||
| } | ||
| if (assigned.contains("--max-energy-limit-for-constant")) { | ||
| PARAMETER.maxEnergyLimitForConstant = cmd.maxEnergyLimitForConstant; | ||
| PARAMETER.maxEnergyLimitForConstant = max(ENERGY_LIMIT_IN_CONSTANT_TX, | ||
| cmd.maxEnergyLimitForConstant, true); | ||
| } | ||
| if (assigned.contains("--lru-cache-size")) { | ||
| PARAMETER.lruCacheSize = cmd.lruCacheSize; | ||
|
|
@@ -1091,7 +1152,12 @@ private static void applyCLIParams(CLIParameter cmd, JCommander jc) { | |
| if (assigned.contains("--log-config")) { | ||
| PARAMETER.logbackPath = cmd.logbackPath; | ||
| } | ||
| // seedNodes is a JCommander positional (main) parameter, which does not support | ||
| // isAssigned(). An empty-check is used instead — this is safe because the default | ||
| // is an empty list, so non-empty means the user explicitly passed values on CLI. | ||
| if (!cmd.seedNodes.isEmpty()) { | ||
| logger.warn("Positional seed-node arguments are deprecated. " | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the feedback! Since |
||
| + "Please use seed.node.ip.list in the config file instead."); | ||
| List<InetSocketAddress> seeds = new ArrayList<>(); | ||
| for (String s : cmd.seedNodes) { | ||
| seeds.add(NetUtil.parseInetSocketAddress(s)); | ||
|
|
@@ -1677,6 +1743,9 @@ public static void printHelp(JCommander jCommander) { | |
| jCommander.getProgramName(); | ||
| helpStr.append(String.format("%nUsage: java -jar %s [options] [seedNode <seedNode> ...]%n", | ||
| programName)); | ||
| helpStr.append(String.format( | ||
| "%nNote: Positional seedNode arguments are deprecated." | ||
| + " Use seed.node.ip.list in the config file instead.%n")); | ||
| helpStr.append(String.format("%nVERSION: %n%s-%s%n", Version.getVersion(), | ||
| getCommitIdAbbrev())); | ||
|
|
||
|
|
@@ -1698,9 +1767,21 @@ public static void printHelp(JCommander jCommander) { | |
| logger.warn("Miss option:{}", option); | ||
| continue; | ||
| } | ||
| boolean isDeprecated; | ||
| try { | ||
| isDeprecated = CLIParameter.class.getDeclaredField( | ||
| parameterDescription.getParameterized().getName()) | ||
| .isAnnotationPresent(Deprecated.class); | ||
| } catch (NoSuchFieldException e) { | ||
| isDeprecated = false; | ||
| } | ||
| String desc = upperFirst(parameterDescription.getDescription()); | ||
| if (isDeprecated) { | ||
| desc += " (deprecated)"; | ||
| } | ||
| String tmpOptionDesc = String.format("%s\t\t\t%s%n", | ||
| Strings.padEnd(parameterDescription.getNames(), optionMaxLength, ' '), | ||
| upperFirst(parameterDescription.getDescription())); | ||
| desc); | ||
| helpStr.append(tmpOptionDesc); | ||
| } | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -10,6 +10,9 @@ | |
| * Fields here have NO default values — defaults live in CommonParameter. | ||
| * JCommander only populates fields that are explicitly passed on the | ||
| * command line. | ||
| * | ||
| * <p>Parameters marked {@code @Deprecated} are scheduled for removal. | ||
| * Use the corresponding config-file options instead.</p> | ||
| */ | ||
| @NoArgsConstructor | ||
| public class CLIParameter { | ||
|
|
@@ -44,63 +47,78 @@ public class CLIParameter { | |
| @Parameter(names = {"--password"}, description = "password") | ||
| public String password; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--solidity"}, description = "running a solidity node for java tron") | ||
| public boolean solidityNode; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. SolidityNode.jar is no longer generated during the build process, but the |
||
|
|
||
| @Parameter(names = {"--keystore-factory"}, description = "running KeystoreFactory") | ||
| public boolean keystoreFactory; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--fast-forward"}) | ||
| public boolean fastForward; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--es"}, description = "Start event subscribe server") | ||
| public boolean eventSubscribe; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--p2p-disable"}, description = "Switch for p2p module initialization. " | ||
| + "(default: false)", arity = 1) | ||
| public boolean p2pDisable; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||
|
|
||
| @Deprecated | ||
| @Parameter(description = "--seed-nodes") | ||
| public List<String> seedNodes = new ArrayList<>(); | ||
|
|
||
| // -- Storage parameters -- | ||
| // -- Storage parameters (deprecated, use config file instead) -- | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--storage-db-directory"}, description = "Storage db directory") | ||
| public String storageDbDirectory; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--storage-db-engine"}, | ||
| description = "Storage db engine.(leveldb or rocksdb)") | ||
| public String storageDbEngine; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--storage-db-synchronous"}, | ||
| description = "Storage db is synchronous or not.(true or false)") | ||
| public String storageDbSynchronous; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--storage-index-directory"}, description = "Storage index directory") | ||
| public String storageIndexDirectory; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--storage-index-switch"}, | ||
| description = "Storage index switch.(on or off)") | ||
| public String storageIndexSwitch; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--storage-transactionHistory-switch"}, | ||
| description = "Storage transaction history switch.(on or off)") | ||
| public String storageTransactionHistorySwitch; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--contract-parse-enable"}, description = "Switch for contract parses in " | ||
| + "java-tron. (default: true)") | ||
| public String contractParseEnable; | ||
|
|
||
| // -- Runtime parameters -- | ||
| // -- Runtime parameters (deprecated except --debug, use config file instead) -- | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--support-constant"}, description = "Support constant calling for TVM. " | ||
| + "(default: false)") | ||
| public boolean supportConstant; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--max-energy-limit-for-constant"}, | ||
| description = "Max energy limit for constant calling. (default: 100,000,000)") | ||
| public long maxEnergyLimitForConstant; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--lru-cache-size"}, description = "Max LRU size for caching bytecode and " | ||
| + "result of JUMPDEST analysis. (default: 500)") | ||
| public int lruCacheSize; | ||
|
|
@@ -109,48 +127,60 @@ public class CLIParameter { | |
| + "will not check for timeout. (default: false)") | ||
| public boolean debug; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--min-time-ratio"}, description = "Minimum CPU tolerance when executing " | ||
| + "timeout transactions while synchronizing blocks. (default: 0.0)") | ||
| public double minTimeRatio; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--max-time-ratio"}, description = "Maximum CPU tolerance when executing " | ||
| + "non-timeout transactions while synchronizing blocks. (default: 5.0)") | ||
| public double maxTimeRatio; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--save-internaltx"}, description = "Save internal transactions generated " | ||
| + "during TVM execution, such as create, call and suicide. (default: false)") | ||
| public boolean saveInternalTx; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--save-featured-internaltx"}, description = "Save featured internal " | ||
| + "transactions generated during TVM execution, such as freeze, vote and so on. " | ||
| + "(default: false)") | ||
| public boolean saveFeaturedInternalTx; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--save-cancel-all-unfreeze-v2-details"}, | ||
| description = "Record the details of the internal transactions generated by the " | ||
| + "CANCELALLUNFREEZEV2 opcode, such as bandwidth/energy/tronpower cancel amount. " | ||
| + "(default: false)") | ||
| public boolean saveCancelAllUnfreezeV2Details; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--long-running-time"}) | ||
| public int longRunningTime; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--max-connect-number"}, description = "Http server max connect number " | ||
| + "(default:50)") | ||
| public int maxHttpConnectNumber; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--rpc-thread"}, description = "Num of gRPC thread") | ||
| public int rpcThreadNum; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--solidity-thread"}, description = "Num of solidity thread") | ||
| public int solidityThreads; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--validate-sign-thread"}, description = "Num of validate thread") | ||
| public int validateSignThreadNum; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--trust-node"}, description = "Trust node addr") | ||
| public String trustNodeAddr; | ||
|
|
||
| @Deprecated | ||
| @Parameter(names = {"--history-balance-lookup"}) | ||
| public boolean historyBalanceLookup; | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This variable
private static final String DB_DIRECTORY_CONFIG_KEY = "storage.db.directory";has already been defined and does not need to be redefined; otherwise, it will be difficult to maintain. It should be set to public.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the review! These string literals in the map are user-facing hint text shown in deprecation warnings, not config-parsing keys used in code logic. While
Storage.javadoes define similar constants (e.g.DB_DIRECTORY_CONFIG_KEY), they are intentionallyprivate— and I'd prefer not to change their visibility just to serve a deprecated-params map that will eventually be removed along with the CLI params themselves.Additionally, the config key constants should be further modularized by domain in the future (storage, vm, node, etc.), so coupling them across classes now would work against that direction.