You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@mesos.apache.org by "Cody Maloney (JIRA)" <ji...@apache.org> on 2015/06/04 02:54:38 UTC
[jira] [Created] (MESOS-2811) API hard to
use, extend
Cody Maloney created MESOS-2811:
-----------------------------------
Summary: <process/subprocess.hpp> API hard to use, extend
Key: MESOS-2811
URL: https://issues.apache.org/jira/browse/MESOS-2811
Project: Mesos
Issue Type: Improvement
Components: slave
Affects Versions: 0.22.1
Reporter: Cody Maloney
https://github.com/apache/mesos/blob/master/3rdparty/libprocess/include/process/subprocess.hpp
There are many overloads of subprocess() construction, a lot of them are very similar.
It passes environment in as an {{Option<std::map<std::string, std::string>>}} which isn't what stout's os::environment() returns. ({{hashmap<std::string, std::string> environment()}}. Ideally those should match for easy passing environments around + manipulating
It isn't possible to tell it not to copy in the environment of running process (Useful to isolate slave environments from the running process). This becomes critical when configuring mesos via environment variables. Currently mesos explicitly unsets LIBPROCESS_IP when launching new processes because that one is known to upset when mesos launches another libprocess based thing.
ExecEnv is just weird, it isn't great / modern C++, and results in a lot of unnecessary / useless copies of things as current, doesn't follow modern C++ interface standards.
The code is hard to read / follow:
{code}
// Close the copies. We need to make sure that we do not close the
// file descriptor assigned to stdin/stdout/stderr in case the
// parent has closed stdin/stdout/stderr when calling this
// function (in that case, a dup'ed file descriptor may have the
// same file descriptor number as stdin/stdout/stderr).
if (stdinFd[0] != STDIN_FILENO &&
stdinFd[0] != STDOUT_FILENO &&
stdinFd[0] != STDERR_FILENO) {
while (::close(stdinFd[0]) == -1 && errno == EINTR);
}
if (stdoutFd[1] != STDIN_FILENO &&
stdoutFd[1] != STDOUT_FILENO &&
stdoutFd[1] != STDERR_FILENO) {
while (::close(stdoutFd[1]) == -1 && errno == EINTR);
}
if (stderrFd[1] != STDIN_FILENO &&
stderrFd[1] != STDOUT_FILENO &&
stderrFd[1] != STDERR_FILENO) {
while (::close(stderrFd[1]) == -1 && errno == EINTR);
}
{code}
Why do we switch between fd[0] vs [1]? Why are we hand-coding "While EINTR" loops over and over? Doesn't stout have an os::close?
https://github.com/apache/mesos/blob/master/3rdparty/libprocess/src/subprocess.cpp#L165 -- os::execvpe() can fail for perfectly good reasons, we should really log the name of the command / info that was trying to be run. There shouldn't be a backtrace printed (which abort does).
A lot of the subprocess overloads re-implement needlessly functionality which the underlying exec() C APIs provide, using those apis instead of re-implementing all the variations would be a much better model.
Mesos doesn't use / need most of the subprocess overloads that exist. A lot of the usage patterns probably could / should be removed.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)