> On March 19, 2019, 3:57 p.m., Benjamin Bannier wrote: > > src/csi/v0_volume_manager.hpp > > Lines 100 (patched) > > <https://reviews.apache.org/r/70214/diff/2/?file=2132469#file2132469line100> > > > > Does it make sense to move this into the process? It would lead to > > simpler dispatch in the wrapper around the process, and probably be more in > > line with the way we usually lay this out. > > Chun-Hung Hsiao wrote: > Yes I agree doing what you suggested is more consistent with the existing > codebase. > > The reason I do this is because we can save one dispatch. If we move it > into the actor, it would be like: > ``` > Future<Nothing> VolumeManagerProcess::attachVolume(...) > { > return recovered > .then(defer(self(), [=] { ... })); > } > ``` > Since `recovered` might carry a future that is satisfied in another > actor. And we'll have: > ``` > Future<Nothing> VolumeManager::attachVolume(...) > { > return dispatch(process.get(), &VolumeProcessManager::attachVolume, > ...); > } > ``` > See, we'll always get two dispatches in a single `attachVolume` call. > > There are two ways to solve this: > 1. Keep `recovered` in the actor, but do the following: > ``` > // Ensure that the following future is satisfied in this actor. > recovered = recover().then(defer(self(), [] { return Nothing(); })); > ``` > So we could remove a `defer` in `attachVolume`. But the last `then` looks > a bit unnatural. > > 2. Do what I did in this patch. > > 3. Don't care about the two dispatches, since this is less likely to > introduce much overhead. > > WDYT? > > Benjamin Bannier wrote: > TBH, I don't really understand what (1) accomplishes as it seems that to > be able to drop the `defer` we'd need to assert that we are already recovered. > > I'd be in favor of (3) as it would just appear simpler and I do not > expect a lot of contention on the actor which makes optimizing this less > necessary, but I'll leave this up to you. > > Chun-Hung Hsiao wrote: > For (1), let's say we have the following code instead: > ``` > Future<Nothing> VolumeManagerProcess::attachVolume(...) > { > return recovered.then([=] { return _attachVolume(...); }); > } > ``` > if `recovered` is already completed, the continuation will be invoked > synchronously; if not, it will be invoked in the same actor where `recovered` > will be set. > That said, I will never want to write code like this ;) Just listing what > else can be done theoratically. > > A small benefit of (3) is that we don't need to introduce one more layer > of indentation in the actor method itself, and `FUTURE_DISPATCH` on the actor > function would be a bit more meaningful.
SGTM. > On March 19, 2019, 3:57 p.m., Benjamin Bannier wrote: > > src/csi/volume_manager.cpp > > Line 43 (original), 49 (patched) > > <https://reviews.apache.org/r/70214/diff/2/?file=2132472#file2132472line49> > > > > Same question as on previous review: how do you plan to do > > version-dependent dispatch here? > > Chun-Hung Hsiao wrote: > Something like: > ``` > // TODO(chhsiao): Do a move-capture with `Owned` once we get C++14. > auto serviceManager = make_shared(new Owned<ServiceManager>(new > ServiceManager(...))); > return (*serviceManager)->getCsiVersion() > .then([=](const string& version) -> Future<Owned<VolumeManager>> { > if (version == v1::VERSION) { > return new v1::VolumeManager(..., std::move(*serviceManager)); > } else if (version == v0::VERSION) { > return new v0::VolumeManager(..., std::move(*serviceManager)); > } > > UNREACHABLE(); > }); > ``` > > Benjamin Bannier wrote: > Looks good. > > Let's use a `shared_ptr` instead of an `Owned` so this code is > semantically correct. > > Chun-Hung Hsiao wrote: > Hmm I believe it is already semantically correct but it seems that `auto` > + `make_shared` is really not that readable ;) Maybe I should go with > ``` > std::shared_ptr<Owned<ServiceManager>> serviceManager(new > Owned<ServiceManager>(new ServiceManager(...))); > ``` > or > ``` > std::shared_ptr<Owned<ServiceManager>> serviceManager = > std::make_shared(new Owned<ServiceManager>(new ServiceManager(...)))); > > ``` > But both seem a bit less idomatic. > > The type of `serviceManager` is `std::shared_ptr<Owned<ServiceManager>>`. > The problem is that `std::shared_ptr` has no method to relinquish the > ownership without destroying the object. > > I can go with `std::shared_ptr<ServiceManager>` instead and change all > interfaces taking this argument to `std::shared_ptr` as well. But that means > in the future we'd like to do the changes again to switch back to eithor > `Owned` or `std::unique_ptr`. WDYT? I misread that, sorry. Could you update the `TODO`, e.g., ``` TODO(chhsia0): Do a move-capture of `Owned` and remove the `shared_ptr` use once we get C++14. ``` - Benjamin ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/70214/#review213804 ----------------------------------------------------------- On March 22, 2019, 7:12 a.m., Chun-Hung Hsiao wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/70214/ > ----------------------------------------------------------- > > (Updated March 22, 2019, 7:12 a.m.) > > > Review request for mesos, Benjamin Bannier, Jie Yu, and Jan Schlicht. > > > Bugs: MESOS-9622 > https://issues.apache.org/jira/browse/MESOS-9622 > > > Repository: mesos > > > Description > ------- > > Added skeleton code for v0 `VolumeManager`. > > > Diffs > ----- > > src/CMakeLists.txt 3397c3b1d4e8a7900b2e5f870679cc7aa30b4be2 > src/Makefile.am d451d7cabe3bf5d4f5039cfac5de1b03ef891d07 > src/csi/v0_volume_manager.hpp PRE-CREATION > src/csi/v0_volume_manager.cpp PRE-CREATION > src/csi/v0_volume_manager_process.hpp PRE-CREATION > src/csi/volume_manager.cpp PRE-CREATION > > > Diff: https://reviews.apache.org/r/70214/diff/3/ > > > Testing > ------- > > make check > > > Thanks, > > Chun-Hung Hsiao > >