Skip to content

Commit e4e15bb

Browse files
goyalpalak18urunc-bot[bot]
authored andcommitted
fix: handle dead VMM and scan all urunc TAP devices during cleanup
Treat ESRCH from killProcess as success since the process is already gone, allowing network cleanup to proceed instead of failing silently. Refactored network.Cleanup to scan for all tap.*_urunc interfaces rather than relying on a hardcoded name. Continue processing remaining devices on per-device errors and return a joined error at the end. Fixes #408 Integrates #407 PR: #476 Signed-off-by: goyalpalak18 <goyalpalak1806@gmail.com> Reviewed-by: Charalampos Mainas <cmainas@nubificus.co.uk> Approved-by: Charalampos Mainas <cmainas@nubificus.co.uk>
1 parent 775bf81 commit e4e15bb

4 files changed

Lines changed: 49 additions & 26 deletions

File tree

.github/linters/urunc-dict.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,3 +403,4 @@ gocyclo
403403
gomega
404404
Logr
405405
onsi
406+
ESRCH

pkg/network/network.go

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"errors"
1919
"fmt"
2020
"net"
21+
"regexp"
2122
"strings"
2223

2324
"github.com/jackpal/gateway"
@@ -262,35 +263,53 @@ func networkSetup(tapName string, ipAddress string, redirectLink netlink.Link, a
262263
return newTapDevice, nil
263264
}
264265

265-
func Cleanup(tapDevice string) error {
266+
func CleanupAllUruncTaps() error {
266267
netlog.Debug("net cleanup called")
267-
ifaces, err := net.Interfaces()
268-
if err != nil {
269-
return err
270-
}
271-
for _, iface := range ifaces {
272-
netlog.Debugf("Discovered device %s", iface.Name)
273-
}
274-
tapLink, err := netlink.LinkByName(tapDevice)
275-
if err != nil {
276-
netlog.Errorf("Failed to get link %s by name: %v", tapDevice, err)
277-
return nil
278-
}
279-
err = deleteAllTCFilters(tapLink)
268+
269+
handle, err := netlink.NewHandle()
280270
if err != nil {
281-
netlog.Errorf("Failed to delete all TC filters: %v", err)
282-
return err
271+
return fmt.Errorf("failed to get netlink handle: %w", err)
283272
}
284-
err = deleteAllQDiscs(tapLink)
273+
defer handle.Close()
274+
275+
links, err := handle.LinkList()
285276
if err != nil {
286-
netlog.Errorf("Failed to delete all qdiscs: %v", err)
287-
return err
277+
return fmt.Errorf("failed to list links: %w", err)
288278
}
289-
err = deleteTapDevice(tapLink)
290-
if err != nil {
291-
netlog.Errorf("Failed to delete link %s: %v", tapDevice, err)
279+
280+
var retErr error
281+
tapRe := regexp.MustCompile(`^tap_\d+_urunc$`)
282+
for _, link := range links {
283+
attrs := link.Attrs()
284+
if attrs == nil {
285+
continue
286+
}
287+
name := attrs.Name
288+
if !tapRe.MatchString(name) {
289+
continue
290+
}
291+
292+
netlog.Debugf("cleaning up tap device %s", name)
293+
var devErr error
294+
if err := deleteAllTCFilters(link); err != nil {
295+
netlog.Errorf("failed to delete TC filters for %s: %v", name, err)
296+
devErr = errors.Join(devErr, err)
297+
}
298+
if err := deleteAllQDiscs(link); err != nil {
299+
netlog.Errorf("failed to delete qdiscs for %s: %v", name, err)
300+
devErr = errors.Join(devErr, err)
301+
}
302+
if err := deleteTapDevice(link); err != nil {
303+
netlog.Errorf("failed to delete tap %s: %v", name, err)
304+
devErr = errors.Join(devErr, err)
305+
}
306+
if devErr == nil {
307+
netlog.Debugf("deleted tap device %s", name)
308+
}
309+
retErr = errors.Join(retErr, devErr)
292310
}
293-
return nil
311+
312+
return retErr
294313
}
295314

296315
func deleteIngressQdisc(link netlink.Link) error {

pkg/unikontainers/hypervisors/utils.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ func killProcess(pid int) error {
7171
const timeout = 2 * time.Second
7272
err := syscall.Kill(pid, unix.SIGKILL)
7373
if err != nil {
74+
if errors.Is(err, syscall.ESRCH) {
75+
// Process already dead, nothing to do
76+
return nil
77+
}
7478
return err
7579
}
7680
deadline := time.Now().Add(timeout)

pkg/unikontainers/unikontainers.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -585,10 +585,9 @@ func (u *Unikontainer) Kill() error {
585585
return err
586586
}
587587

588-
// TODO: tap0_urunc should not be hardcoded
589-
err = network.Cleanup("tap0_urunc")
588+
err = network.CleanupAllUruncTaps()
590589
if err != nil {
591-
uniklog.Errorf("failed to delete tap0_urunc: %v", err)
590+
uniklog.Errorf("failed to cleanup tap devices: %v", err)
592591
}
593592

594593
return nil

0 commit comments

Comments
 (0)