-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/75086/#review226682
-----------------------------------------------------------
Ship it!
local edits:
```
diff --git a/src/linux/routing/link/veth.cpp b/src/linux/routing/link/veth.cpp
index be433744b..36aad5fec 100644
--- a/src/linux/routing/link/veth.cpp
+++ b/src/linux/routing/link/veth.cpp
@@ -46,18 +46,6 @@ Try<bool> create(
}
struct nl_sock *sock = socket->get();
- const char *name = veth.c_str();
- const char *peer_name = peer.c_str();
- unsigned char mac_addr_uchar[6];
-
- if (veth_mac.isSome()) {
- // Copy values from uint8_t array to unsigned char array
- for (int i = 0; i < 6; i++) {
- mac_addr_uchar[i] = (unsigned char) (*veth_mac)[i];
- }
- }
-
-
struct rtnl_link *link, *peer_link;
int error = -NLE_NOMEM;
@@ -67,17 +55,18 @@ Try<bool> create(
peer_link = rtnl_link_veth_get_peer(link);
struct nl_addr *addr;
+
if (veth_mac.isSome()) {
- addr = nl_addr_build(AF_LLC, mac_addr_uchar, 6);
- rtnl_link_set_addr(link, addr);
+ unsigned char mac_addr_uchar[6];
+ for (int i = 0; i < 6; i++) {
+ mac_addr_uchar[i] = (unsigned char) (*veth_mac)[i];
+ }
+ addr = nl_addr_build(AF_LLC, mac_addr_uchar, 6);
+ rtnl_link_set_addr(link, addr);
}
- if (name) {
- rtnl_link_set_name(link, name);
- }
- if (peer_name) {
- rtnl_link_set_name(peer_link, peer_name);
- }
+ rtnl_link_set_name(link, veth.c_str());
+ rtnl_link_set_name(peer_link, peer.c_str());
rtnl_link_set_ns_pid(peer_link, pid.getOrElse(getpid()));
error = rtnl_link_add(sock, link, NLM_F_CREATE | NLM_F_EXCL);
diff --git a/src/linux/routing/link/veth.hpp b/src/linux/routing/link/veth.hpp
index 822f40256..1e54ce696 100644
--- a/src/linux/routing/link/veth.hpp
+++ b/src/linux/routing/link/veth.hpp
@@ -35,13 +35,14 @@ namespace veth {
// caller's network namespace. Returns false if the virtual network
// links (with the same name) already exist.
//
-// We provide the ability to assign a specified MAC to the veth device on
-// creation via veth_mac
+// We provide the ability to assign a specified MAC to the host network
+// namespace veth device on creation via veth_mac:
+//
// In systems with systemd version above 242, there is a potential data race
// where udev will try to update the MAC address of the device at the same
// time as us if the systemd's MacAddressPolicy is set to 'persistent'.
// To prevent udev from trying to set the veth device's MAC address by itself,
-// we must set the device MAC address on creation so that addr_assign_type
+// we *must* set the device MAC address on creation so that addr_assign_type
// will be set to NET_ADDR_SET, which prevents udev from attempting to
// change the MAC address of the veth device.
// see:
https://github.com/torvalds/linux/commit/2afb9b533423a9b97f84181e773cf9361d98fed6
diff --git a/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
b/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
index 28d967bd2..894d77c56 100644
--- a/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
+++ b/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
@@ -3595,8 +3595,12 @@ Future<Nothing> PortMappingIsolatorProcess::isolate(
LOG(INFO) << "Created network namespace handle symlink '"
<< linker << "' -> '" << target << "'";
- // Create a virtual ethernet pair for this container, also set its MAC
- // address to match host public interface eth0
+ // Create a virtual ethernet pair for this container, also set the MAC
+ // address of the host network namespace veth<pid> interface to match
+ // that of the host network namespace eth0.
+ //
+ // TODO(jasonzhou): Also set the mac address of the container network
+ // namespace eth0 here on creation, to avoid the race with udev: MESOS-10243.
Try<bool> createVethPair = link::veth::create(veth(pid), eth0, pid, hostMAC);
if (createVethPair.isError()) {
return Failure(
diff --git a/src/tests/containerizer/routing_tests.cpp
b/src/tests/containerizer/routing_tests.cpp
index f07c8f8ea..b18f741e0 100644
--- a/src/tests/containerizer/routing_tests.cpp
+++ b/src/tests/containerizer/routing_tests.cpp
@@ -260,7 +260,8 @@ protected:
TEST_F(RoutingVethTest, ROOT_LinkCreate)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -269,13 +270,18 @@ TEST_F(RoutingVethTest, ROOT_LinkCreate)
EXPECT_SOME_NE(0, link::index(TEST_PEER_LINK));
// Test the case where the veth (with the same name) already exists.
- EXPECT_SOME_FALSE(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ EXPECT_SOME_FALSE(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
}
+
TEST_F(RoutingVethTest, ROOT_LinkCreateWithTargetMAC)
{
uint8_t bytes[6] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc};
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
net::MAC(bytes)));
+ net::MAC target_mac = net::MAC(bytes);
+
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), target_mac));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -286,16 +292,18 @@ TEST_F(RoutingVethTest, ROOT_LinkCreateWithTargetMAC)
Result<net::MAC> mac = net::mac(TEST_VETH_LINK);
ASSERT_SOME(mac);
- EXPECT_EQ(mac.get(), net::MAC(bytes));
+ EXPECT_EQ(*mac, target_mac);
// Test the case where the veth (with the same name) already exists.
- EXPECT_SOME_FALSE(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ EXPECT_SOME_FALSE(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
}
TEST_F(RoutingVethTest, ROOT_LinkRemove)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::remove(TEST_VETH_LINK));
EXPECT_SOME_FALSE(link::remove(TEST_VETH_LINK));
@@ -354,7 +362,8 @@ TEST_F(RoutingVethTest, ROOT_LinkWait)
{
AWAIT_READY(link::removed(TEST_VETH_LINK));
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -369,7 +378,8 @@ TEST_F(RoutingVethTest, ROOT_LinkWait)
TEST_F(RoutingVethTest, ROOT_LinkSetUp)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -389,7 +399,8 @@ TEST_F(RoutingVethTest, ROOT_LinkSetUp)
TEST_F(RoutingVethTest, ROOT_LinkSetMAC)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -420,7 +431,8 @@ TEST_F(RoutingVethTest, ROOT_LinkSetMAC)
TEST_F(RoutingVethTest, ROOT_LinkMTU)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -441,7 +453,8 @@ TEST_F(RoutingVethTest, ROOT_IngressQdisc)
// Test for a qdisc on a nonexistent interface should fail.
EXPECT_SOME_FALSE(ingress::exists("noSuchInterface"));
- EXPECT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ EXPECT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -505,7 +518,8 @@ TEST_F(RoutingVethTest, ROOT_HTBQdisc)
// Test for a qdisc on a nonexistent interface should fail.
EXPECT_SOME_FALSE(htb::exists("noSuchInterface", EGRESS_ROOT));
- EXPECT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ EXPECT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -589,7 +603,8 @@ TEST_F(RoutingVethTest, ROOT_FqCodeQdisc)
// Test for a qdisc on a nonexistent interface should fail.
EXPECT_SOME_FALSE(fq_codel::exists("noSuchInterface", EGRESS_ROOT));
- EXPECT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ EXPECT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -670,7 +685,8 @@ TEST_F(RoutingVethTest, ROOT_FqCodeQdisc)
TEST_F(RoutingVethTest, ROOT_FqCodelClassifier)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -746,7 +762,8 @@ TEST_F(RoutingVethTest, ROOT_FqCodelClassifier)
TEST_F(RoutingVethTest, ROOT_ARPFilterCreate)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -766,7 +783,8 @@ TEST_F(RoutingVethTest, ROOT_ARPFilterCreate)
TEST_F(RoutingVethTest, ROOT_ARPFilterCreateDuplicated)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -796,7 +814,8 @@ TEST_F(RoutingVethTest, ROOT_ARPFilterCreateDuplicated)
TEST_F(RoutingVethTest, ROOT_ARPFilterRemove)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -821,7 +840,8 @@ TEST_F(RoutingVethTest, ROOT_ARPFilterRemove)
TEST_F(RoutingVethTest, ROOT_ARPFilterUpdate)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -858,7 +878,8 @@ TEST_F(RoutingVethTest, ROOT_ARPFilterUpdate)
TEST_F(RoutingVethTest, ROOT_ICMPFilterCreate)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -890,7 +911,8 @@ TEST_F(RoutingVethTest, ROOT_ICMPFilterCreate)
TEST_F(RoutingVethTest, ROOT_ICMPFilterCreateDuplicated)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -923,7 +945,8 @@ TEST_F(RoutingVethTest, ROOT_ICMPFilterCreateDuplicated)
TEST_F(RoutingVethTest, ROOT_ICMPFilterCreateMultiple)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -993,7 +1016,8 @@ TEST_F(RoutingVethTest, ROOT_ICMPFilterRemove)
TEST_F(RoutingVethTest, ROOT_ICMPFilterUpdate)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -1049,7 +1073,8 @@ TEST_F(RoutingVethTest, ROOT_ICMPFilterUpdate)
TEST_F(RoutingVethTest, ROOT_IPFilterCreate)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -1107,7 +1132,8 @@ TEST_F(RoutingVethTest, ROOT_IPFilterCreate)
TEST_F(RoutingVethTest, ROOT_IPFilterCreate2)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -1142,7 +1168,8 @@ TEST_F(RoutingVethTest, ROOT_IPFilterCreate2)
TEST_F(RoutingVethTest, ROOT_IPFilterCreateDuplicated)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -1191,7 +1218,8 @@ TEST_F(RoutingVethTest, ROOT_IPFilterCreateDuplicated)
TEST_F(RoutingVethTest, ROOT_IPFilterCreateMultiple)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -1283,7 +1311,8 @@ TEST_F(RoutingVethTest, ROOT_IPFilterCreateMultiple)
TEST_F(RoutingVethTest, ROOT_IPFilterRemove)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
@@ -1360,7 +1389,8 @@ TEST_F(RoutingVethTest, ROOT_IPFilterRemove)
// Test the workaround introduced for MESOS-1617.
TEST_F(RoutingVethTest, ROOT_HandleGeneration)
{
- ASSERT_SOME(link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(),
None()));
+ ASSERT_SOME(
+ link::veth::create(TEST_VETH_LINK, TEST_PEER_LINK, None(), None()));
EXPECT_SOME_TRUE(link::exists(TEST_VETH_LINK));
EXPECT_SOME_TRUE(link::exists(TEST_PEER_LINK));
```
- Benjamin Mahler
On July 15, 2024, 2:42 p.m., Jason Zhou wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/75086/
> -----------------------------------------------------------
>
> (Updated July 15, 2024, 2:42 p.m.)
>
>
> Review request for mesos and Benjamin Mahler.
>
>
> Bugs: MESOS-10243
> https://issues.apache.org/jira/browse/MESOS-10243
>
>
> Repository: mesos
>
>
> Description
> -------
>
> In systems with systemd version above 242, there is a potential data
> race where udev will try to update the MAC address of the device at the
> same time as us if the systemd's MacAddressPolicy is set to 'persistent'.
> To prevent udev from trying to set the veth device's MAC address by
> itself, we must set the device MAC address on creation so that
> addr_assign_type will be set to NET_ADDR_SET, which prevents udev from
> attempting to change the MAC address of the veth device.
> see:
> https://github.com/torvalds/linux/commit/2afb9b533423a9b97f84181e773cf9361d98fed6
> see:
> https://lore.kernel.org/netdev/cahxsexy8lkzocbdbzss_vjopc_tqmyzm87kc192hpmuhmcq...@mail.gmail.com/T/
> see: https://issues.apache.org/jira/browse/MESOS-10243
>
>
> Diffs
> -----
>
> src/linux/routing/link/link.hpp 09790f31711cf271567176d3d67ed51025d2d712
> src/linux/routing/link/link.cpp bb97e328175dea5c0937defce2e234b0de3cfe32
> src/linux/routing/link/veth.hpp a4acbe9b5c7dd77f3736fc5348743081c04cabf1
> src/linux/routing/link/veth.cpp 6aeb95e710098056b464c2088b0b60cdd3fe3f65
> src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
> 3b3b899fb43364f545eb9748ab4215fd5b2e2895
> src/tests/containerizer/routing_tests.cpp
> c9fa2e86a52873575c77bd0984d4eaba34282eff
>
>
> Diff: https://reviews.apache.org/r/75086/diff/4/
>
>
> Testing
> -------
>
> Added test to check that veth::create with a target MAC address is able to
> create a link with that target MAC address.
> RoutingVethTest and PortMappingIsolatorTest pass (except
> ROOT_ContainerARPExternal which has always failed)
>
>
> Thanks,
>
> Jason Zhou
>
>