Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Adding a first class primitive, abstraction and process for dynamic library writing and loading can make it easier to extend inner workings of Mesos. Making it possible to have dynamic loadable resource allocators, isolators, containerizes, authenticators and much more.
This could be a powerful feature, as we get even more extensible and flexible ways of setting up Mesos - but also for isolating dependencies and complexity in external libraries and to ease experimentation with new features.
For example, imagine a loadable allocators which contains a VM (Lua, Python, ...) which makes it possible to try out new allocator algorithms without forcing those dependencies into the project.

Definitions

Mesos version := Mesos releases.
Module API version := Bumped when the module management system changes.
Role := The purpose that a module fulfills. In a given Mesos implementation this is tied to a specific object type, e.g. “Allocator”, “Isolator”, “Authenticator”.

The API from the point of view of a module writer

 

To write a Mesos module, include the module API header file and a module role type declaration, then place one macro call inside your library source code to capture version information and add another macro call to declare a module. Then add a function body that returns a module instance. That’s all. Here is a minimal example that declares a module with the role “Calculator” and the name “example”.

 

#include <mesos/module.hpp> // module system API
#include <calculator.hpp> // module role type declaration is in here

MESOS_MODULE_LIBRARY() // declares the module library (and its versions)

class ExampleCalculator: public Calculator
{
public:
  // An example function that the module implements.
  virtual int compute(char a, long b)

  {
    return a + b;
  }
};

MESOS_MODULE(Calculator, example) // declares the module

{
  return new ExampleCalculator(); // creating and returning the module instance
}

Additional compatibility checks


By default the above only works when the module client Mesos version and the Mesos version against which the library has been compiled are exactly the same. However, with this extra declaration, you can enable backwards compatibility controlled by a table inside Mesos that allows earlier library versions.

MESOS_IS_MODULE_COMPATIBLE(example)

{
  return true;
}

Here, instead of simply returning true, the module could also perform its own checks, and return false under certain conditions. In the latter case the module will not be admitted, no matter what the results of any other checks by Mesos indicate. The module’s own checks are open-ended. In particular, they may include queries about other loaded libraries and modules and their respective versions. We will later provide an API for that.

The API from the point of view of a Mesos implementor


Only modules with pre-declared roles and binding sites can be loaded by Mesos. There is no means of dynamic discovery or binding of extra roles. To declare a loadable module, a Mesos developer needs to specify an abstract class with at least one virtual method. Here is an example that matches the module code above.

class Calculator {
public:
  Calculator() {}
  virtual ~Calculator() {}

  virtual int compute(char a, long b) = 0;
};

 

That’s all. To employ a specific instantiation of this module role/type, you can write something like this.

 

#include <module/module_manager.hpp>

Try<Calculator*> module = mesos::ModuleManager::loadModule<Calculator>("example");
if (module.isError())

{
  …
  // error handling

}

Calculator* calculator = module.get();

And then you can already use the module.

int n = calculator->compute(‘A’, 10);

Module Libraries and Module Versioning

 

Before loading the above module, a dynamic library that contains the module needs to be loaded into Mesos. This happens early in Mesos startup code. The Mesos developer does not need to touch that code when introducing new module roles.
However, the developer is responsible for registering what versions of any given module are expected to remain compatible with Mesos as it progresses. This information is maintained in a table in src/module/module_manager.cpp. It contains an entry for every possible module role that Mesos recognizes, each with a corresponding Mesos release version number. This number needs to be adjusted by the Mesos developer to reflect the current Mesos version whenever compatibility between Mesos and modules that get compiled against it gets broken. Given that module implementation for older Mesos versions can still be written in the future, this may be impossible to tell and so in doubt it is best to just bump the required module version to the current Mesos version. But if one can be reasonably sure, assuming cooperative module developers, that a certain kind of module will continue to function across several Mesos versions, the table provides an easy way to specify this.

 

MesosRole versionLibraryIs module loadableReason
0.18.00.18.00.18.0
Status
colourGreen
titleyes
 

0.29.0

0.18.00.18.0
Status
colourGreen
titleyes
 
0.29.00.18.00.21.0
Status
colourGreen
titleyes
 
0.18.00.18.00.29.0
Status
colourRed
titleNO
Library compiled against a newer Mesos release.
0.29.00.21.00.18.0
Status
colourRed
titleNO
Module/Library older than the role version supported by Mesos.
0.29.00.29.00.18.0
Status
colourRed
titleNO
Module/Library older than the role version supported by Mesos.

 

The summarize, for successfully loading the module, the following relationship must exist between the various versions:

Role version <= Library version <= Mesos version

 

...