[ 
https://issues.apache.org/jira/browse/MESOS-9336?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gavin updated MESOS-9336:
-------------------------
    Comment: was deleted

(was: www.rtat.net)

> Hook interfaces and implementation performs unnecessary protobuf copying.
> -------------------------------------------------------------------------
>
>                 Key: MESOS-9336
>                 URL: https://issues.apache.org/jira/browse/MESOS-9336
>             Project: Mesos
>          Issue Type: Improvement
>          Components: modules
>            Reporter: Benjamin Mahler
>            Priority: Major
>              Labels: performance
>
> The interfaces and implementation of hooks perform significant protobuf 
> copying and would benefit from copy elimination. Consider the case of the 
> master task label decorator:
> https://github.com/apache/mesos/blob/1.7.0/src/hook/manager.cpp#L108-L138
> {code}
> Labels HookManager::masterLaunchTaskLabelDecorator(
>     const TaskInfo& taskInfo,
>     const FrameworkInfo& frameworkInfo,
>     const SlaveInfo& slaveInfo)
> {
>   synchronized (mutex) {
>     // We need a mutable copy of the task info and set the new
>     // labels after each hook invocation. Otherwise, the last hook
>     // will be the only effective hook setting the labels.
>     TaskInfo taskInfo_ = taskInfo;
>     foreachpair (const string& name, Hook* hook, availableHooks) {
>       const Result<Labels> result =
>         hook->masterLaunchTaskLabelDecorator(
>             taskInfo_,
>             frameworkInfo,
>             slaveInfo);
>       // NOTE: If the hook returns None(), the task labels won't be
>       // changed.
>       if (result.isSome()) {
>         taskInfo_.mutable_labels()->CopyFrom(result.get());
>       } else if (result.isError()) {
>         LOG(WARNING) << "Master label decorator hook failed for module '"
>                     << name << "': " << result.error();
>       }
>     }
>     return taskInfo_.labels();
>   }
> }
> {code}
> https://github.com/apache/mesos/blob/1.7.0/src/master/master.cpp#L5619-L5634
> {code}
>         foreach (
>             TaskInfo& task, *message.mutable_task_group()->mutable_tasks()) {
>           taskIds.insert(task.task_id());
>           totalResources += task.resources();
>           addTask(task, framework, slave);
>           if (HookManager::hooksAvailable()) {
>             // Set labels retrieved from label-decorator hooks.
>             task.mutable_labels()->CopyFrom(
>                 HookManager::masterLaunchTaskLabelDecorator(
>                     task,
>                     framework->info,
>                     slave->info));
>           }
>         }
> {code}
> # We copy the entire task info.
> # We copy the labels of the task info twice for each label decorator hook 
> (the hook itself has to copy all existing ones since the API will re-write 
> the labels, and then we copy the result back into the task info).
> # We copy the labels back out to the caller.
> # The master then copies the labels back into the task.
> In the case of 1 hook, that's 1 copy of entire the task info (including 
> labels) and 4 copies of only the labels.
> Without changing the interface, we can eliminate 3 of the label copying 
> cases, and we would be left with 1 copy of the entire task info (including 
> labels), and 1 copy of the labels (per hook).
> With changing the interface, we can achieve 0 copies. This can be done by 
> making it a mutation interface, or making it truly a label decorator (labels 
> can only be added) with the modification that hooks don't get to see the 
> additional labels added by previous hooks. These would all be breaking 
> changes that require adjusting hooks.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to