You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by al...@apache.org on 2017/12/20 14:02:14 UTC
[1/2] mesos git commit: Fixed flaky `NestedMesosContainerizerTest`
tests.
Repository: mesos
Updated Branches:
refs/heads/master 5f40f3d40 -> ee621bb36
Fixed flaky `NestedMesosContainerizerTest` tests.
This patch is an addition to commit 0cc636b2d5.
Review: https://reviews.apache.org/r/64749/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/196fe208
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/196fe208
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/196fe208
Branch: refs/heads/master
Commit: 196fe20861a4efc8edcabb08ce8821e8ed1b8f02
Parents: 5f40f3d
Author: Andrei Budnik <ab...@mesosphere.com>
Authored: Wed Dec 20 14:59:50 2017 +0100
Committer: Alexander Rukletsov <al...@apache.org>
Committed: Wed Dec 20 14:59:50 2017 +0100
----------------------------------------------------------------------
.../nested_mesos_containerizer_tests.cpp | 67 ++++++++++----------
1 file changed, 35 insertions(+), 32 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/196fe208/src/tests/containerizer/nested_mesos_containerizer_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/nested_mesos_containerizer_tests.cpp b/src/tests/containerizer/nested_mesos_containerizer_tests.cpp
index 92832e7..db60bfb 100644
--- a/src/tests/containerizer/nested_mesos_containerizer_tests.cpp
+++ b/src/tests/containerizer/nested_mesos_containerizer_tests.cpp
@@ -2064,40 +2064,43 @@ TEST_F(NestedMesosContainerizerTest,
ContainerID containerId;
containerId.set_value(id::UUID::random().toString());
- string cgroup = path::join(
+ string cgroupParent = path::join(
flags.cgroups_root,
buildPath(containerId, "mesos", JOIN));
- ASSERT_SOME(cgroups::create(freezerHierarchy.get(), cgroup, true));
+ ASSERT_SOME(cgroups::create(freezerHierarchy.get(), cgroupParent, true));
+ ASSERT_SOME_TRUE(cgroups::exists(freezerHierarchy.get(), cgroupParent));
ContainerID nestedContainerId;
nestedContainerId.mutable_parent()->CopyFrom(containerId);
nestedContainerId.set_value(id::UUID::random().toString());
- cgroup = path::join(
+ string cgroupNested = path::join(
flags.cgroups_root,
buildPath(nestedContainerId, "mesos", JOIN));
- ASSERT_SOME(cgroups::create(freezerHierarchy.get(), cgroup, true));
+ ASSERT_SOME(cgroups::create(freezerHierarchy.get(), cgroupNested, true));
+ ASSERT_SOME_TRUE(cgroups::exists(freezerHierarchy.get(), cgroupNested));
SlaveState state;
state.id = SlaveID();
AWAIT_READY(containerizer->recover(state));
- Future<Option<ContainerTermination>> wait = containerizer->wait(
- nestedContainerId);
-
- AWAIT_READY(wait);
- ASSERT_SOME(wait.get());
+ // We expect that containerizer recovery will detect orphan containers and
+ // will destroy them, so we check here that the freezer cgroups are destroyed.
+ //
+ // NOTE: `wait()` can return `Some` or `None` due to a race condition between
+ // `recover()` and `______destroy()` for an orphan container.
+ AWAIT_READY(containerizer->wait(nestedContainerId));
+ ASSERT_SOME_FALSE(cgroups::exists(freezerHierarchy.get(), cgroupNested));
Future<hashset<ContainerID>> containers = containerizer->containers();
AWAIT_READY(containers);
ASSERT_FALSE(containers->contains(nestedContainerId));
- wait = containerizer->wait(containerId);
- AWAIT_READY(wait);
- ASSERT_SOME(wait.get());
+ AWAIT_READY(containerizer->wait(containerId));
+ ASSERT_SOME_FALSE(cgroups::exists(freezerHierarchy.get(), cgroupParent));
containers = containerizer->containers();
AWAIT_READY(containers);
@@ -2436,53 +2439,53 @@ TEST_F(NestedMesosContainerizerTest,
ContainerID containerId;
containerId.set_value(id::UUID::random().toString());
- string cgroup = path::join(
+ string cgroupParent = path::join(
flags.cgroups_root,
buildPath(containerId, "mesos", JOIN));
- ASSERT_SOME(cgroups::create(freezerHierarchy.get(), cgroup, true));
+ ASSERT_SOME(cgroups::create(freezerHierarchy.get(), cgroupParent, true));
+ ASSERT_SOME_TRUE(cgroups::exists(freezerHierarchy.get(), cgroupParent));
ContainerID nestedContainerId1;
nestedContainerId1.mutable_parent()->CopyFrom(containerId);
nestedContainerId1.set_value(id::UUID::random().toString());
- cgroup = path::join(
+ string cgroupNested1 = path::join(
flags.cgroups_root,
buildPath(nestedContainerId1, "mesos", JOIN));
- ASSERT_SOME(cgroups::create(freezerHierarchy.get(), cgroup, true));
+ ASSERT_SOME(cgroups::create(freezerHierarchy.get(), cgroupNested1, true));
+ ASSERT_SOME_TRUE(cgroups::exists(freezerHierarchy.get(), cgroupNested1));
ContainerID nestedContainerId2;
nestedContainerId2.mutable_parent()->CopyFrom(containerId);
nestedContainerId2.set_value(id::UUID::random().toString());
- cgroup = path::join(
+ string cgroupNested2 = path::join(
flags.cgroups_root,
buildPath(nestedContainerId2, "mesos", JOIN));
- ASSERT_SOME(cgroups::create(freezerHierarchy.get(), cgroup, true));
+ ASSERT_SOME(cgroups::create(freezerHierarchy.get(), cgroupNested2, true));
+ ASSERT_SOME_TRUE(cgroups::exists(freezerHierarchy.get(), cgroupNested2));
SlaveState state;
state.id = SlaveID();
AWAIT_READY(containerizer->recover(state));
- Future<Option<ContainerTermination>> nestedWait1 = containerizer->wait(
- nestedContainerId1);
-
- Future<Option<ContainerTermination>> nestedWait2 = containerizer->wait(
- nestedContainerId2);
-
- Future<Option<ContainerTermination>> wait = containerizer->wait(containerId);
-
- AWAIT_READY(nestedWait1);
- ASSERT_SOME(nestedWait1.get());
+ // We expect that containerizer recovery will detect orphan containers and
+ // will destroy them, so we check here that the freezer cgroups are destroyed.
+ //
+ // NOTE: `wait()` can return `Some` or `None` due to a race condition between
+ // `recover()` and `______destroy()` for an orphan container.
+ AWAIT_READY(containerizer->wait(nestedContainerId1));
+ ASSERT_SOME_FALSE(cgroups::exists(freezerHierarchy.get(), cgroupNested1));
- AWAIT_READY(nestedWait2);
- ASSERT_SOME(nestedWait2.get());
+ AWAIT_READY(containerizer->wait(nestedContainerId2));
+ ASSERT_SOME_FALSE(cgroups::exists(freezerHierarchy.get(), cgroupNested2));
- AWAIT_READY(wait);
- ASSERT_SOME(wait.get());
+ AWAIT_READY(containerizer->wait(containerId));
+ ASSERT_SOME_FALSE(cgroups::exists(freezerHierarchy.get(), cgroupParent));
Future<hashset<ContainerID>> containers = containerizer->containers();
AWAIT_READY(containers);
[2/2] mesos git commit: Updated docs to mention new flag.
Posted by al...@apache.org.
Updated docs to mention new flag.
Review: https://reviews.apache.org/r/64450/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/ee621bb3
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/ee621bb3
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/ee621bb3
Branch: refs/heads/master
Commit: ee621bb36debf9d88325ef339afa46ade384e23d
Parents: 196fe20
Author: Benno Evers <be...@mesosphere.com>
Authored: Wed Dec 20 15:00:08 2017 +0100
Committer: Alexander Rukletsov <al...@apache.org>
Committed: Wed Dec 20 15:01:51 2017 +0100
----------------------------------------------------------------------
CHANGELOG | 4 ++
docs/agent-recovery.md | 129 +++++++++++++++++++++++++--------------
docs/configuration/agent.md | 18 ++++++
src/slave/flags.cpp | 12 ++--
4 files changed, 111 insertions(+), 52 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/ee621bb3/CHANGELOG
----------------------------------------------------------------------
diff --git a/CHANGELOG b/CHANGELOG
index 63ac84c..f1c4195 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,10 @@
Release Notes - Mesos - Version 1.5.0 (WIP)
-------------------------------------------
This release contains the following new features:
+ * [MESOS-1739] - Agents now support the `--reconfiguration_policy`
+ flag which allows them to recover the agent ID and running tasks
+ after configuration changes. See docs/agent-recovery.md for more
+ details.
Deprecations/Removals:
* Agent flag `--executor_secret_key` has been deprecated. Operators
http://git-wip-us.apache.org/repos/asf/mesos/blob/ee621bb3/docs/agent-recovery.md
----------------------------------------------------------------------
diff --git a/docs/agent-recovery.md b/docs/agent-recovery.md
index 35cd5b1..8df72cb 100644
--- a/docs/agent-recovery.md
+++ b/docs/agent-recovery.md
@@ -8,71 +8,108 @@ layout: documentation
If the `mesos-agent` process on a host exits (perhaps due to a Mesos bug or
because the operator kills the process while [upgrading Mesos](upgrades.md)),
any executors/tasks that were being managed by the `mesos-agent` process will
-continue to run. When `mesos-agent` is restarted, the operator can control how
-those old executors/tasks are handled:
+continue to run.
- 1. By default, all the executors/tasks that were being managed by the old
- `mesos-agent` process are killed.
- 2. If a framework enabled _checkpointing_ when it registered with the master,
- any executors belonging to that framework can reconnect to the new
- `mesos-agent` process and continue running uninterrupted.
+By default, all the executors/tasks that were being managed by the old
+`mesos-agent` process are expected to gracefully exit on their own, and
+will be shut down after the agent restarted if they did not.
-Hence, enabling framework checkpointing enables tasks to tolerate Mesos agent
-upgrades and unexpected `mesos-agent` crashes without experiencing any
-downtime.
+However, if a framework enabled _checkpointing_ when it registered with the
+master, any executors belonging to that framework can reconnect to the new
+`mesos-agent` process and continue running uninterrupted. Hence, enabling
+framework checkpointing allows tasks to tolerate Mesos agent upgrades and
+unexpected `mesos-agent` crashes without experiencing any downtime.
-Agent recovery works by having the agent _checkpoint_ information (e.g., Task
-Info, Executor Info, Status Updates) about the tasks and executors it is
-managing to local disk. If a framework enables checkpointing, any subsequent
-agent restarts will recover the checkpointed information and reconnect with any
-executors that are still running.
+Agent recovery works by having the agent checkpoint information about its own
+state and about the tasks and executors it is managing to local disk, for
+example the `SlaveInfo`, `FrameworkInfo` and `ExecutorInfo` messages or the
+unacknowledged status updates of running tasks.
-Note that if the operating system on the agent is rebooted, all executors and
-tasks running on the host are killed and are not automatically restarted when
-the host comes back up.
+When the agent restarts, it will verify that its current configuration, set
+from the environment variables and command-line flags, is compatible with the
+checkpointed information and will refuse to restart if not.
-However the agent is allowed to recover its agent ID post a host reboot.
-In case the agent's recovery runs into agent info mismatch which may happen due to resource change associated with reboot, it'll fall back to recovering as a new agent (existing behavior).
-In other cases such as checkpointed resources (e.g. persistent volumes) being incompatible with the agent's resources the recovery will still fail (existing behavior).
+A special case occurs when the agent detects that its host system was rebooted
+since the last run of the agent: The agent will try to recover its previous ID
+as usual, but if that fails it will actually erase the information of the
+previous run and will register with the master as a new agent.
+
+Note that executors and tasks that exited between agent shutdown and restart
+are not automatically restarted during agent recovery.
## Framework Configuration
-A framework can control whether its executors will be recovered by setting the `checkpoint` flag in its `FrameworkInfo` when registering with the master. Enabling this feature results in increased I/O overhead at each agent that runs tasks launched by the framework. By default, frameworks do **not** checkpoint their state.
+A framework can control whether its executors will be recovered by setting
+the `checkpoint` flag in its `FrameworkInfo` when registering with the master.
+Enabling this feature results in increased I/O overhead at each agent that runs
+tasks launched by the framework. By default, frameworks do **not** checkpoint
+their state.
## Agent Configuration
-Three [configuration flags](configuration/agent.md) control the recovery behavior of a Mesos agent:
+Four [configuration flags](configuration/agent.md) control the recovery
+behavior of a Mesos agent:
* `strict`: Whether to do agent recovery in strict mode [Default: true].
- If strict=true, all recovery errors are considered fatal.
- - If strict=false, any errors (e.g., corruption in checkpointed data) during recovery are
- ignored and as much state as possible is recovered.
-
-* `recover`: Whether to recover status updates and reconnect with old executors [Default: reconnect].
- - If recover=reconnect, reconnect with any old live executors, provided the executor's framework enabled checkpointing.
- - If recover=cleanup, kill any old live executors and exit. Use this option when doing an incompatible agent or executor upgrade!
- > NOTE: If no checkpointing information exists, no recovery is performed
- > and the agent registers with the master as a new agent.
-
-* `recovery_timeout`: Amount of time allotted for the agent to recover [Default: 15 mins].
- - If the agent takes longer than `recovery_timeout` to recover, any executors that are waiting to
- reconnect to the agent will self-terminate.
-
-> NOTE: If none of the frameworks have enabled checkpointing,
-> the executors and tasks running at an agent die when the agent dies
-> and are not recovered.
-
-A restarted agent should re-register with master within a timeout (75 seconds by default: see the `--max_agent_ping_timeouts` and `--agent_ping_timeout` [configuration flags](configuration.md)). If the agent takes longer than this timeout to re-register, the master shuts down the agent, which in turn will shutdown any live executors/tasks. Therefore, it is highly recommended to automate the process of restarting an agent (e.g., using a process supervisor such as [monit](http://mmonit.com/monit/) or `systemd`).
+ - If strict=false, any errors (e.g., corruption in checkpointed data) during
+ recovery are ignored and as much state as possible is recovered.
+
+* `reconfiguration_policy`: Which kind of configuration changes are accepted
+ when trying to recover [Default: equal].
+ - If reconfiguration_policy=equal, no configuration changes are accepted.
+ - If reconfiguration_policy=additive, the agent will allow the new
+ configuration to contain additional attributes, increased resourced or an
+ additional fault domain. For a more detailed description, see
+ [this](https://git-wip-us.apache.org/repos/asf?p=mesos.git;a=blob;f=src/slave/compatibility.hpp;h=78b421a01abe5d2178c93832577577a7ba282b38;hb=HEAD#l37).
+
+* `recover`: Whether to recover status updates and reconnect with old
+ executors [Default: reconnect]
+ - If recover=reconnect, reconnect with any old live executors, provided
+ the executor's framework enabled checkpointing.
+ - If recover=cleanup, kill any old live executors and exit. Use this
+ option when doing an incompatible agent or executor upgrade!
+ **NOTE:** If no checkpointing information exists, no recovery is performed
+ and the agent registers with the master as a new agent.
+
+* `recovery_timeout`: Amount of time allotted for the agent to
+ recover [Default: 15 mins].
+ - If the agent takes longer than `recovery_timeout` to recover, any
+ executors that are waiting to reconnect to the agent will self-terminate.
+ **NOTE:** If none of the frameworks have enabled checkpointing, the
+ executors and tasks running at an agent die when the agent dies and are
+ not recovered.
+
+A restarted agent should re-register with master within a timeout (75 seconds
+by default: see the `--max_agent_ping_timeouts` and `--agent_ping_timeout`
+[configuration flags](configuration.md)). If the agent takes longer than this
+timeout to re-register, the master shuts down the agent, which in turn will
+shutdown any live executors/tasks.
+
+Therefore, it is highly recommended to automate the process of restarting an
+agent, e.g. using a process supervisor such as [monit](http://mmonit.com/monit/)
+or `systemd`.
## Known issues with `systemd` and process lifetime
-There is a known issue when using `systemd` to launch the `mesos-agent`. A description of the problem can be found in [MESOS-3425](https://issues.apache.org/jira/browse/MESOS-3425) and all relevant work can be tracked in the epic [MESOS-3007](https://issues.apache.org/jira/browse/MESOS-3007).
-This problem was fixed in Mesos `0.25.0` for the mesos containerizer when cgroups isolation is enabled. Further fixes for the posix isolators and docker containerizer are available in `0.25.1`, `0.26.1`, `0.27.1`, and `0.28.0`.
+There is a known issue when using `systemd` to launch the `mesos-agent`. A
+description of the problem can be found in [MESOS-3425](https://issues.apache.org/jira/browse/MESOS-3425)
+and all relevant work can be tracked in the epic [MESOS-3007](https://issues.apache.org/jira/browse/MESOS-3007).
+
+This problem was fixed in Mesos `0.25.0` for the mesos containerizer when
+cgroups isolation is enabled. Further fixes for the posix isolators and docker
+containerizer are available in `0.25.1`, `0.26.1`, `0.27.1`, and `0.28.0`.
-It is recommended that you use the default [KillMode](http://www.freedesktop.org/software/systemd/man/systemd.kill.html) for systemd processes, which is `control-group`, which kills all child processes when the agent stops. This ensures that "side-car" processes such as the `fetcher` and `perf` are terminated alongside the agent.
-The systemd patches for Mesos explicitly move executors and their children into a separate systemd slice, dissociating their lifetime from the agent. This ensures the executors survive agent restarts.
+It is recommended that you use the default [KillMode](http://www.freedesktop.org/software/systemd/man/systemd.kill.html)
+for systemd processes, which is `control-group`, which kills all child processes
+when the agent stops. This ensures that "side-car" processes such as the
+`fetcher` and `perf` are terminated alongside the agent.
+The systemd patches for Mesos explicitly move executors and their children into
+a separate systemd slice, dissociating their lifetime from the agent. This
+ensures the executors survive agent restarts.
-The following excerpt of a `systemd` unit configuration file shows how to set the flag explicitly:
+The following excerpt of a `systemd` unit configuration file shows how to set
+the flag explicitly:
```
[Service]
http://git-wip-us.apache.org/repos/asf/mesos/blob/ee621bb3/docs/configuration/agent.md
----------------------------------------------------------------------
diff --git a/docs/configuration/agent.md b/docs/configuration/agent.md
index d629912..b7a242c 100644
--- a/docs/configuration/agent.md
+++ b/docs/configuration/agent.md
@@ -1047,6 +1047,24 @@ this flag. (default: 0secs)
</tr>
<tr>
<td>
+ --reconfiguration_policy=VALUE
+ </td>
+ <td>
+This flag controls which agent configuration changes are considered
+acceptable when recovering the previous agent state. Possible values:
+ equal: The old and the new state must match exactly.
+ additive: The new state must be a superset of the old state:
+ it is permitted to add additional resources, attributes
+ and domains but not to remove or to modify existing ones.
+
+Note that this only affects the checking done on the agent itself,
+the master may still reject the agent if it detects a change that it
+considers unacceptable, which, e.g., currently happens when port or hostname
+are changed. (default: equal)
+ </td>
+</tr>
+<tr>
+ <td>
--recover=VALUE
</td>
<td>
http://git-wip-us.apache.org/repos/asf/mesos/blob/ee621bb3/src/slave/flags.cpp
----------------------------------------------------------------------
diff --git a/src/slave/flags.cpp b/src/slave/flags.cpp
index c789e7d..48b8821 100644
--- a/src/slave/flags.cpp
+++ b/src/slave/flags.cpp
@@ -496,14 +496,14 @@ mesos::internal::slave::Flags::Flags()
"reconfiguration_policy",
"This flag controls which agent configuration changes are considered\n"
"acceptable when recovering the previous agent state. Possible values:\n"
- "equal: Require that the old and the new state match exactly.\n"
- "additive: Require that the new state is a superset of the old state:\n"
+ "equal: The old and the new state must match exactly.\n"
+ "additive: The new state must be a superset of the old state:\n"
" it is permitted to add additional resources, attributes\n"
- " and domains but not to remove existing ones.\n"
+ " and domains but not to remove or to modify existing ones.\n"
"Note that this only affects the checking done on the agent itself,\n"
- "the master may still reject the slave if it detects a change that it\n"
- "considers unacceptable, which currently happens when port or hostname\n"
- "are changed.",
+ "the master may still reject the agent if it detects a change that it\n"
+ "considers unacceptable, which, e.g., currently happens when port or\n"
+ "hostname are changed.",
"equal");
add(&Flags::strict,