You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by zh...@apache.org on 2022/03/03 06:44:08 UTC

[apisix-ingress-controller] branch master updated: fix: filter useless pod update event (#894)

This is an automated email from the ASF dual-hosted git repository.

zhangjintao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git


The following commit(s) were added to refs/heads/master by this push:
     new bbaba6f  fix: filter useless pod update event (#894)
bbaba6f is described below

commit bbaba6f9c22196e5d3142ad7e1a2224474a1c553
Author: cmssczy <ca...@cmss.chinamobile.com>
AuthorDate: Thu Mar 3 14:44:04 2022 +0800

    fix: filter useless pod update event (#894)
---
 pkg/ingress/pod.go      | 26 +++++++++++++++-----------
 pkg/ingress/pod_test.go | 19 +++++++++++++------
 2 files changed, 28 insertions(+), 17 deletions(-)

diff --git a/pkg/ingress/pod.go b/pkg/ingress/pod.go
index 51a5cea..fb78067 100644
--- a/pkg/ingress/pod.go
+++ b/pkg/ingress/pod.go
@@ -84,29 +84,33 @@ func (c *podController) onAdd(obj interface{}) {
 	c.controller.MetricsCollector.IncrEvents("pod", "add")
 }
 
-func (c *podController) onUpdate(_, cur interface{}) {
-	pod := cur.(*corev1.Pod)
+func (c *podController) onUpdate(oldObj, newObj interface{}) {
+	prev := oldObj.(*corev1.Pod)
+	curr := newObj.(*corev1.Pod)
+	if prev.GetResourceVersion() >= curr.GetResourceVersion() {
+		return
+	}
 
-	if !c.controller.isWatchingNamespace(pod.Namespace + "/" + pod.Name) {
+	if !c.controller.isWatchingNamespace(curr.Namespace + "/" + curr.Name) {
 		return
 	}
 	log.Debugw("pod update event arrived",
-		zap.Any("pod namespace", pod.Namespace),
-		zap.Any("pod name", pod.Name),
+		zap.Any("pod namespace", curr.Namespace),
+		zap.Any("pod name", curr.Name),
 	)
-	if pod.DeletionTimestamp != nil {
-		if err := c.controller.podCache.Delete(pod); err != nil {
+	if curr.DeletionTimestamp != nil {
+		if err := c.controller.podCache.Delete(curr); err != nil {
 			log.Errorw("failed to delete pod from cache",
 				zap.Error(err),
-				zap.Any("pod", pod),
+				zap.Any("pod", curr),
 			)
 		}
 	}
-	if pod.Status.PodIP != "" {
-		if err := c.controller.podCache.Add(pod); err != nil {
+	if curr.Status.PodIP != "" {
+		if err := c.controller.podCache.Add(curr); err != nil {
 			log.Errorw("failed to add pod to cache",
 				zap.Error(err),
-				zap.Any("pod", pod),
+				zap.Any("pod", curr),
 			)
 		}
 	}
diff --git a/pkg/ingress/pod_test.go b/pkg/ingress/pod_test.go
index e12248d..b75886b 100644
--- a/pkg/ingress/pod_test.go
+++ b/pkg/ingress/pod_test.go
@@ -125,7 +125,7 @@ func TestPodOnUpdate(t *testing.T) {
 		},
 	}
 
-	pod := &corev1.Pod{
+	pod0 := &corev1.Pod{
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace: "default",
 			Name:      "nginx",
@@ -138,17 +138,24 @@ func TestPodOnUpdate(t *testing.T) {
 			PodIP: "10.0.5.12",
 		},
 	}
-	assert.Nil(t, ctl.controller.podCache.Add(pod), "adding pod")
+	pod1 := pod0.DeepCopy()
+	pod1.SetResourceVersion("1")
 
-	ctl.onUpdate(nil, pod)
+	ctl.onUpdate(pod1, pod0)
 	name, err := ctl.controller.podCache.GetNameByIP("10.0.5.12")
+	assert.Equal(t, "", name)
+	assert.Equal(t, types.ErrPodNotFound, err)
+
+	ctl.onUpdate(pod0, pod1)
+	name, err = ctl.controller.podCache.GetNameByIP("10.0.5.12")
 	assert.Equal(t, "nginx", name)
 	assert.Equal(t, nil, err)
 
 	pod2 := &corev1.Pod{
 		ObjectMeta: metav1.ObjectMeta{
-			Namespace: "public",
-			Name:      "abc",
+			Namespace:       "public",
+			Name:            "abc",
+			ResourceVersion: "2",
 		},
 		Status: corev1.PodStatus{
 			Phase: corev1.PodRunning,
@@ -156,7 +163,7 @@ func TestPodOnUpdate(t *testing.T) {
 		},
 	}
 	assert.Nil(t, ctl.controller.podCache.Add(pod2), "adding pod")
-	ctl.onUpdate(nil, pod2)
+	ctl.onUpdate(pod1, pod2)
 	name, err = ctl.controller.podCache.GetNameByIP("10.0.5.13")
 	assert.Equal(t, "abc", name)
 	assert.Nil(t, err)