As Dominic pointed out, if the framework writers are not going to use the headers, then it doesn't make much sense to create a hierarchy for "internal" module-specific stuff at this point.
On Tue, Jan 27, 2015 at 2:12 PM, Kapil Arya <ka...@mesosphere.io> wrote: > > > On Tue, Jan 27, 2015 at 10:28 AM, Jie Yu <yujie....@gmail.com> wrote: > >> I think Mesos is kind of different than other C/C++ projects like apache >> httpd, llvm, etc. For httpd, it's clear that the public headers are for >> module writers. For llvm, the public headers are for plugin writers. >> >> For Mesos, we have two types of developers: framework writers and module >> writers. I think it'll be great if we can separate headers for these two >> types of writers in an obvious way. >> >> What I am proposing is: we still keep the internal namespace in Mesos, but >> move those internal interfaces that needed by the module to >> include/mesos/internal. So the layout of the include/ is like the >> following: >> >> include/ >> |-- mesos/ <-- public headers for framework/executor writers >> |-- scheduler.hpp >> |-- executor.hpp >> ... >> |-- internal/ <-- headers for module writers >> |--- slave/ >> |--- master/ >> > > I think, having "internal" in a public headers isn't a good idea. The > module API is supposed to be fairly stable. This, in fact, will be the > driving force to enable smooth upgrades even when there are some modules > installed for master/slave. > > >> Thoughts? >> >> - Jie >> >> >> On Tue, Jan 27, 2015 at 10:04 AM, Dominic Hamon <dha...@twopensource.com> >> wrote: >> >> > +1 >> > >> > if people write comments that say that, i'll be the first to recommend a >> > redesign of what they're writing :) >> > >> > >> > >> > On Tue, Jan 27, 2015 at 8:47 AM, Benjamin Hindman < >> b...@eecs.berkeley.edu> >> > wrote: >> > >> > > I think the point that Jie is making is that we have sometimes wanted >> to >> > > have "internal" implementation details exposed in public headers. >> This is >> > > common in Stout because everything has to be in headers. >> > > >> > > With that in mind, our goal for Mesos should be to have _zero_ >> internal >> > > implementation details in public headers. If people find themselves >> > writing >> > > comments that say "don't use these global variables or functions >> because >> > > they're internal to the implementation" then I'll be the first to >> > recommend >> > > that we reintroduce the 'internal' namespace. >> > > >> > > As for Stout I think we should keep the 'internal' namespace. >> > > >> > > On Mon, Jan 26, 2015 at 10:25 PM, Jie Yu <yujie....@gmail.com> wrote: >> > > >> > > > One benefit of having an internal namespace is that it tells the >> > > > framework/executor writer that those symbols/method/class are >> internal >> > to >> > > > Mesos core and should not be used. >> > > > >> > > > If we kill all the internal namespaces and move many headers like >> > > > isolator.hpp to include/mesos, how does the framework writer know >> that >> > > > he/she shouldn't use some of the headers because they are internal >> to >> > > Mesos >> > > > and are subject to change? >> > > > >> > > > For modules, I am wondering can we separate Mesos public headers (in >> > > > include/mesos right now) from those headers that are only for >> building >> > > > modules (more like internal public headers). >> > > > >> > > > Thoughts? >> > > > >> > > > - Jie >> > > > >> > > > On Mon, Jan 26, 2015 at 12:35 PM, Kapil Arya <ka...@mesosphere.io> >> > > wrote: >> > > > >> > > > > Hi All, >> > > > > >> > > > > TLDR: We currently use "mesos::internal" namespace for almost >> > > everything >> > > > > inside src/. However, in most cases, it is directly enclosing >> > another >> > > > > namespace. This makes the "internal" namespace redundant and we >> > should >> > > > > kill it. >> > > > > >> > > > > I learned from Ben Hindman that the original motivation for >> > introducing >> > > > an >> > > > > explicit internal namespace was to discourage people from exposing >> > > > internal >> > > > > symbols through "extern", etc. Since we don't seem to expose >> symbols >> > > > > through "extern" in our codebase, I think it's safe to kill this >> > > > namespace. >> > > > > >> > > > > Here is a list of files that define classes directly in the >> > > > mesos::internal >> > > > > namespace (i.e. without enclosing a separate namespace) [1]: >> > > > > >> > > > > authorizer/authorizer.hpp >> > > > > common/http.hpp >> > > > > common/attributes.hpp >> > > > > common/lock.hpp >> > > > > files/files.hpp >> > > > > hook/manager.hpp >> > > > > master/contender.hpp >> > > > > master/detector.hpp >> > > > > usage/usage.hpp >> > > > > watcher/whitelist_watcher.hpp >> > > > > >> > > > > messages/messages.pb.h >> > > > > >> > > > > Of the above list, things like hook/manager.hpp and >> > > > > master/{contender,detector}.hpp can be moved into their own >> > namespaces. >> > > > I >> > > > > am sure, we can come up with a strategy for the rest as well. >> > > > > >> > > > > One possible concern here might be messages.proto and the effects >> on >> > > > > upgrades, etc., if we change the namespace/package for these >> > protobufs. >> > > > If >> > > > > this turns out to be a real concern, we can possibly keep the >> > internal >> > > > > namespace for messages.proto. >> > > > > >> > > > > If we kill the "internal" namespace altogether, it would make it >> much >> > > > > easier to expose some headers as public headers for >> modularization, >> > > etc.. >> > > > > This will also help us get rid of "namespace internal" from some >> of >> > the >> > > > > public headers that we already have. >> > > > > >> > > > > The motivation for killing the "internal" namespace comes from a >> > > > > patch-set[2] that tries to expose >> slave/containerizer/isolator.hpp as >> > > > > include/mesos/slave/isolator.hpp. We wanted to keep Isolator >> inside >> > > the >> > > > > "mesos::slave" namespace instead of putting it directly in the >> > "mesos" >> > > > > namespace. This change causes a lot of conflicts due to >> > "mesos::slave" >> > > > and >> > > > > "mesos::internal::slave" and we had to resort to using fully >> > qualified >> > > > > names for a large number of definition in src/slave, src/tests, >> etc. >> > > > > >> > > > > Best, >> > > > > Kapil >> > > > > >> > > > > [1] List obtained by running the following command and then >> filtering >> > > out >> > > > > the instances where "internal" was enclosed in something other >> than >> > > > > "mesos": >> > > > > grep -nr "} // namespace internal" * -B1 |grep -v >> > > > > "namespace\|\-\-\|\.cpp"|cut -d'-' -f1 >> > > > > >> > > > > [2] https://reviews.apache.org/r/30238/ >> > > > > https://reviews.apache.org/r/29602/ >> > > > > https://reviews.apache.org/r/29603/ >> > > > > >> > > > >> > > >> > >> > >> > >> > -- >> > Dominic Hamon | @mrdo | Twitter >> > *There are no bad ideas; only good ideas that go horribly wrong.* >> > >> > >