This is an automated email from the ASF dual-hosted git repository.
jnioche pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/storm.git
The following commit(s) were added to refs/heads/master by this push:
new 0c64be68a STORM-4017 Fix for isAnyWindowsProcessAlive with multiple
pids
new 389d4c26f Merge pull request #3615 from
Scomocouk/STORM4017-FixisAnyWindowsProcessAlive
0c64be68a is described below
commit 0c64be68a11ccfa522b9c6e4ef7a22d19d1f1a65
Author: Scott Moore <[email protected]>
AuthorDate: Mon Jan 8 17:45:47 2024 +0000
STORM-4017 Fix for isAnyWindowsProcessAlive with multiple pids
---
.../java/org/apache/storm/utils/ServerUtils.java | 69 +++++++++++-----------
.../org/apache/storm/utils/ServerUtilsTest.java | 13 +++-
2 files changed, 45 insertions(+), 37 deletions(-)
diff --git a/storm-server/src/main/java/org/apache/storm/utils/ServerUtils.java
b/storm-server/src/main/java/org/apache/storm/utils/ServerUtils.java
index cc0cc240b..6928eb100 100644
--- a/storm-server/src/main/java/org/apache/storm/utils/ServerUtils.java
+++ b/storm-server/src/main/java/org/apache/storm/utils/ServerUtils.java
@@ -911,46 +911,47 @@ public class ServerUtils {
* @throws IOException on I/O exception
*/
private static boolean isAnyWindowsProcessAlive(Collection<Long> pids,
String user) throws IOException {
- List<String> cmdArgs = new ArrayList<>();
- cmdArgs.add("tasklist");
- cmdArgs.add("/fo");
- cmdArgs.add("list");
- pids.forEach(pid -> {
+ List<String> unexpectedUsers = new ArrayList<>();
+ for (Long pid: pids) {
+ List<String> cmdArgs = new ArrayList<>();
+ cmdArgs.add("tasklist");
+ cmdArgs.add("/fo");
+ cmdArgs.add("list");
cmdArgs.add("/fi");
cmdArgs.add("pid eq " + pid);
- });
- cmdArgs.add("/v");
- LOG.debug("CMD: {}", String.join(" ", cmdArgs));
- ProcessBuilder pb = new ProcessBuilder(cmdArgs);
- pb.redirectError(ProcessBuilder.Redirect.INHERIT);
- List<String> unexpectedUsers = new ArrayList<>();
- try (BufferedReader in = new BufferedReader(new
InputStreamReader(pb.start().getInputStream(), StandardCharsets.UTF_8))) {
- int lineNo = 0;
- String line;
- while ((line = in.readLine()) != null) {
- lineNo++;
- LOG.debug("CMD-LINE#{}: {}", lineNo, line);
- if (line.contains("User Name:")) { //Check for : in case
someone called their user "User Name"
- //This line contains the user name for the pid we're
looking up
- //Example line: "User Name: exampleDomain\exampleUser"
- List<String> userNameLineSplitOnWhitespace =
Arrays.asList(line.split(":"));
- if (userNameLineSplitOnWhitespace.size() == 2) {
- List<String> userAndMaybeDomain =
Arrays.asList(userNameLineSplitOnWhitespace.get(1).trim().split("\\\\"));
- String processUser = userAndMaybeDomain.size() == 2 ?
userAndMaybeDomain.get(1) : userAndMaybeDomain.get(0);
- processUser = processUser.trim();
- if (user.equals(processUser)) {
- return true;
+ cmdArgs.add("/v");
+ LOG.debug("CMD: {}", String.join(" ", cmdArgs));
+ ProcessBuilder pb = new ProcessBuilder(cmdArgs);
+ pb.redirectError(ProcessBuilder.Redirect.INHERIT);
+ try (BufferedReader in = new BufferedReader(new
InputStreamReader(pb.start().getInputStream(), StandardCharsets.UTF_8))) {
+ int lineNo = 0;
+ String line;
+ while ((line = in.readLine()) != null) {
+ lineNo++;
+ LOG.debug("CMD-LINE#{}: {}", lineNo, line);
+ if (line.contains("User Name:")) { //Check for : in case
someone called their user "User Name"
+ //This line contains the user name for the pid we're
looking up
+ //Example line: "User Name:
exampleDomain\exampleUser"
+ List<String> userNameLineSplitOnWhitespace =
Arrays.asList(line.split(":"));
+ if (userNameLineSplitOnWhitespace.size() == 2) {
+ List<String> userAndMaybeDomain =
Arrays.asList(userNameLineSplitOnWhitespace.get(1).trim().split("\\\\"));
+ String processUser = userAndMaybeDomain.size() ==
2 ? userAndMaybeDomain.get(1) : userAndMaybeDomain.get(0);
+ processUser = processUser.trim();
+ if (user.equals(processUser)) {
+ return true;
+ }
+ unexpectedUsers.add(processUser);
+ } else {
+ LOG.error("Received unexpected output from
tasklist command. Expected one colon in user name line. Line was {}",
+ line);
}
- unexpectedUsers.add(processUser);
- } else {
- LOG.error("Received unexpected output from tasklist
command. Expected one colon in user name line. Line was {}",
- line);
+ break;
}
}
+ } catch (IOException ex) {
+ String err = String.format("Cannot read output of command
\"%s\"", String.join(" ", cmdArgs));
+ throw new IOException(err, ex);
}
- } catch (IOException ex) {
- String err = String.format("Cannot read output of command \"%s\"",
String.join(" ", cmdArgs));
- throw new IOException(err, ex);
}
String pidsAsStr = StringUtils.join(pids, ",");
if (unexpectedUsers.isEmpty()) {
diff --git
a/storm-server/src/test/java/org/apache/storm/utils/ServerUtilsTest.java
b/storm-server/src/test/java/org/apache/storm/utils/ServerUtilsTest.java
index f21421e5f..a5908a6a2 100644
--- a/storm-server/src/test/java/org/apache/storm/utils/ServerUtilsTest.java
+++ b/storm-server/src/test/java/org/apache/storm/utils/ServerUtilsTest.java
@@ -106,17 +106,24 @@ public class ServerUtilsTest {
private Collection<Long> getRunningProcessIds(String user) throws
IOException {
// get list of few running processes
Collection<Long> pids = new ArrayList<>();
- String cmd = ServerUtils.IS_ON_WINDOWS ? "tasklist" : (user == null) ?
"ps -e" : "ps -U " + user ;
+ int pidIndex = 0;
+ String cmd;
+ if (ServerUtils.IS_ON_WINDOWS) {
+ cmd = "tasklist";
+ pidIndex = 1;
+ } else {
+ cmd = (user == null) ? "ps -e" : "ps -U " + user;
+ }
Process p = Runtime.getRuntime().exec(cmd);
try (BufferedReader input = new BufferedReader(new
InputStreamReader(p.getInputStream()))) {
String line;
while ((line = input.readLine()) != null) {
line = line.trim();
- if (line.isEmpty() || line.startsWith("PID")) {
+ if (line.isEmpty()) {
continue;
}
try {
- String pidStr = line.split("\\s")[0];
+ String pidStr = line.split("\\s+")[pidIndex];
if (pidStr.equalsIgnoreCase("pid")) {
continue; // header line
}