Skip to content
This repository was archived by the owner on Mar 3, 2023. It is now read-only.

Commit f11ebc3

Browse files
authored
Added CLI submit config toggle for verbose GC logging (#3663)
1 parent fdf3430 commit f11ebc3

File tree

11 files changed

+92
-170
lines changed

11 files changed

+92
-170
lines changed

heron/executor/src/python/heron_executor.py

+13-30
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
@click.option("--topology-defn-file", required=True)
103103
@click.option("--topology-id", required=True)
104104
@click.option("--topology-name", required=True)
105+
@click.option("--verbose-gc", is_flag=True)
105106
@click.option("--jvm-remote-debugger-ports",
106107
help="comma separated list of ports to be used"
107108
" by a remote debugger for JVM instances")
@@ -342,6 +343,7 @@ def init_from_parsed_args(self, parsed_args):
342343
self.health_manager_mode = parsed_args.health_manager_mode
343344
self.health_manager_classpath = '%s:%s'\
344345
% (self.scheduler_classpath, parsed_args.health_manager_classpath)
346+
self.verbose_gc = parsed_args.verbose_gc
345347
self.jvm_remote_debugger_ports = \
346348
parsed_args.jvm_remote_debugger_ports.split(",") \
347349
if parsed_args.jvm_remote_debugger_ports else None
@@ -574,36 +576,17 @@ def _get_java_major_version(self):
574576
return int(self._get_jvm_version().split(".")[0])
575577

576578
def _get_java_gc_instance_cmd(self, cmd, gc_name):
577-
gc_cmd = ['-verbosegc']
578-
if self._get_java_major_version() >= 9:
579-
gc_cmd += [
580-
'-XX:+UseG1GC',
581-
'-XX:+ParallelRefProcEnabled',
582-
'-XX:+UseStringDeduplication',
583-
'-XX:MaxGCPauseMillis=100',
584-
'-XX:InitiatingHeapOccupancyPercent=30',
585-
'-XX:+HeapDumpOnOutOfMemoryError',
586-
'-XX:ParallelGCThreads=4',
587-
'-Xlog:gc*,safepoint=info:file=' + self.log_dir + '/gc.' + gc_name +
588-
'.log:tags,time,uptime,level:filecount=5,filesize=100M']
589-
else:
590-
gc_cmd += [
591-
'-XX:+UseConcMarkSweepGC',
592-
'-XX:+CMSScavengeBeforeRemark',
593-
'-XX:TargetSurvivorRatio=90',
594-
'-XX:+PrintGCDetails',
595-
'-XX:+PrintGCTimeStamps',
596-
'-XX:+PrintGCDateStamps',
597-
'-XX:+PrintGCCause',
598-
'-XX:+UseGCLogFileRotation',
599-
'-XX:NumberOfGCLogFiles=5',
600-
'-XX:GCLogFileSize=100M',
601-
'-XX:+PrintPromotionFailure',
602-
'-XX:+PrintTenuringDistribution',
603-
'-XX:+PrintHeapAtGC',
604-
'-XX:+HeapDumpOnOutOfMemoryError',
605-
'-XX:ParallelGCThreads=4',
606-
'-Xloggc:' + self.log_dir + '/gc.' + gc_name + '.log']
579+
gc_cmd = [
580+
'-XX:+UseG1GC',
581+
'-XX:+ParallelRefProcEnabled',
582+
'-XX:+UseStringDeduplication',
583+
'-XX:MaxGCPauseMillis=100',
584+
'-XX:InitiatingHeapOccupancyPercent=30',
585+
'-XX:+HeapDumpOnOutOfMemoryError',
586+
'-XX:ParallelGCThreads=4']
587+
if self.verbose_gc:
588+
gc_cmd += ['-Xlog:gc*,safepoint=info:file=' + self.log_dir + '/gc.' + gc_name +
589+
'.log:tags,time,uptime,level:filecount=5,filesize=100M']
607590
try:
608591
cp_index = cmd.index('-cp')
609592
return list(itertools.chain(*[cmd[0:cp_index], gc_cmd, cmd[cp_index:]]))

heron/executor/tests/python/heron_executor_unittest.py

+23-135
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def _run_process(self, name, cmd, env=None):
8282
return popen
8383

8484
def _get_jvm_version(self):
85-
return "1.8.y.x"
85+
return "11.0.6"
8686

8787

8888
class HeronExecutorTest(unittest.TestCase):
@@ -105,50 +105,41 @@ def build_packing_plan(self, instance_distribution):
105105
instance_plan.component_index = int(component_index)
106106
return packing_plan
107107

108-
# pylint: disable=no-self-argument
108+
# pylint: disable=no-self-argument
109109
def get_expected_metricsmgr_command(container_id):
110110
return "heron_java_home/bin/java -Xmx1024M -XX:+PrintCommandLineFlags " \
111-
"-Djava.net.preferIPv4Stack=true -verbosegc " \
112-
"-XX:+UseConcMarkSweepGC -XX:+CMSScavengeBeforeRemark -XX:TargetSurvivorRatio=90 " \
113-
"-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps " \
114-
"-XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 " \
115-
"-XX:GCLogFileSize=100M -XX:+PrintPromotionFailure -XX:+PrintTenuringDistribution " \
116-
"-XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
117-
"-Xloggc:log-files/gc.metricsmgr-%d.log " \
111+
"-Djava.net.preferIPv4Stack=true " \
112+
"-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication " \
113+
"-XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=30 " \
114+
"-XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
118115
"-cp metricsmgr_classpath org.apache.heron.metricsmgr.MetricsManager " \
119116
"--id=metricsmgr-%d --port=metricsmgr_port " \
120117
"--topology=topname --cluster=cluster --role=role --environment=environ " \
121118
"--topology-id=topid " \
122119
"--system-config-file=%s --override-config-file=%s " \
123-
"--sink-config-file=metrics_sinks_config_file" %\
124-
(container_id, container_id, INTERNAL_CONF_PATH, OVERRIDE_PATH)
120+
"--sink-config-file=metrics_sinks_config_file" % \
121+
(container_id, INTERNAL_CONF_PATH, OVERRIDE_PATH)
125122

126123
def get_expected_metricscachemgr_command():
127124
return "heron_java_home/bin/java -Xmx1024M -XX:+PrintCommandLineFlags " \
128-
"-Djava.net.preferIPv4Stack=true -verbosegc " \
129-
"-XX:+UseConcMarkSweepGC -XX:+CMSScavengeBeforeRemark -XX:TargetSurvivorRatio=90 " \
130-
"-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps " \
131-
"-XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 " \
132-
"-XX:GCLogFileSize=100M -XX:+PrintPromotionFailure -XX:+PrintTenuringDistribution " \
133-
"-XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
134-
"-Xloggc:log-files/gc.metricscache.log " \
125+
"-Djava.net.preferIPv4Stack=true " \
126+
"-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication " \
127+
"-XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=30 " \
128+
"-XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
135129
"-cp metricscachemgr_classpath org.apache.heron.metricscachemgr.MetricsCacheManager " \
136130
"--metricscache_id metricscache-0 --server_port metricscachemgr_serverport " \
137131
"--stats_port metricscachemgr_statsport --topology_name topname --topology_id topid " \
138132
"--system_config_file %s --override_config_file %s " \
139133
"--sink_config_file metrics_sinks_config_file " \
140-
"--cluster cluster --role role --environment environ" %\
141-
(INTERNAL_CONF_PATH, OVERRIDE_PATH)
134+
"--cluster cluster --role role --environment environ" \
135+
% (INTERNAL_CONF_PATH, OVERRIDE_PATH)
142136

143137
def get_expected_healthmgr_command():
144138
return "heron_java_home/bin/java -Xmx1024M -XX:+PrintCommandLineFlags " \
145-
"-Djava.net.preferIPv4Stack=true -verbosegc " \
146-
"-XX:+UseConcMarkSweepGC -XX:+CMSScavengeBeforeRemark -XX:TargetSurvivorRatio=90 " \
147-
"-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps " \
148-
"-XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 " \
149-
"-XX:GCLogFileSize=100M -XX:+PrintPromotionFailure -XX:+PrintTenuringDistribution " \
150-
"-XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
151-
"-Xloggc:log-files/gc.healthmgr.log " \
139+
"-Djava.net.preferIPv4Stack=true " \
140+
"-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication " \
141+
"-XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=30 " \
142+
"-XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
152143
"-cp scheduler_classpath:healthmgr_classpath " \
153144
"org.apache.heron.healthmgr.HealthManager --cluster cluster --role role " \
154145
"--environment environ --topology_name topname --metricsmgr_port metricsmgr_port"
@@ -157,19 +148,16 @@ def get_expected_instance_command(component_name, instance_id, container_id):
157148
instance_name = "container_%d_%s_%d" % (container_id, component_name, instance_id)
158149
return "heron_java_home/bin/java -Xmx320M -Xms320M -Xmn160M -XX:MaxMetaspaceSize=128M " \
159150
"-XX:MetaspaceSize=128M -XX:ReservedCodeCacheSize=64M -XX:+PrintCommandLineFlags " \
160-
"-Djava.net.preferIPv4Stack=true -verbosegc " \
161-
"-XX:+UseConcMarkSweepGC -XX:+CMSScavengeBeforeRemark -XX:TargetSurvivorRatio=90 " \
162-
"-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps " \
163-
"-XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 " \
164-
"-XX:GCLogFileSize=100M -XX:+PrintPromotionFailure -XX:+PrintTenuringDistribution " \
165-
"-XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
166-
"-Xloggc:log-files/gc.%s.log " \
151+
"-Djava.net.preferIPv4Stack=true " \
152+
"-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication " \
153+
"-XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=30 " \
154+
"-XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
167155
"-cp instance_classpath:classpath -XX:+HeapDumpOnOutOfMemoryError " \
168156
"org.apache.heron.instance.HeronInstance -topology_name topname -topology_id topid " \
169157
"-instance_id %s -component_name %s -task_id %d -component_index 0 -stmgr_id stmgr-%d " \
170158
"-stmgr_port tmanager_controller_port -metricsmgr_port metricsmgr_port " \
171159
"-system_config_file %s -override_config_file %s" \
172-
% (instance_name, instance_name, component_name, instance_id,
160+
% (instance_name, component_name, instance_id,
173161
container_id, INTERNAL_CONF_PATH, OVERRIDE_PATH)
174162

175163
MockPOpen.set_next_pid(37)
@@ -391,103 +379,3 @@ def assert_process(self, expected_process, found_processes):
391379
self.assertEqual(expected_process.command, found_processes[pid].command_str)
392380
self.assertEqual(1, found_processes[pid].attempts)
393381

394-
395-
class MockExecutorJDK11(HeronExecutor):
396-
"""
397-
mock executor that overrides methods that don't apply to unit tests, like running processes
398-
"""
399-
def __init__(self, args):
400-
self.processes = []
401-
super(MockExecutorJDK11, self).__init__(args, None)
402-
403-
# pylint: disable=no-self-use
404-
def _load_logging_dir(self, heron_internals_config_file):
405-
return "log-files"
406-
407-
def _run_process(self, name, cmd, env=None):
408-
popen = MockPOpen()
409-
self.processes.append(ProcessInfo(popen, name, cmd))
410-
return popen
411-
412-
def _get_jvm_version(self):
413-
return "11.0.6"
414-
415-
416-
class HeronExecutorJDK11Test(unittest.TestCase):
417-
"""Unittest for Heron Executor"""
418-
419-
def __init__(self, args):
420-
super(HeronExecutorJDK11Test, self).__init__(args, None)
421-
422-
# pylint: disable=no-self-argument
423-
def get_expected_metricsmgr_command(container_id):
424-
return "heron_java_home/bin/java -Xmx1024M -XX:+PrintCommandLineFlags " \
425-
"-Djava.net.preferIPv4Stack=true -verbosegc " \
426-
"-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication " \
427-
"-XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=30 " \
428-
"-XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
429-
"-Xlog:gc*,safepoint=info:file=log-files/gc.metricsmgr-%d.log:tags,time,uptime," \
430-
"level:filecount=5,filesize=100M " \
431-
"-cp metricsmgr_classpath org.apache.heron.metricsmgr.MetricsManager " \
432-
"--id=metricsmgr-%d --port=metricsmgr_port " \
433-
"--topology=topname --cluster=cluster --role=role --environment=environ " \
434-
"--topology-id=topid " \
435-
"--system-config-file=%s --override-config-file=%s " \
436-
"--sink-config-file=metrics_sinks_config_file" % \
437-
(container_id, container_id, INTERNAL_CONF_PATH, OVERRIDE_PATH)
438-
439-
def get_expected_metricscachemgr_command():
440-
return "heron_java_home/bin/java -Xmx1024M -XX:+PrintCommandLineFlags " \
441-
"-Djava.net.preferIPv4Stack=true -verbosegc " \
442-
"-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication " \
443-
"-XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=30 " \
444-
"-XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
445-
" -Xlog:gc*,safepoint=info:file=log-files/gc.metricscache.log:tags,time,uptime," \
446-
"level:filecount=5,filesize=100M " \
447-
"-cp metricscachemgr_classpath org.apache.heron.metricscachemgr.MetricsCacheManager " \
448-
"--metricscache_id metricscache-0 --server_port metricscachemgr_serverport " \
449-
"--stats_port metricscachemgr_statsport --topology_name topname --topology_id topid " \
450-
"--system_config_file %s --override_config_file %s " \
451-
"--sink_config_file metrics_sinks_config_file " \
452-
"--cluster cluster --role role --environment environ" % \
453-
(INTERNAL_CONF_PATH, OVERRIDE_PATH)
454-
455-
def get_expected_healthmgr_command():
456-
return "heron_java_home/bin/java -Xmx1024M -XX:+PrintCommandLineFlags " \
457-
"-Djava.net.preferIPv4Stack=true -verbosegc " \
458-
"-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication " \
459-
"-XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=30 " \
460-
"-XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
461-
" -Xlog:gc*,safepoint=info:file=log-files/gc.healthmgr.log:tags,time,uptime," \
462-
"level:filecount=5,filesize=100M " \
463-
"-cp scheduler_classpath:healthmgr_classpath " \
464-
"org.apache.heron.healthmgr.HealthManager --cluster cluster --role role " \
465-
"--environment environ --topology_name topname --metricsmgr_port metricsmgr_port"
466-
467-
def get_expected_instance_command(component_name, instance_id, container_id):
468-
instance_name = "container_%d_%s_%d" % (container_id, component_name, instance_id)
469-
return "heron_java_home/bin/java -Xmx320M -Xms320M -Xmn160M -XX:MaxMetaspaceSize=128M " \
470-
"-XX:MetaspaceSize=128M -XX:ReservedCodeCacheSize=64M -XX:+PrintCommandLineFlags " \
471-
"-Djava.net.preferIPv4Stack=true -verbosegc " \
472-
"-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication " \
473-
"-XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=30 " \
474-
"-XX:+HeapDumpOnOutOfMemoryError -XX:ParallelGCThreads=4 " \
475-
"-Xloggc:log-files/gc.%s.log " \
476-
"-cp instance_classpath:classpath -XX:+HeapDumpOnOutOfMemoryError " \
477-
"org.apache.heron.instance.HeronInstance -topology_name topname -topology_id topid " \
478-
"-instance_id %s -component_name %s -task_id %d -component_index 0 -stmgr_id stmgr-%d " \
479-
"-stmgr_port tmanager_controller_port -metricsmgr_port metricsmgr_port " \
480-
"-system_config_file %s -override_config_file %s" \
481-
% (instance_name, instance_name, component_name, instance_id,
482-
container_id, INTERNAL_CONF_PATH, OVERRIDE_PATH)
483-
484-
def setUp(self):
485-
MockPOpen.set_next_pid(37)
486-
self.maxDiff = None
487-
self.executor_0 = MockExecutorJDK11(self.get_args(0))
488-
self.executor_1 = MockExecutorJDK11(self.get_args(1))
489-
self.executor_7 = MockExecutorJDK11(self.get_args(7))
490-
self.packing_plan_expected = self.build_packing_plan({
491-
1:[('word', '3', '0'), ('exclaim1', '2', '0'), ('exclaim1', '1', '0')],
492-
7:[('word', '11', '0'), ('exclaim1', '210', '0')],
493-
})

heron/scheduler-core/src/java/org/apache/heron/scheduler/ExecutorFlag.java

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public enum ExecutorFlag {
6666
StatefulConfigFile("stateful-config-file"),
6767
HealthManagerMode("health-manager-mode"),
6868
HealthManagerClasspath("health-manager-classpath"),
69+
EnableVerboseGCLog("verbose-gc"),
6970
JvmRemoteDebuggerPorts("jvm-remote-debugger-ports");
7071

7172
private final String name;

heron/scheduler-core/src/java/org/apache/heron/scheduler/SubmitterMain.java

+15-2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public class SubmitterMain {
7373
* @param dryRun run as dry run
7474
* @param dryRunFormat the dry run format
7575
* @param verbose enable verbose logging
76+
* @param verboseGC enable verbose JVM GC logging
7677
* @return config the command line config
7778
*/
7879
protected static Config commandLineConfigs(String cluster,
@@ -81,7 +82,8 @@ protected static Config commandLineConfigs(String cluster,
8182
String submitUser,
8283
Boolean dryRun,
8384
DryRunFormatType dryRunFormat,
84-
Boolean verbose) {
85+
Boolean verbose,
86+
Boolean verboseGC) {
8587
return Config.newBuilder()
8688
.put(Key.CLUSTER, cluster)
8789
.put(Key.ROLE, role)
@@ -90,6 +92,7 @@ protected static Config commandLineConfigs(String cluster,
9092
.put(Key.DRY_RUN, dryRun)
9193
.put(Key.DRY_RUN_FORMAT_TYPE, dryRunFormat)
9294
.put(Key.VERBOSE, verbose)
95+
.put(Key.VERBOSE_GC, verboseGC)
9396
.build();
9497
}
9598

@@ -207,6 +210,11 @@ private static Options constructOptions() {
207210
.longOpt("verbose")
208211
.build();
209212

213+
Option verboseGC = Option.builder("vgc")
214+
.desc("Enable verbose JVM GC logs")
215+
.longOpt("verbose_gc")
216+
.build();
217+
210218
options.addOption(cluster);
211219
options.addOption(role);
212220
options.addOption(environment);
@@ -221,6 +229,7 @@ private static Options constructOptions() {
221229
options.addOption(dryRun);
222230
options.addOption(dryRunFormat);
223231
options.addOption(verbose);
232+
options.addOption(verboseGC);
224233

225234
return options;
226235
}
@@ -241,6 +250,10 @@ private static boolean isVerbose(CommandLine cmd) {
241250
return cmd.hasOption("v");
242251
}
243252

253+
private static boolean isVerboseGC(CommandLine cmd) {
254+
return cmd.hasOption("vgc");
255+
}
256+
244257
@SuppressWarnings("JavadocMethod")
245258
@VisibleForTesting
246259
public static Config loadConfig(CommandLine cmd, TopologyAPI.Topology topology) {
@@ -277,7 +290,7 @@ public static Config loadConfig(CommandLine cmd, TopologyAPI.Topology topology)
277290
return Config.toLocalMode(Config.newBuilder()
278291
.putAll(ConfigLoader.loadConfig(heronHome, configPath, releaseFile, overrideConfigFile))
279292
.putAll(commandLineConfigs(cluster, role, environ, submitUser, dryRun,
280-
dryRunFormat, isVerbose(cmd)))
293+
dryRunFormat, isVerbose(cmd), isVerboseGC(cmd)))
281294
.putAll(SubmitterUtils.topologyConfigs(topologyPackage, topologyBinaryFile,
282295
topologyDefnFile, topology))
283296
.build());

heron/scheduler-core/src/java/org/apache/heron/scheduler/utils/SchedulerUtils.java

+3
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,9 @@ public static void addExecutorTopologyArgs(List<String> args, Config config, Con
279279
args.add(createCommandArg(ExecutorFlag.TopologyBinaryFile,
280280
Context.topologyBinaryFile(config)));
281281
args.add(createCommandArg(ExecutorFlag.HeronJavaHome, Context.clusterJavaHome(config)));
282+
if (Context.verboseGC(config)) {
283+
args.add(ExecutorFlag.EnableVerboseGCLog.getFlag());
284+
}
282285
args.add(createCommandArg(ExecutorFlag.HeronShellBinary, Context.shellBinary(config)));
283286
args.add(createCommandArg(ExecutorFlag.Cluster, Context.cluster(config)));
284287
args.add(createCommandArg(ExecutorFlag.Role, Context.role(config)));

heron/spi/src/java/org/apache/heron/spi/common/Context.java

+4
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public static Boolean verbose(Config cfg) {
5858
return cfg.getBooleanValue(Key.VERBOSE);
5959
}
6060

61+
public static Boolean verboseGC(Config cfg) {
62+
return cfg.getBooleanValue(Key.VERBOSE_GC);
63+
}
64+
6165
public static String buildVersion(Config cfg) {
6266
return cfg.getStringValue(Key.BUILD_VERSION);
6367
}

heron/spi/src/java/org/apache/heron/spi/common/Key.java

+3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ public enum Key {
6262
DRY_RUN ("heron.config.dry_run", Boolean.FALSE),
6363
DRY_RUN_FORMAT_TYPE ("heron.config.dry_run_format_type", Type.DRY_RUN_FORMAT_TYPE),
6464
VERBOSE ("heron.config.verbose", Boolean.FALSE),
65+
// Used to enable verbose JVM GC logging
66+
VERBOSE_GC ("heron.config.verbose_gc", Boolean.FALSE),
67+
6568
CONFIG_PROPERTY ("heron.config.property", Type.STRING),
6669

6770
//keys for release/build information

heron/spi/tests/java/org/apache/heron/spi/common/KeysTest.java

+4
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ public void testConfig() throws Exception {
106106
"heron.config.verbose",
107107
Key.VERBOSE
108108
);
109+
assertEquals(
110+
"heron.config.verbose_gc",
111+
Key.VERBOSE_GC
112+
);
109113
assertEquals(
110114
"heron.config.property",
111115
Key.CONFIG_PROPERTY

0 commit comments

Comments
 (0)