> On Oct. 14, 2015, 2:17 p.m., Benjamin Hindman wrote:
> > 3rdparty/libprocess/src/process.cpp, line 2354
> > <https://reviews.apache.org/r/39276/diff/2/?file=1098202#file1098202line2354>
> >
> > Let's clean this up a little bit. IIUC this is the only place in the
> > code where we dispatch to HttpProxy::handle, and it's not clear that we
> > need a pointer to the future (it's a shared_ptr under the covers anyway).
> > So how about we do something like:
> >
> > HttpProxy::handle(Future<Response>&& future, Request&& request)
> > {
> > items.push(new Item(move(future), move(request)));
> > ...;
> > }
> >
> > Then at the call site:
> >
> > // Dispatch to the proxy needs to be done at this point ...
> > // ...
> > // Also note that we need to pass a copy of 'request' because
> > HttpProxy::handle takes ownership.
> > dispatch(proxy, &HttpProxy::handle, promise->future(),
> > Request(*request));
> >
> > Sound good? Or am I missing something?
So the deal here with moving is with the `dispatch` function which is created
via some boost macros to simulate variadic templates. So if we made something
like the requested code `dispatch` gets resolved to:
```cpp
template <typename T, typename P0, typename P1, typename A0, typename A1>
void dispatch(const Process<T>* process,
void (T::*method)(P0, P1),
A0 a0,
A1 a1)
{
dispatch(process->self(), method, a0, a1);
}
```
Which in turn calls another template function
```cpp
template <typename T, typename P0, typename P1, typename A0, typename A1>
void dispatch(const Process<T>& process,
void (T::*method)(P0, P1),
A0 a0,
A1 a1)
{
dispatch(process.self(), method, a0, a1);
}
```
we can make the first `dispatch` to receive an rvalue reference, but since it
doesn't forward its parameters with an `std::move` to the second, they get
copied, but for some reason as constants values. When the third dispatch gets
called:
```cpp
template <typename T, typename P0, typename P1, typename A0, typename A1>
void dispatch(const PID<T>& pid, void (T::*method)(P0, P1), A0 a0, A1 a1)
{
std::shared_ptr<std::function<void(ProcessBase*)>> f(
new std::function<void(ProcessBase*)>([=](ProcessBase* process) {
assert(process != NULL);
T* t = dynamic_cast<T*>(process);
assert(t != NULL);
(t->*method)(a0, a1);
}));
internal::dispatch(pid, f, &typeid(method));
}
```
Creates an error where we are trying to move a `const reference`. So even if it
worked, we wouldn't be saving copies since `dispatch` will be doing them
anyway. However the pointer type is really unnecessary given that copies of
`Future<T>` are not expensive, so instead of a pointer, we can have a copy and
the code will look like the one you proposed (removing that `new
Future<Response>`) adn the copy of request is already there.
If there is nothing against this idea, I will be proceeding with it.
- Alexander
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/39276/#review102607
-----------------------------------------------------------
On Oct. 14, 2015, 5:35 p.m., Alexander Rojas wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/39276/
> -----------------------------------------------------------
>
> (Updated Oct. 14, 2015, 5:35 p.m.)
>
>
> Review request for mesos, Anand Mazumdar, Bernd Mathiske, and Till Toenshoff.
>
>
> Bugs: MESOS-3705
> https://issues.apache.org/jira/browse/MESOS-3705
>
>
> Repository: mesos
>
>
> Description
> -------
>
> When using the same socket to send multiple HTTP requests to different
> actors. If the actor responsible for handling the first request is stuck
> handling another event while a subsequent request can reply immediatly, the
> order of the responses is altered violating HTTP Pipelining.
>
> This patch fixes that problem enforcing that every response is sent in the
> order the corresponding request arrived. It also adds a test to reproduce the
> issue and verify the fix works.
>
>
> Diffs
> -----
>
> 3rdparty/libprocess/include/process/event.hpp
> 16ddbd77afa6efdf6bad201aa497ee102aa863ae
> 3rdparty/libprocess/src/process.cpp
> 0454554e7b6a39f94cfea02f08ca51ef6b35859a
> 3rdparty/libprocess/src/tests/http_tests.cpp
> d13d3888abbf3db552df4a9f83e54667e598ded9
>
> Diff: https://reviews.apache.org/r/39276/diff/
>
>
> Testing
> -------
>
> make check
>
>
> Thanks,
>
> Alexander Rojas
>
>