> On March 2, 2016, 2:58 p.m., Alexander Rukletsov wrote: > > src/master/allocator/mesos/metrics.hpp, line 37 > > <https://reviews.apache.org/r/44260/diff/1/?file=1276467#file1276467line37> > > > > You don't really need to call `.self()` here, there exists an `defer` > > override taking process instance. > > Benjamin Bannier wrote: > At least my clang does not trigger that overload. > > Alexander Rukletsov wrote: > > https://github.com/apache/mesos/blob/9bbba94021dde42c9d9d1fa0662462c364797018/3rdparty/libprocess/include/process/defer.hpp#L177 > > Benjamin Bannier wrote: > The issue I see is below when directly using the `Process` here. Note > that this works for code in `HierarchicalAllocatorProcess`. > > || In file included from ../../src/master/allocator/mesos/metrics.cpp:17: > || In file included from ../../src/master/allocator/mesos/metrics.hpp:26: > || In file included from > ../../3rdparty/libprocess/include/process/metrics/gauge.hpp:19: > || In file included from > ../../3rdparty/libprocess/include/process/defer.hpp:19: > || ../../3rdparty/libprocess/include/process/deferred.hpp:110:14: error: > no matching conversion for functional-style cast from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'std::function<Future<double> ()>' > || return std::function<R()>(f); > || ^~~~~~~~~~~~~~~~~~~~ > || ../../src/master/allocator/mesos/metrics.cpp:38:9: note: in > instantiation of function template specialization 'process::_Deferred<double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*)()>::operator > Deferred<process::Future<double> >' requested here > || process::defer( > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1593:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'nullptr_t' for 1st argument > || function(nullptr_t) _NOEXCEPT : __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1594:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'const std::__1::function<process::Future<double> ()>' for 1st argument > || function(const function&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1595:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'std::__1::function<process::Future<double> ()>' for 1st argument > || function(function&&) _NOEXCEPT; > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1599:41: note: > candidate template ignored: disabled by 'enable_if' [with _Fp = double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*)()] > || __callable<_Fp>::value && > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1605:7: note: > candidate constructor template not viable: requires 2 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&) _NOEXCEPT : __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1608:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT : > __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1610:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, const function&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1612:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, function&&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1614:7: note: > candidate constructor template not viable: requires at least 3 arguments, but > 1 was provided > || function(allocator_arg_t, const _Alloc& __a, _Fp __f, > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1591:5: note: > candidate constructor not viable: requires 0 arguments, but 1 was provided > || function() _NOEXCEPT : __f_(0) {} > || ^ > || In file included from ../../src/master/allocator/mesos/metrics.cpp:17: > || In file included from ../../src/master/allocator/mesos/metrics.hpp:26: > || In file included from > ../../3rdparty/libprocess/include/process/metrics/gauge.hpp:19: > || In file included from > ../../3rdparty/libprocess/include/process/defer.hpp:19: > || ../../3rdparty/libprocess/include/process/deferred.hpp:118:39: error: > no matching conversion for functional-style cast from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'std::function<Future<double> ()>' > || return dispatch(pid_.get(), std::function<R()>(f_)); > || ^~~~~~~~~~~~~~~~~~~~~ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1593:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'nullptr_t' for 1st argument > || function(nullptr_t) _NOEXCEPT : __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1594:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'const std::__1::function<process::Future<double> ()>' for 1st argument > || function(const function&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1595:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'std::__1::function<process::Future<double> ()>' for 1st argument > || function(function&&) _NOEXCEPT; > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1599:41: note: > candidate template ignored: disabled by 'enable_if' [with _Fp = double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*)()] > || __callable<_Fp>::value && > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1605:7: note: > candidate constructor template not viable: requires 2 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&) _NOEXCEPT : __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1608:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT : > __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1610:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, const function&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1612:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, function&&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1614:7: note: > candidate constructor template not viable: requires at least 3 arguments, but > 1 was provided > || function(allocator_arg_t, const _Alloc& __a, _Fp __f, > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1591:5: note: > candidate constructor not viable: requires 0 arguments, but 1 was provided > || function() _NOEXCEPT : __f_(0) {} > || ^ > || 1 warning and 2 errors generated. > || Error while processing > /XYZ/src/mesos/src/master/allocator/mesos/metrics.cpp. > || warning: 0.28.0": 'linker' input unused > || In file included from <built-in>:356: > || <command line>:4:24: warning: missing terminating '"' character > [-Winvalid-pp-token] > || #define PACKAGE_STRING "mesos > || ^ > || In file included from ../../src/master/allocator/mesos/metrics.cpp:17: > || In file included from ../../src/master/allocator/mesos/metrics.hpp:26: > || In file included from > ../../3rdparty/libprocess/include/process/metrics/gauge.hpp:19: > || In file included from > ../../3rdparty/libprocess/include/process/defer.hpp:19: > || ../../3rdparty/libprocess/include/process/deferred.hpp:110:14: error: > no matching conversion for functional-style cast from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'std::function<Future<double> ()>' > || return std::function<R()>(f); > || ^~~~~~~~~~~~~~~~~~~~ > || ../../src/master/allocator/mesos/metrics.cpp:38:9: note: in > instantiation of function template specialization 'process::_Deferred<double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*)()>::operator > Deferred<process::Future<double> >' requested here > || process::defer( > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1593:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'nullptr_t' for 1st argument > || function(nullptr_t) _NOEXCEPT : __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1594:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'const std::__1::function<process::Future<double> ()>' for 1st argument > || function(const function&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1595:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'std::__1::function<process::Future<double> ()>' for 1st argument > || function(function&&) _NOEXCEPT; > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1599:41: note: > candidate template ignored: disabled by 'enable_if' [with _Fp = double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*)()] > || __callable<_Fp>::value && > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1605:7: note: > candidate constructor template not viable: requires 2 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&) _NOEXCEPT : __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1608:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT : > __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1610:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, const function&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1612:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, function&&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1614:7: note: > candidate constructor template not viable: requires at least 3 arguments, but > 1 was provided > || function(allocator_arg_t, const _Alloc& __a, _Fp __f, > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1591:5: note: > candidate constructor not viable: requires 0 arguments, but 1 was provided > || function() _NOEXCEPT : __f_(0) {} > || ^ > || In file included from ../../src/master/allocator/mesos/metrics.cpp:17: > || In file included from ../../src/master/allocator/mesos/metrics.hpp:26: > || In file included from > ../../3rdparty/libprocess/include/process/metrics/gauge.hpp:19: > || In file included from > ../../3rdparty/libprocess/include/process/defer.hpp:19: > || ../../3rdparty/libprocess/include/process/deferred.hpp:118:39: error: > no matching conversion for functional-style cast from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'std::function<Future<double> ()>' > || return dispatch(pid_.get(), std::function<R()>(f_)); > || ^~~~~~~~~~~~~~~~~~~~~ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1593:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'nullptr_t' for 1st argument > || function(nullptr_t) _NOEXCEPT : __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1594:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'const std::__1::function<process::Future<double> ()>' for 1st argument > || function(const function&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1595:5: note: > candidate constructor not viable: no known conversion from 'double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*const)()' > to 'std::__1::function<process::Future<double> ()>' for 1st argument > || function(function&&) _NOEXCEPT; > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1599:41: note: > candidate template ignored: disabled by 'enable_if' [with _Fp = double > (mesos::internal::master::allocator::internal::HierarchicalAllocatorProcess::*)()] > || __callable<_Fp>::value && > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1605:7: note: > candidate constructor template not viable: requires 2 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&) _NOEXCEPT : __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1608:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT : > __f_(0) {} > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1610:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, const function&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1612:7: note: > candidate constructor template not viable: requires 3 arguments, but 1 was > provided > || function(allocator_arg_t, const _Alloc&, function&&); > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1614:7: note: > candidate constructor template not viable: requires at least 3 arguments, but > 1 was provided > || function(allocator_arg_t, const _Alloc& __a, _Fp __f, > || ^ > || /XYZ/src/llvm/P/bin/../include/c++/v1/functional:1591:5: note: > candidate constructor not viable: requires 0 arguments, but 1 was provided > || function() _NOEXCEPT : __f_(0) {} > || ^ > || 1 warning and 2 errors generated. > || Error while processing > /XYZ/src/mesos/src/master/allocator/mesos/metrics.cpp.
Somehow this doesn't seem to work with `HierarchicalAllocatorProcess` the way it does with e.g., `Master`. Leaving in the self for now, but definitely worth investigating. Here's a reproducer: class P : public mesos::internal::master::allocator::MesosAllocatorProcess { public: double hi() const { return 0; } double ho() { return 0; } }; class M : public ProtobufProcess<M> { public: double hi() { return 0; } }; void f(const P& p) { process::metrics::Gauge("defer via UPID and free function", process::defer(p, lambda::bind(&P::hi, &p))); // THIS DOES NOT WORK // process::metrics::Gauge("defer via Process and member fct ptr", // process::defer(p, P::hi))); } void g(const M& m) { // WORKS AS EXPECTED process::metrics::Gauge("defer via Process and member fct ptr", process::defer(m, &M::hi)); } - Benjamin ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/44260/#review121638 ----------------------------------------------------------- On March 3, 2016, 5:17 p.m., Benjamin Bannier wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/44260/ > ----------------------------------------------------------- > > (Updated March 3, 2016, 5:17 p.m.) > > > Review request for mesos, Alexander Rukletsov and Ben Mahler. > > > Bugs: MESOS-4718 > https://issues.apache.org/jira/browse/MESOS-4718 > > > Repository: mesos > > > Description > ------- > > Moved metrics of the hierarchical allocator to its own file. > > > Diffs > ----- > > src/CMakeLists.txt 0eabfad66f43adff12d08dbf34ca3db1b801c49e > src/Makefile.am b30cc25f61856d6417437547baaa0bb338a30d63 > src/master/allocator/mesos/hierarchical.hpp > 3043888630b066505410d3b32c5b3f813cc458c1 > src/master/allocator/mesos/metrics.hpp PRE-CREATION > src/master/allocator/mesos/metrics.cpp PRE-CREATION > > Diff: https://reviews.apache.org/r/44260/diff/ > > > Testing > ------- > > `make distcheck` on OS X. > > > Thanks, > > Benjamin Bannier > >