Skip to content

Commit b05a4bf

Browse files
committed
ZOOKEEPER-3620 Allow to override calls to System.exit in server side code:
- Use a common utility to call System.exit - Override calls to System.exit to a NO-OP function in tests
1 parent d2bec6b commit b05a4bf

19 files changed

Lines changed: 141 additions & 43 deletions

zookeeper-server/src/main/java/org/apache/zookeeper/Version.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2222
import org.apache.zookeeper.server.ExitCode;
23+
import org.apache.zookeeper.util.ServiceUtils;
2324

2425
public class Version implements org.apache.zookeeper.version.Info {
2526

@@ -48,7 +49,7 @@ public static void printUsage() {
4849
System.out.print("Usage:\tjava -cp ... org.apache.zookeeper.Version "
4950
+ "[--full | --short | --revision],\n\tPrints --full version "
5051
+ "info if no arg specified.");
51-
System.exit(ExitCode.UNEXPECTED_ERROR.getValue());
52+
ServiceUtils.requestSystemExit(ExitCode.UNEXPECTED_ERROR.getValue());
5253
}
5354

5455
/**
@@ -68,7 +69,7 @@ public static void main(String[] args) {
6869
}
6970
if (args.length == 0 || (args.length == 1 && args[0].equals("--full"))) {
7071
System.out.println(getFullVersion());
71-
System.exit(ExitCode.EXECUTION_FINISHED.getValue());
72+
ServiceUtils.requestSystemExit(ExitCode.EXECUTION_FINISHED.getValue());
7273
}
7374
if (args[0].equals("--short")) {
7475
System.out.println(getVersion());
@@ -77,7 +78,7 @@ public static void main(String[] args) {
7778
} else {
7879
printUsage();
7980
}
80-
System.exit(ExitCode.EXECUTION_FINISHED.getValue());
81+
ServiceUtils.requestSystemExit(ExitCode.EXECUTION_FINISHED.getValue());
8182
}
8283

8384
}

zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeperMain.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.apache.zookeeper.cli.VersionCommand;
6767
import org.apache.zookeeper.client.ZKClientConfig;
6868
import org.apache.zookeeper.server.ExitCode;
69+
import org.apache.zookeeper.util.ServiceUtils;
6970
import org.slf4j.Logger;
7071
import org.slf4j.LoggerFactory;
7172

@@ -353,7 +354,7 @@ void run() throws CliException, IOException, InterruptedException {
353354
// Command line args non-null. Run what was passed.
354355
processCmd(cl);
355356
}
356-
System.exit(exitCode);
357+
ServiceUtils.requestSystemExit(exitCode);
357358
}
358359

359360
public void executeLine(String line) throws CliException, InterruptedException, IOException {
@@ -396,7 +397,7 @@ protected boolean processZKCmd(MyCommandOptions co) throws CliException, IOExcep
396397

397398
if (cmd.equals("quit")) {
398399
zk.close();
399-
System.exit(exitCode);
400+
ServiceUtils.requestSystemExit(exitCode);
400401
} else if (cmd.equals("redo") && args.length >= 2) {
401402
Integer i = Integer.decode(args[1]);
402403
if (commandCount <= i || i < 0) { // don't allow redoing this redo

zookeeper-server/src/main/java/org/apache/zookeeper/server/DataTree.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import org.apache.zookeeper.txn.SetDataTxn;
7979
import org.apache.zookeeper.txn.Txn;
8080
import org.apache.zookeeper.txn.TxnHeader;
81+
import org.apache.zookeeper.util.ServiceUtils;
8182
import org.slf4j.Logger;
8283
import org.slf4j.LoggerFactory;
8384

@@ -301,7 +302,7 @@ public DataTree() {
301302
childWatches = WatchManagerFactory.createWatchManager();
302303
} catch (Exception e) {
303304
LOG.error("Unexpected exception when creating WatchManager, exiting abnormally", e);
304-
System.exit(ExitCode.UNEXPECTED_ERROR.getValue());
305+
ServiceUtils.requestSystemExit(ExitCode.UNEXPECTED_ERROR.getValue());
305306
}
306307
}
307308

zookeeper-server/src/main/java/org/apache/zookeeper/server/LogFormatter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.apache.zookeeper.server.persistence.FileTxnLog;
3434
import org.apache.zookeeper.server.util.SerializeUtils;
3535
import org.apache.zookeeper.txn.TxnHeader;
36+
import org.apache.zookeeper.util.ServiceUtils;
3637
import org.slf4j.Logger;
3738
import org.slf4j.LoggerFactory;
3839

@@ -51,13 +52,13 @@ public class LogFormatter {
5152
public static void main(String[] args) throws Exception {
5253
if (args.length != 1) {
5354
System.err.println("USAGE: LogFormatter log_file");
54-
System.exit(ExitCode.INVALID_INVOCATION.getValue());
55+
ServiceUtils.requestSystemExit(ExitCode.INVALID_INVOCATION.getValue());
5556
}
5657

5758
String error = ZKUtil.validateFileInput(args[0]);
5859
if (null != error) {
5960
System.err.println(error);
60-
System.exit(ExitCode.INVALID_INVOCATION.getValue());
61+
ServiceUtils.requestSystemExit(ExitCode.INVALID_INVOCATION.getValue());
6162
}
6263

6364
FileInputStream fis = new FileInputStream(args[0]);
@@ -67,7 +68,7 @@ public static void main(String[] args) throws Exception {
6768

6869
if (fhdr.getMagic() != FileTxnLog.TXNLOG_MAGIC) {
6970
System.err.println("Invalid magic number for " + args[0]);
70-
System.exit(ExitCode.INVALID_INVOCATION.getValue());
71+
ServiceUtils.requestSystemExit(ExitCode.INVALID_INVOCATION.getValue());
7172
}
7273
System.out.println("ZooKeeper Transactional Log File with dbid "
7374
+ fhdr.getDbid()

zookeeper-server/src/main/java/org/apache/zookeeper/server/PurgeTxnLog.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.yetus.audience.InterfaceAudience;
3131
import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
3232
import org.apache.zookeeper.server.persistence.Util;
33+
import org.apache.zookeeper.util.ServiceUtils;
3334
import org.slf4j.Logger;
3435
import org.slf4j.LoggerFactory;
3536

@@ -230,7 +231,7 @@ private static int validateAndGetCount(String number) {
230231

231232
private static void printUsageThenExit() {
232233
printUsage();
233-
System.exit(ExitCode.UNEXPECTED_ERROR.getValue());
234+
ServiceUtils.requestSystemExit(ExitCode.UNEXPECTED_ERROR.getValue());
234235
}
235236

236237
}

zookeeper-server/src/main/java/org/apache/zookeeper/server/RequestThrottler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2222
import java.util.concurrent.LinkedBlockingQueue;
23+
import org.apache.zookeeper.util.ServiceUtils;
2324
import org.slf4j.Logger;
2425
import org.slf4j.LoggerFactory;
2526

@@ -257,7 +258,7 @@ public void shutdown() {
257258
} catch (InterruptedException e) {
258259
LOG.warn("Interrupted while waiting for {} to finish", this);
259260
//TODO apply ZOOKEEPER-575 and remove this line.
260-
System.exit(ExitCode.UNEXPECTED_ERROR.getValue());
261+
ServiceUtils.requestSystemExit(ExitCode.UNEXPECTED_ERROR.getValue());
261262
}
262263
}
263264

zookeeper-server/src/main/java/org/apache/zookeeper/server/SnapshotFormatter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.apache.zookeeper.server.persistence.FileSnap;
3636
import org.apache.zookeeper.server.persistence.SnapStream;
3737
import org.apache.zookeeper.server.persistence.Util;
38+
import org.apache.zookeeper.util.ServiceUtils;
3839
import org.json.simple.JSONValue;
3940

4041
/**
@@ -72,18 +73,18 @@ public static void main(String[] args) throws Exception {
7273
System.err.println("USAGE: SnapshotFormatter [-d|-json] snapshot_file");
7374
System.err.println(" -d dump the data for each znode");
7475
System.err.println(" -json dump znode info in json format");
75-
System.exit(ExitCode.INVALID_INVOCATION.getValue());
76+
ServiceUtils.requestSystemExit(ExitCode.INVALID_INVOCATION.getValue());
7677
}
7778

7879
String error = ZKUtil.validateFileInput(snapshotFile);
7980
if (null != error) {
8081
System.err.println(error);
81-
System.exit(ExitCode.INVALID_INVOCATION.getValue());
82+
ServiceUtils.requestSystemExit(ExitCode.INVALID_INVOCATION.getValue());
8283
}
8384

8485
if (dumpData && dumpJson) {
8586
System.err.println("Cannot specify both data dump (-d) and json mode (-json) in same call");
86-
System.exit(ExitCode.INVALID_INVOCATION.getValue());
87+
ServiceUtils.requestSystemExit(ExitCode.INVALID_INVOCATION.getValue());
8788
}
8889

8990
new SnapshotFormatter().run(snapshotFile, dumpData, dumpJson);

zookeeper-server/src/main/java/org/apache/zookeeper/server/TraceFormatter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.text.DateFormat;
2626
import java.util.Date;
2727
import org.apache.zookeeper.ZooDefs.OpCode;
28+
import org.apache.zookeeper.util.ServiceUtils;
2829

2930
public class TraceFormatter {
3031

@@ -35,7 +36,7 @@ public class TraceFormatter {
3536
public static void main(String[] args) throws IOException {
3637
if (args.length != 1) {
3738
System.err.println("USAGE: TraceFormatter trace_file");
38-
System.exit(ExitCode.INVALID_INVOCATION.getValue());
39+
ServiceUtils.requestSystemExit(ExitCode.INVALID_INVOCATION.getValue());
3940
}
4041
FileChannel fc = new FileInputStream(args[0]).getChannel();
4142
while (true) {

zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooKeeperServer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
import org.apache.zookeeper.server.util.RequestPathMetricsCollector;
8181
import org.apache.zookeeper.txn.CreateSessionTxn;
8282
import org.apache.zookeeper.txn.TxnHeader;
83+
import org.apache.zookeeper.util.ServiceUtils;
8384
import org.slf4j.Logger;
8485
import org.slf4j.LoggerFactory;
8586

@@ -501,7 +502,7 @@ public void takeSnapshot(boolean syncSnap) {
501502
LOG.error("Severe unrecoverable error, exiting", e);
502503
// This is a severe error that we cannot recover from,
503504
// so we need to exit
504-
System.exit(ExitCode.TXNLOG_ERROR_TAKING_SNAPSHOT.getValue());
505+
ServiceUtils.requestSystemExit(ExitCode.TXNLOG_ERROR_TAKING_SNAPSHOT.getValue());
505506
}
506507
long elapsed = Time.currentElapsedTime() - start;
507508
LOG.info("Snapshot taken in {} ms", elapsed);

zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooKeeperServerMain.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.apache.zookeeper.server.persistence.FileTxnSnapLog.DatadirException;
3636
import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException;
3737
import org.apache.zookeeper.server.util.JvmPauseMonitor;
38+
import org.apache.zookeeper.util.ServiceUtils;
3839
import org.slf4j.Logger;
3940
import org.slf4j.LoggerFactory;
4041

@@ -69,29 +70,29 @@ public static void main(String[] args) {
6970
LOG.info(USAGE);
7071
System.err.println(USAGE);
7172
ZKAuditProvider.addServerStartFailureAuditLog();
72-
System.exit(ExitCode.INVALID_INVOCATION.getValue());
73+
ServiceUtils.requestSystemExit(ExitCode.INVALID_INVOCATION.getValue());
7374
} catch (ConfigException e) {
7475
LOG.error("Invalid config, exiting abnormally", e);
7576
System.err.println("Invalid config, exiting abnormally");
7677
ZKAuditProvider.addServerStartFailureAuditLog();
77-
System.exit(ExitCode.INVALID_INVOCATION.getValue());
78+
ServiceUtils.requestSystemExit(ExitCode.INVALID_INVOCATION.getValue());
7879
} catch (DatadirException e) {
7980
LOG.error("Unable to access datadir, exiting abnormally", e);
8081
System.err.println("Unable to access datadir, exiting abnormally");
8182
ZKAuditProvider.addServerStartFailureAuditLog();
82-
System.exit(ExitCode.UNABLE_TO_ACCESS_DATADIR.getValue());
83+
ServiceUtils.requestSystemExit(ExitCode.UNABLE_TO_ACCESS_DATADIR.getValue());
8384
} catch (AdminServerException e) {
8485
LOG.error("Unable to start AdminServer, exiting abnormally", e);
8586
System.err.println("Unable to start AdminServer, exiting abnormally");
8687
ZKAuditProvider.addServerStartFailureAuditLog();
87-
System.exit(ExitCode.ERROR_STARTING_ADMIN_SERVER.getValue());
88+
ServiceUtils.requestSystemExit(ExitCode.ERROR_STARTING_ADMIN_SERVER.getValue());
8889
} catch (Exception e) {
8990
LOG.error("Unexpected exception, exiting abnormally", e);
9091
ZKAuditProvider.addServerStartFailureAuditLog();
91-
System.exit(ExitCode.UNEXPECTED_ERROR.getValue());
92+
ServiceUtils.requestSystemExit(ExitCode.UNEXPECTED_ERROR.getValue());
9293
}
9394
LOG.info("Exiting normally");
94-
System.exit(ExitCode.EXECUTION_FINISHED.getValue());
95+
ServiceUtils.requestSystemExit(ExitCode.EXECUTION_FINISHED.getValue());
9596
}
9697

9798
protected void initializeAndRun(String[] args) throws ConfigException, IOException, AdminServerException {

0 commit comments

Comments
 (0)