Skip to content

Commit e253a2b

Browse files
author
selansen
committed
VETH interface cleanup when dockerD suddenly crashes
VETH interface was not cleaned up when DockerD got killed between addEndpoint and updateToStore calls. I have added logs and made sure calling updateToStore before addEndpoint contains same values. Hence moving up the call looks safer and VETH gets cleaned up even after DockerD gets killed in the middle. Signed-off-by: selansen <elango@docker.com>
1 parent 9bca9a4 commit e253a2b

1 file changed

Lines changed: 12 additions & 11 deletions

File tree

network.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,33 +1156,34 @@ func (n *network) createEndpoint(name string, options ...EndpointOption) (Endpoi
11561156
ep.releaseAddress()
11571157
}
11581158
}()
1159-
1160-
if err = n.addEndpoint(ep); err != nil {
1159+
// Moving updateToSTore before calling addEndpoint so that we shall clean up VETH interfaces in case
1160+
// DockerD get killed between addEndpoint and updateSTore call
1161+
if err = n.getController().updateToStore(ep); err != nil {
11611162
return nil, err
11621163
}
11631164
defer func() {
11641165
if err != nil {
1165-
if e := ep.deleteEndpoint(false); e != nil {
1166-
logrus.Warnf("cleaning up endpoint failed %s : %v", name, e)
1166+
if e := n.getController().deleteFromStore(ep); e != nil {
1167+
logrus.Warnf("error rolling back endpoint %s from store: %v", name, e)
11671168
}
11681169
}
11691170
}()
11701171

1171-
if err = ep.assignAddress(ipam, false, n.enableIPv6 && n.postIPv6); err != nil {
1172-
return nil, err
1173-
}
1174-
1175-
if err = n.getController().updateToStore(ep); err != nil {
1172+
if err = n.addEndpoint(ep); err != nil {
11761173
return nil, err
11771174
}
11781175
defer func() {
11791176
if err != nil {
1180-
if e := n.getController().deleteFromStore(ep); e != nil {
1181-
logrus.Warnf("error rolling back endpoint %s from store: %v", name, e)
1177+
if e := ep.deleteEndpoint(false); e != nil {
1178+
logrus.Warnf("cleaning up endpoint failed %s : %v", name, e)
11821179
}
11831180
}
11841181
}()
11851182

1183+
if err = ep.assignAddress(ipam, false, n.enableIPv6 && n.postIPv6); err != nil {
1184+
return nil, err
1185+
}
1186+
11861187
// Watch for service records
11871188
n.getController().watchSvcRecord(ep)
11881189
defer func() {

0 commit comments

Comments
 (0)