Skip to content

Commit 3f787cd

Browse files
kittinanasielek
authored andcommitted
HDDS-1192. Support -conf command line argument in GenericCli
Closes #713
1 parent 64f30da commit 3f787cd

File tree

15 files changed

+138
-132
lines changed

15 files changed

+138
-132
lines changed

hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericCli.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.concurrent.Callable;
2323

2424
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
25+
import org.apache.hadoop.fs.Path;
2526

2627
import com.google.common.annotations.VisibleForTesting;
2728
import picocli.CommandLine;
@@ -41,6 +42,9 @@ public class GenericCli implements Callable<Void>, GenericParentCommand {
4142
@Option(names = {"-D", "--set"})
4243
private Map<String, String> configurationOverrides = new HashMap<>();
4344

45+
@Option(names = {"-conf"})
46+
private String configurationPath;
47+
4448
private final CommandLine cmd;
4549

4650
public GenericCli() {
@@ -70,19 +74,19 @@ protected void printError(Throwable error) {
7074
} else {
7175
System.err.println(error.getMessage().split("\n")[0]);
7276
}
73-
if(error instanceof MissingSubcommandException){
74-
System.err.println(((MissingSubcommandException) error).getUsage());
75-
}
7677
}
7778

7879
@Override
7980
public Void call() throws Exception {
80-
throw new MissingSubcommandException(cmd.getUsageMessage());
81+
throw new MissingSubcommandException(cmd);
8182
}
8283

8384
@Override
8485
public OzoneConfiguration createOzoneConfiguration() {
8586
OzoneConfiguration ozoneConf = new OzoneConfiguration();
87+
if (configurationPath != null) {
88+
ozoneConf.addResource(new Path(configurationPath));
89+
}
8690
if (configurationOverrides != null) {
8791
for (Entry<String, String> entry : configurationOverrides.entrySet()) {
8892
ozoneConf.set(entry.getKey(), entry.getValue());

hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/MissingSubcommandException.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,15 @@
1717
*/
1818
package org.apache.hadoop.hdds.cli;
1919

20+
import picocli.CommandLine;
21+
2022
/**
2123
* Exception to throw if subcommand is not selected but required.
2224
*/
23-
public class MissingSubcommandException extends RuntimeException {
24-
25-
private String usage;
25+
public class MissingSubcommandException extends CommandLine.ParameterException {
2626

27-
public MissingSubcommandException(String usage) {
28-
super("Incomplete command");
29-
this.usage = usage;
27+
public MissingSubcommandException(CommandLine cmd) {
28+
super(cmd, "Incomplete command");
3029
}
3130

32-
public String getUsage() {
33-
return usage;
34-
}
3531
}

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java

Lines changed: 52 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import java.net.InetAddress;
5454
import java.security.KeyPair;
5555
import java.security.cert.CertificateException;
56+
import java.util.Arrays;
5657
import java.util.List;
5758
import java.util.UUID;
5859

@@ -81,64 +82,46 @@ public class HddsDatanodeService extends GenericCli implements ServicePlugin {
8182
private CertificateClient dnCertClient;
8283
private String component;
8384
private HddsDatanodeHttpServer httpServer;
85+
private boolean printBanner;
86+
private String[] args;
8487

85-
/**
86-
* Default constructor.
87-
*/
88-
public HddsDatanodeService() {
89-
this(null);
88+
public HddsDatanodeService(boolean printBanner, String[] args) {
89+
this.printBanner = printBanner;
90+
this.args = args != null ? Arrays.copyOf(args, args.length) : null;
9091
}
9192

9293
/**
93-
* Constructs {@link HddsDatanodeService} using the provided {@code conf}
94-
* value.
94+
* Create an Datanode instance based on the supplied command-line arguments.
95+
* <p>
96+
* This method is intended for unit tests only. It suppresses the
97+
* startup/shutdown message and skips registering Unix signal handlers.
9598
*
96-
* @param conf OzoneConfiguration
99+
* @param args command line arguments.
100+
* @return Datanode instance
97101
*/
98-
public HddsDatanodeService(Configuration conf) {
99-
if (conf == null) {
100-
this.conf = new OzoneConfiguration();
101-
} else {
102-
this.conf = new OzoneConfiguration(conf);
103-
}
104-
}
105-
106102
@VisibleForTesting
107103
public static HddsDatanodeService createHddsDatanodeService(
108-
String[] args, Configuration conf) {
109-
return createHddsDatanodeService(args, conf, false);
104+
String[] args) {
105+
return createHddsDatanodeService(args, false);
110106
}
111107

112108
/**
113109
* Create an Datanode instance based on the supplied command-line arguments.
114-
* <p>
115-
* This method is intended for unit tests only. It suppresses the
116-
* startup/shutdown message and skips registering Unix signal handlers.
117110
*
118111
* @param args command line arguments.
119-
* @param conf HDDS configuration
120112
* @param printBanner if true, then log a verbose startup message.
121113
* @return Datanode instance
122114
*/
123115
private static HddsDatanodeService createHddsDatanodeService(
124-
String[] args, Configuration conf, boolean printBanner) {
125-
if (args.length == 0 && printBanner) {
126-
StringUtils
127-
.startupShutdownMessage(HddsDatanodeService.class, args, LOG);
128-
129-
}
130-
return new HddsDatanodeService(conf);
116+
String[] args, boolean printBanner) {
117+
return new HddsDatanodeService(printBanner, args);
131118
}
132119

133120
public static void main(String[] args) {
134121
try {
135-
Configuration conf = new OzoneConfiguration();
136122
HddsDatanodeService hddsDatanodeService =
137-
createHddsDatanodeService(args, conf, true);
138-
if (hddsDatanodeService != null) {
139-
hddsDatanodeService.start(null);
140-
hddsDatanodeService.join();
141-
}
123+
createHddsDatanodeService(args, true);
124+
hddsDatanodeService.run(args);
142125
} catch (Throwable e) {
143126
LOG.error("Exception in HddsDatanodeService.", e);
144127
terminate(1, e);
@@ -149,19 +132,43 @@ public static Logger getLogger() {
149132
return LOG;
150133
}
151134

135+
@Override
136+
public Void call() throws Exception {
137+
if (printBanner) {
138+
StringUtils
139+
.startupShutdownMessage(HddsDatanodeService.class, args, LOG);
140+
}
141+
start(createOzoneConfiguration());
142+
join();
143+
return null;
144+
}
145+
146+
public void setConfiguration(OzoneConfiguration configuration) {
147+
this.conf = configuration;
148+
}
149+
152150
/**
153151
* Starts HddsDatanode services.
154152
*
155153
* @param service The service instance invoking this method
156154
*/
157155
@Override
158156
public void start(Object service) {
157+
if (service instanceof Configurable) {
158+
start(new OzoneConfiguration(((Configurable) service).getConf()));
159+
} else {
160+
start(new OzoneConfiguration());
161+
}
162+
}
163+
164+
public void start(OzoneConfiguration configuration) {
165+
setConfiguration(configuration);
166+
start();
167+
}
159168

169+
public void start() {
160170
DefaultMetricsSystem.initialize("HddsDatanode");
161171
OzoneConfiguration.activate();
162-
if (service instanceof Configurable) {
163-
conf = new OzoneConfiguration(((Configurable) service).getConf());
164-
}
165172
if (HddsUtils.isHddsEnabled(conf)) {
166173
try {
167174
String hostname = HddsUtils.getHostName(conf);
@@ -404,11 +411,13 @@ public DatanodeStateMachine getDatanodeStateMachine() {
404411
}
405412

406413
public void join() {
407-
try {
408-
datanodeStateMachine.join();
409-
} catch (InterruptedException e) {
410-
Thread.currentThread().interrupt();
411-
LOG.info("Interrupted during StorageContainerManager join.");
414+
if (datanodeStateMachine != null) {
415+
try {
416+
datanodeStateMachine.join();
417+
} catch (InterruptedException e) {
418+
Thread.currentThread().interrupt();
419+
LOG.info("Interrupted during StorageContainerManager join.");
420+
}
412421
}
413422
}
414423

hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/TestHddsDatanodeService.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.io.File;
2525
import java.io.IOException;
2626

27-
import org.apache.hadoop.conf.Configuration;
2827
import org.apache.hadoop.fs.FileUtil;
2928
import org.apache.hadoop.hdds.HddsConfigKeys;
3029
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -40,7 +39,7 @@
4039
*/
4140
public class TestHddsDatanodeService {
4241
private File testDir;
43-
private Configuration conf;
42+
private OzoneConfiguration conf;
4443
private HddsDatanodeService service;
4544
private String[] args = new String[] {};
4645

@@ -64,8 +63,8 @@ public void tearDown() {
6463

6564
@Test
6665
public void testStartup() throws IOException {
67-
service = HddsDatanodeService.createHddsDatanodeService(args, conf);
68-
service.start(null);
66+
service = HddsDatanodeService.createHddsDatanodeService(args);
67+
service.start(conf);
6968
service.join();
7069

7170
assertNotNull(service.getDatanodeDetails());

hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/TestHddsSecureDatanodeInit.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,10 @@ public static void setUp() throws Exception {
8383
ServicePlugin.class);
8484
securityConfig = new SecurityConfig(conf);
8585

86-
service = HddsDatanodeService.createHddsDatanodeService(args, conf);
86+
service = HddsDatanodeService.createHddsDatanodeService(args);
8787
dnLogs = GenericTestUtils.LogCapturer.captureLogs(getLogger());
8888
callQuietly(() -> {
89-
service.start(null);
89+
service.start(conf);
9090
return null;
9191
});
9292
callQuietly(() -> {

hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/SafeModeCommands.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ public SCMCLI getParent() {
5454
@Override
5555
public Void call() throws Exception {
5656
throw new MissingSubcommandException(
57-
this.parent.getCmd().getSubcommands().get("safemode").
58-
getUsageMessage());
57+
this.parent.getCmd().getSubcommands().get("safemode"));
5958
}
6059
}

hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/MiniOzoneClusterImpl.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.util.Optional;
2424
import org.apache.commons.io.FileUtils;
2525
import org.apache.hadoop.classification.InterfaceAudience;
26-
import org.apache.hadoop.conf.Configuration;
2726
import org.apache.hadoop.conf.StorageUnit;
2827
import org.apache.hadoop.hdds.HddsConfigKeys;
2928
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
@@ -104,9 +103,9 @@ public class MiniOzoneClusterImpl implements MiniOzoneCluster {
104103
* @throws IOException if there is an I/O error
105104
*/
106105
MiniOzoneClusterImpl(OzoneConfiguration conf,
107-
OzoneManager ozoneManager,
108-
StorageContainerManager scm,
109-
List<HddsDatanodeService> hddsDatanodes) {
106+
OzoneManager ozoneManager,
107+
StorageContainerManager scm,
108+
List<HddsDatanodeService> hddsDatanodes) {
110109
this.conf = conf;
111110
this.ozoneManager = ozoneManager;
112111
this.scm = scm;
@@ -275,7 +274,7 @@ public void restartHddsDatanode(int i, boolean waitForDatanode)
275274
datanodeService.stop();
276275
datanodeService.join();
277276
// ensure same ports are used across restarts.
278-
Configuration config = datanodeService.getConf();
277+
OzoneConfiguration config = datanodeService.getConf();
279278
int currentPort = datanodeService.getDatanodeDetails()
280279
.getPort(DatanodeDetails.Port.Name.STANDALONE).getValue();
281280
config.setInt(DFS_CONTAINER_IPC_PORT, currentPort);
@@ -291,9 +290,9 @@ public void restartHddsDatanode(int i, boolean waitForDatanode)
291290
}
292291
String[] args = new String[]{};
293292
HddsDatanodeService service =
294-
HddsDatanodeService.createHddsDatanodeService(args, config);
293+
HddsDatanodeService.createHddsDatanodeService(args);
295294
hddsDatanodes.add(i, service);
296-
service.start(null);
295+
service.start(config);
297296
if (waitForDatanode) {
298297
// wait for the node to be identified as a healthy node again.
299298
waitForClusterToBeReady();
@@ -371,7 +370,7 @@ public void startScm() throws IOException {
371370
public void startHddsDatanodes() {
372371
hddsDatanodes.forEach((datanode) -> {
373372
datanode.setCertificateClient(getCAClient());
374-
datanode.start(null);
373+
datanode.start();
375374
});
376375
}
377376

@@ -537,7 +536,7 @@ List<HddsDatanodeService> createHddsDatanodes(
537536
conf.setStrings(ScmConfigKeys.OZONE_SCM_NAMES, scmAddress);
538537
List<HddsDatanodeService> hddsDatanodes = new ArrayList<>();
539538
for (int i = 0; i < numOfDatanodes; i++) {
540-
Configuration dnConf = new OzoneConfiguration(conf);
539+
OzoneConfiguration dnConf = new OzoneConfiguration(conf);
541540
String datanodeBaseDir = path + "/datanode-" + Integer.toString(i);
542541
Path metaDir = Paths.get(datanodeBaseDir, "meta");
543542
Path dataDir = Paths.get(datanodeBaseDir, "data", "containers");
@@ -555,8 +554,10 @@ List<HddsDatanodeService> createHddsDatanodes(
555554
dnConf.set(OzoneConfigKeys.OZONE_CONTAINER_COPY_WORKDIR,
556555
wrokDir.toString());
557556

558-
hddsDatanodes.add(
559-
HddsDatanodeService.createHddsDatanodeService(args, dnConf));
557+
HddsDatanodeService datanode
558+
= HddsDatanodeService.createHddsDatanodeService(args);
559+
datanode.setConfiguration(dnConf);
560+
hddsDatanodes.add(datanode);
560561
}
561562
return hddsDatanodes;
562563
}

hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestScmSafeMode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ public void testSCMSafeMode() throws Exception {
270270
assertFalse(logCapturer.getOutput().contains("SCM exiting safe mode."));
271271
assertTrue(scm.getCurrentContainerThreshold() == 0);
272272
for (HddsDatanodeService dn : cluster.getHddsDatanodes()) {
273-
dn.start(null);
273+
dn.start();
274274
}
275275
GenericTestUtils
276276
.waitFor(() -> scm.getCurrentContainerThreshold() == 1.0, 100, 20000);

0 commit comments

Comments
 (0)