[ 
https://issues.apache.org/jira/browse/MESOS-1102?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13938071#comment-13938071
 ] 

Ian Downes commented on MESOS-1102:
-----------------------------------

I'd like to suggest that we evaluate this carefully and consider supporting 
features in Subprocess itself rather than exposing the general solution of a 
child function. I'd argue this for two main reasons:
1. As you noted the code _must_ be async-signal-safe. It would be better to 
have this code in one place so it can be more easily verified rather than 
scattered around in many child functions.
2. I'd anticipate common code between the child functions, e.g., let's make 
chdir'ing an option for Subprocess rather than several child functions 
implementing it (possibly differently).

I'm working on removing the need for fork/child function/exec from the mesos 
containerizer so perhaps the same can be done for the external containerizer. 
Can you expand on what you intend to do in the child function?

> Add ability to process::subprocess to run function within child context
> -----------------------------------------------------------------------
>
>                 Key: MESOS-1102
>                 URL: https://issues.apache.org/jira/browse/MESOS-1102
>             Project: Mesos
>          Issue Type: Improvement
>          Components: libprocess
>    Affects Versions: 0.19.0
>            Reporter: Till Toenshoff
>            Assignee: Till Toenshoff
>            Priority: Minor
>              Labels: libprocess, subprocess
>
> I would like to propose the addition of a way to run a function within the 
> forked child context to process::subprocess.
> The subprocess implementation is already extremely valuable and will allow us 
> to remove many scattered, similar implementations within mesos once it is 
> flexible enough.
> The recent addition (in review) of adding an environment map is just the 
> right step into that direction.
> However, there still are areas, mostly within containerizer specifics that 
> can not be replaced by the subprocess implementation as is, IMHO because 
> running a function in the child context is missing. See e.g. 
> /src/slave/containerizer/launcher.cpp, 
> /src/slave/containerizer/mesos_containerizer.cpp and last but not least the 
> pluggable_containerizer (in review).
> My envisioned approach would look something like this:
> {noformat}
> // Runs the provided command in a subprocess.
> // NOTE: Take extra care about the design of the inChild
> // lambda as it must not contain any async unsafe code.
> Try<Subprocess> subprocess(
>     const std::string& command,
>     const std::map<std::string, std::string>& env = std::map<std::string, 
> std::string>(),
>     const lambda::function<void()>& inChild = NULL);
> {noformat}
> Example usage:
> {noformat}
> struct ChildFunction {
>   ChildFunction(const string& directory) : directory(directory) {};
>   void operator ()()
>   {
>     if (::chdir(directory) < 0) {
>       ABORT("Failed to chdir");
>     }
>   }
>   const string& directory;
> };
> Try<Subprocess> external = subprocess(
>     "foo",
>     map<string, string>(),
>     ChildFunction("bar");
> {noformat}
> Please let me know what you think about this or if I was on a wrong track. 



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to