Skip to content

Commit d8dd258

Browse files
committed
Revert "gc interface if it's not exist in podLister (#5789)"
This reverts commit 8886b91.
1 parent 9d52339 commit d8dd258

File tree

4 files changed

+43
-91
lines changed

4 files changed

+43
-91
lines changed

pkg/daemon/controller.go

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"slices"
77
"strconv"
8-
"strings"
98
"time"
109

1110
nadutils "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/utils"
@@ -679,39 +678,6 @@ func (c *Controller) markAndCleanInternalPort() error {
679678
return nil
680679
}
681680

682-
func (c *Controller) gcInterfaces() {
683-
interfacePodMap, err := ovs.ListInterfacePodMap()
684-
if err != nil {
685-
klog.Errorf("failed to list interface pod map: %v", err)
686-
return
687-
}
688-
for iface, pod := range interfacePodMap {
689-
parts := strings.Split(pod, "/")
690-
if len(parts) < 3 {
691-
klog.Errorf("malformed pod string %q for interface %s, expected format 'namespace/name/errText'", pod, iface)
692-
continue
693-
}
694-
695-
podNamespace, podName, errText := parts[0], parts[1], parts[2]
696-
if strings.Contains(errText, "No such device") {
697-
klog.Infof("pod %s/%s not found, delete ovs interface %s", podNamespace, podName, iface)
698-
if err := ovs.CleanInterface(iface); err != nil {
699-
klog.Errorf("failed to clean ovs interface %s: %v", iface, err)
700-
}
701-
continue
702-
}
703-
704-
if _, err := c.podsLister.Pods(podNamespace).Get(podName); err != nil {
705-
if k8serrors.IsNotFound(err) {
706-
klog.Infof("pod %s/%s not found, delete ovs interface %s", podNamespace, podName, iface)
707-
if err := ovs.CleanInterface(iface); err != nil {
708-
klog.Errorf("failed to clean ovs interface %s: %v", iface, err)
709-
}
710-
}
711-
}
712-
}
713-
}
714-
715681
// Run starts controller
716682
func (c *Controller) Run(stopCh <-chan struct{}) {
717683
defer utilruntime.HandleCrash()
@@ -722,7 +688,7 @@ func (c *Controller) Run(stopCh <-chan struct{}) {
722688
defer c.updatePodQueue.ShutDown()
723689
defer c.deletePodQueue.ShutDown()
724690

725-
go wait.Until(c.gcInterfaces, time.Minute, stopCh)
691+
go wait.Until(ovs.CleanLostInterface, time.Minute, stopCh)
726692
go wait.Until(recompute, 10*time.Minute, stopCh)
727693
go wait.Until(rotateLog, 1*time.Hour, stopCh)
728694

pkg/ovs/ovn-nb-suite_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,6 +1239,10 @@ func (suite *OvnClientTestSuite) Test_OvsClearPodBandwidth() {
12391239
suite.testOvsClearPodBandwidth()
12401240
}
12411241

1242+
func (suite *OvnClientTestSuite) Test_OvsCleanLostInterface() {
1243+
suite.testOvsCleanLostInterface()
1244+
}
1245+
12421246
func (suite *OvnClientTestSuite) Test_OvsCleanDuplicatePort() {
12431247
suite.testOvsCleanDuplicatePort()
12441248
}

pkg/ovs/ovs-vsctl.go

Lines changed: 31 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -228,70 +228,45 @@ func ClearPodBandwidth(podName, podNamespace, ifaceID string) error {
228228
return nil
229229
}
230230

231-
var lastInterfacePodMap map[string]string
232-
233-
func ListInterfacePodMap() (map[string]string, error) {
234-
output, err := Exec("--data=bare", "--format=csv", "--no-heading", "--columns=name,external_ids,error", "find",
235-
"interface", "external_ids:pod_name!=[]", "external_ids:pod_namespace!=[]")
231+
// CleanLostInterface will clean up related ovs port, interface and qos
232+
// When reboot node, the ovs internal interface will be deleted.
233+
func CleanLostInterface() {
234+
interfaceList, err := ovsFind("interface", "name,error", "ofport=-1", "external_ids:pod_netns!=[]")
236235
if err != nil {
237-
klog.Errorf("failed to list interface, %v", err)
238-
return nil, err
239-
}
240-
lines := strings.Split(output, "\n")
241-
result := make(map[string]string, len(lines))
242-
for _, l := range lines {
243-
if len(strings.TrimSpace(l)) == 0 {
244-
continue
245-
}
246-
parts := strings.Split(strings.TrimSpace(l), ",")
247-
if len(parts) != 3 {
248-
continue
249-
}
250-
ifaceName := strings.TrimSpace(parts[0])
251-
errText := strings.TrimSpace(parts[2])
252-
var podNamespace, podName string
253-
for externalID := range strings.FieldsSeq(parts[1]) {
254-
if strings.Contains(externalID, "pod_name=") {
255-
podName = strings.TrimPrefix(strings.TrimSpace(externalID), "pod_name=")
256-
}
257-
258-
if strings.Contains(externalID, "pod_namespace=") {
259-
podNamespace = strings.TrimPrefix(strings.TrimSpace(externalID), "pod_namespace=")
260-
}
261-
}
262-
result[ifaceName] = fmt.Sprintf("%s/%s/%s", podNamespace, podName, errText)
236+
klog.Errorf("failed to list failed interface %v", err)
237+
return
263238
}
264-
if !maps.Equal(result, lastInterfacePodMap) {
265-
klog.Infof("interface pod map: %v", result)
266-
lastInterfacePodMap = maps.Clone(result)
239+
if len(interfaceList) > 0 {
240+
klog.Infof("error interfaces:\n %v", interfaceList)
267241
}
268-
return result, nil
269-
}
270242

271-
func CleanInterface(name string) error {
272-
qosList, err := ovsFind("port", "qos", "name="+name)
273-
if err != nil {
274-
klog.Errorf("failed to find related port %v", err)
275-
return err
276-
}
277-
klog.Infof("delete lost port %s", name)
278-
output, err := Exec("--if-exists", "--with-iface", "del-port", name)
279-
if err != nil {
280-
klog.Errorf("failed to delete ovs port %v, %s", err, output)
281-
return err
282-
}
283-
for _, qos := range qosList {
284-
qos = strings.TrimSpace(qos)
285-
if qos != "" && qos != "[]" {
286-
klog.Infof("delete lost qos %s", qos)
287-
err = ovsDestroy("qos", qos)
243+
for _, intf := range interfaceList {
244+
name, errText := strings.Trim(strings.Split(intf, "\n")[0], "\""), strings.Split(intf, "\n")[1]
245+
if strings.Contains(errText, "No such device") {
246+
qosList, err := ovsFind("port", "qos", "name="+name)
288247
if err != nil {
289-
klog.Errorf("failed to delete qos %s, %v", qos, err)
290-
return err
248+
klog.Errorf("failed to find related port %v", err)
249+
return
250+
}
251+
klog.Infof("delete lost port %s", name)
252+
output, err := Exec("--if-exists", "--with-iface", "del-port", name)
253+
if err != nil {
254+
klog.Errorf("failed to delete ovs port %v, %s", err, output)
255+
return
256+
}
257+
for _, qos := range qosList {
258+
qos = strings.TrimSpace(qos)
259+
if qos != "" && qos != "[]" {
260+
klog.Infof("delete lost qos %s", qos)
261+
err = ovsDestroy("qos", qos)
262+
if err != nil {
263+
klog.Errorf("failed to delete qos %s, %v", qos, err)
264+
return
265+
}
266+
}
291267
}
292268
}
293269
}
294-
return nil
295270
}
296271

297272
// Find and remove any existing OVS port with this iface-id. Pods can

pkg/ovs/ovs-vsctl_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,13 @@ func (suite *OvnClientTestSuite) testOvsClearPodBandwidth() {
163163
require.Error(t, err)
164164
}
165165

166+
func (suite *OvnClientTestSuite) testOvsCleanLostInterface() {
167+
t := suite.T()
168+
t.Parallel()
169+
170+
CleanLostInterface()
171+
}
172+
166173
func (suite *OvnClientTestSuite) testOvsCleanDuplicatePort() {
167174
t := suite.T()
168175
t.Parallel()

0 commit comments

Comments
 (0)