----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/70168/#review213774 -----------------------------------------------------------
Since this RR adds code which was/is removed in https://reviews.apache.org/r/70169/ I believe they should be a single refactoring patch (at least that's how I reviewed them both). Ideally we would have one patch moving code out of the SLRP, and one or more other patches to do cleanups, if only to make it easier to confirm that we do not introduce new bugs. This RR does way too many things to rule that out with much confidence. src/csi/metrics.cpp Lines 44 (patched) <https://reviews.apache.org/r/70168/#comment299798> Let's call out here that we fall through intentionally. src/csi/service_manager.cpp Lines 113 (patched) <https://reviews.apache.org/r/70168/#comment299771> Separate code blocks by empty lines from surrounding text. src/csi/service_manager.cpp Lines 123-125 (patched) <https://reviews.apache.org/r/70168/#comment299800> This docstring doesn't reflect the actual return type. I find boolean values are always tricky as they can require a lot of non-local context to interpret. How about we just use the previous return type `[(ContainerID, Option(ContainerStatus)]`? src/csi/service_manager.cpp Lines 133 (patched) <https://reviews.apache.org/r/70168/#comment299804> The _if necessary_ part isn't clear to me, and I am not sure a user of this function needs to know. Maybe just something along the lines of _waits for the endpoint socket to be ready_ and that some timeout is involved. We should also document that `endpoint` is a unix URI. ``` // Returns a `Future` ... ``` src/csi/service_manager.cpp Lines 137 (patched) <https://reviews.apache.org/r/70168/#comment299805> ``` // Returns a `Future` of the URI(?) of the ... ``` src/csi/service_manager.cpp Lines 139 (patched) <https://reviews.apache.org/r/70168/#comment299809> Do we need to mention the daemon here? Maybe just ``` If the container is not already running, this method will start a new container. ``` src/csi/service_manager.cpp Lines 155-156 (patched) <https://reviews.apache.org/r/70168/#comment299817> Since `Owned` can be shared, let's make this class explicitly non-copyable to prevent lifetime issues, e.g., ``` // Since this class contains `Owned` members which should not but can // be copied, explicitly make this class non-copyable. // // TODO(chhsia0): Remove this once MESOS-5122 is fixed. ServiceManagerProcess(const ServiceManagerProcess&) = delete; ServiceManagerProcess& operator=(const ServiceManagerProcess&) = delete; ``` src/csi/service_manager.cpp Lines 184-185 (patched) <https://reviews.apache.org/r/70168/#comment299818> In Mesos we typically expand types unless they are already mentioned somewhere in the statement or are nested types (e.g., iterators). ```` foreach (const CSIPluginContainerInfo::Service& service, services) { foreach (const CSIPluginContainerInfo& container, info.containers()) { ... } } ```` src/csi/service_manager.cpp Lines 186-191 (patched) <https://reviews.apache.org/r/70168/#comment299819> Let's either add a comment here why it is always okay to only ever store the first found service, or maybe even better separate input validation from setting up our own state. src/csi/service_manager.cpp Lines 235-236 (patched) <https://reviews.apache.org/r/70168/#comment299823> Let's keep the previous code from SLRP process `recover` and the previous `getContainers` return type. src/csi/service_manager.cpp Lines 260 (patched) <https://reviews.apache.org/r/70168/#comment299824> If we rewrap the comment we can `s/despite if/even though/`. Ideally we'd do that in a trivial cleanup patch. src/csi/service_manager.cpp Lines 264 (patched) <https://reviews.apache.org/r/70168/#comment299825> This shows how a unnamed boolean is much harder to understand than variable that carries clear semantics like the previous `isRunningContainer`. src/csi/service_manager.cpp Lines 316 (patched) <https://reviews.apache.org/r/70168/#comment299772> Let's just use the `static` function like we had previously, ``` static ContainerID getContainerId( const CSIPluginInfo& info, const CSIPluginContainerInfo& container); ``` src/csi/service_manager.cpp Lines 332-338 (patched) <https://reviews.apache.org/r/70168/#comment299773> Maybe the following instead? ```` auto it = std::find_if( info.containers().begin(), info.containers().end(), [this, containerId](const CSIPluginContainerInfo& info) { return getContainerId(info) == containerId; }); return it != info.containers().end() ? *it : Option<CSIPluginContainerInfo>::none(); ```` src/csi/service_manager.cpp Lines 354 (patched) <https://reviews.apache.org/r/70168/#comment299799> Let's not hide that we capture `this` here as such lambdas can be tricky. src/csi/service_manager.cpp Lines 375 (patched) <https://reviews.apache.org/r/70168/#comment299801> Let's add a comment here that and how we namespace our containers. src/csi/service_manager.cpp Lines 380-386 (patched) <https://reviews.apache.org/r/70168/#comment299802> Once we change the return type of this lambda we can get rid of this comment and all the coupling it needs to call out. src/csi/service_manager.cpp Lines 389 (patched) <https://reviews.apache.org/r/70168/#comment299803> As `result` has a different type than the function return value we could `move` here. src/csi/service_manager.cpp Lines 460 (patched) <https://reviews.apache.org/r/70168/#comment299806> Seems like we don't need to defer to self? src/csi/service_manager.cpp Lines 485 (patched) <https://reviews.apache.org/r/70168/#comment299807> `s/[=]/[this]/` src/csi/service_manager.cpp Lines 496-506 (patched) <https://reviews.apache.org/r/70168/#comment299808> I find the data flow in this way of chaining confusing (e.g., not immediately clear who generated the argument to this continuation). Can we first handle the `then` case and only then the `onAny`? src/csi/service_manager.cpp Lines 514-517 (patched) <https://reviews.apache.org/r/70168/#comment299810> This feels weird. Why can't we just do ``` if (endpoints.contains(containerId)) { return endpoints.at(containerId)->future(); } CHECK(!daemons.contains(containerId)); ``` src/csi/service_manager.cpp Lines 519-520 (patched) <https://reviews.apache.org/r/70168/#comment299811> How about avoiding the hard assertion here and instead returning a `Failure`? Since this was in the existing code, so maybe let's do any cleanup in a separate patch. src/csi/service_manager.cpp Lines 551 (patched) <https://reviews.apache.org/r/70168/#comment299812> We don't really use such abbreviated names, maybe `s/endpointVar/endpoint_/` or even `endpoint` if we inline the temporary? ``` Environment::Variable* endpoint = commandInfo.mutable_environment()->add_variables(); endpoint->set_name("CSI_ENDPOINT"); endpoint->set_value("unix://" + endpointPath.get()); ``` src/csi/service_manager.cpp Lines 614 (patched) <https://reviews.apache.org/r/70168/#comment299814> Should we have a metric for the start action as well? src/csi/service_manager.cpp Lines 620-621 (patched) <https://reviews.apache.org/r/70168/#comment299813> From this log line it isn't really clear that this is the teardown action for above `Connecting to endpoint ...`. Maybe instead `Disconnected from endpoint ...`? src/csi/service_manager.cpp Lines 644-645 (patched) <https://reviews.apache.org/r/70168/#comment299815> Not added here, but this assumes than an `Owned` can be shared. Let's clean that up in a follow-up. src/csi/service_manager.cpp Lines 646 (patched) <https://reviews.apache.org/r/70168/#comment299816> Looks good, not a simple code move though (also, `recover` additionally handles abandoned futures) ;) Might want to make the capture list explicit (`[this, containerId]`). - Benjamin Bannier On March 12, 2019, 7:59 p.m., Chun-Hung Hsiao wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/70168/ > ----------------------------------------------------------- > > (Updated March 12, 2019, 7:59 p.m.) > > > Review request for mesos, Benjamin Bannier, Jie Yu, and Jan Schlicht. > > > Bugs: MESOS-9632 > https://issues.apache.org/jira/browse/MESOS-9632 > > > Repository: mesos > > > Description > ------- > > The `ServiceManager` is agnostic to CSI versions, so can be used to > manage plugin containers for both CSI v0 and v1 plugins. Most of its > logic are adapted from the SLRP code. > > We also separate the CSI plugin metrics from SLRP metrics object so the > metrics can be accessed by `ServiceManager`. However, we do not make > `ServiceManager` own the CSI plugin metrics object because eventually we > would like to decouple metrics lifecycles from SLRP lifecycles. > > > Diffs > ----- > > src/CMakeLists.txt 3397c3b1d4e8a7900b2e5f870679cc7aa30b4be2 > src/Makefile.am d451d7cabe3bf5d4f5039cfac5de1b03ef891d07 > src/csi/metrics.hpp PRE-CREATION > src/csi/metrics.cpp PRE-CREATION > src/csi/service_manager.hpp PRE-CREATION > src/csi/service_manager.cpp PRE-CREATION > > > Diff: https://reviews.apache.org/r/70168/diff/6/ > > > Testing > ------- > > Testing done later in chain. > > > Thanks, > > Chun-Hung Hsiao > >