Skip to content

Commit 0831236

Browse files
committed
perf: do not set last transition time for status in watcher layer
Signed-off-by: Rudrakh Panigrahi <[email protected]>
1 parent 1d0f076 commit 0831236

File tree

10 files changed

+456
-77
lines changed

10 files changed

+456
-77
lines changed

internal/gatewayapi/status/backend.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
package status
1515

1616
import (
17-
"time"
18-
1917
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2018

2119
egv1a1 "github.com/envoyproxy/gateway/api/v1alpha1"
@@ -33,10 +31,10 @@ func computeBackendAcceptedCondition(be *egv1a1.Backend, accepted bool, msg stri
3331
case true:
3432
return newCondition(string(egv1a1.BackendReasonAccepted), metav1.ConditionTrue,
3533
string(egv1a1.BackendConditionAccepted),
36-
"The Backend was accepted", time.Now(), be.Generation)
34+
"The Backend was accepted", be.Generation)
3735
default:
3836
return newCondition(string(egv1a1.BackendReasonInvalid), metav1.ConditionFalse,
3937
string(egv1a1.BackendConditionAccepted),
40-
msg, time.Now(), be.Generation)
38+
msg, be.Generation)
4139
}
4240
}

internal/gatewayapi/status/conditions.go

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,9 @@
1414
package status
1515

1616
import (
17-
"time"
1817
"unicode"
1918

2019
"github.com/google/go-cmp/cmp"
21-
"github.com/google/go-cmp/cmp/cmpopts"
2220
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2321
)
2422

@@ -37,12 +35,11 @@ func MergeConditions(conditions []metav1.Condition, updates ...metav1.Condition)
3735
for j := range conditions {
3836
if conditions[j].Type == updates[i].Type {
3937
add = false
40-
if conditionChanged(&conditions[j], &updates[i]) {
38+
if !cmp.Equal(conditions[j], updates[i]) {
4139
conditions[j].Status = updates[i].Status
4240
conditions[j].Reason = updates[i].Reason
4341
conditions[j].Message = updates[i].Message
4442
conditions[j].ObservedGeneration = updates[i].ObservedGeneration
45-
conditions[j].LastTransitionTime = updates[i].LastTransitionTime
4643
break
4744
}
4845
}
@@ -55,22 +52,16 @@ func MergeConditions(conditions []metav1.Condition, updates ...metav1.Condition)
5552
return conditions
5653
}
5754

58-
func newCondition(t string, status metav1.ConditionStatus, reason, msg string, lt time.Time, og int64) metav1.Condition {
55+
func newCondition(t string, status metav1.ConditionStatus, reason, msg string, og int64) metav1.Condition {
5956
return metav1.Condition{
6057
Type: t,
6158
Status: status,
6259
Reason: reason,
6360
Message: truncateConditionMessage(msg),
64-
LastTransitionTime: metav1.NewTime(lt),
6561
ObservedGeneration: og,
6662
}
6763
}
6864

69-
func conditionChanged(a, b *metav1.Condition) bool {
70-
opts := cmpopts.IgnoreFields(metav1.Condition{}, "Type", "LastTransitionTime")
71-
return !cmp.Equal(*a, *b, opts)
72-
}
73-
7465
// Error2ConditionMsg format the error string to a Status condition message.
7566
// * Convert the first letter to capital
7667
// * Append "." to the string if it doesn't exist

internal/gatewayapi/status/conditions_test.go

Lines changed: 18 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,13 @@ import (
1717
"errors"
1818
"strings"
1919
"testing"
20-
"time"
2120

21+
"github.com/google/go-cmp/cmp"
2222
"github.com/stretchr/testify/assert"
2323
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24-
utilclock "k8s.io/utils/clock"
25-
fakeclock "k8s.io/utils/clock/testing"
2624
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
2725
)
2826

29-
var clock utilclock.Clock = utilclock.RealClock{}
30-
3127
func TestConditionChanged(t *testing.T) {
3228
testCases := []struct {
3329
name string
@@ -88,24 +84,13 @@ func TestConditionChanged(t *testing.T) {
8884
}
8985

9086
for _, tc := range testCases {
91-
if got := conditionChanged(&tc.a, &tc.b); got != tc.expected {
87+
if got := !cmp.Equal(tc.a, tc.b); got != tc.expected {
9288
assert.Equal(t, tc.expected, got, tc.name)
9389
}
9490
}
9591
}
9692

9793
func TestMergeConditions(t *testing.T) {
98-
// Inject a fake clock and don't forget to reset it
99-
fakeClock := fakeclock.NewFakeClock(time.Time{})
100-
clock = fakeClock
101-
defer func() {
102-
clock = utilclock.RealClock{}
103-
}()
104-
105-
start := fakeClock.Now()
106-
middle := start.Add(1 * time.Minute)
107-
later := start.Add(2 * time.Minute)
108-
10994
gen := int64(1)
11095

11196
testCases := []struct {
@@ -117,69 +102,65 @@ func TestMergeConditions(t *testing.T) {
117102
{
118103
name: "status updated",
119104
current: []metav1.Condition{
120-
newCondition("available", "false", "Reason", "Message", start, gen),
105+
newCondition("available", "false", "Reason", "Message", gen),
121106
},
122107
updates: []metav1.Condition{
123-
newCondition("available", "true", "Reason", "Message", middle, gen),
108+
newCondition("available", "true", "Reason", "Message", gen),
124109
},
125110
expected: []metav1.Condition{
126-
newCondition("available", "true", "Reason", "Message", middle, gen),
111+
newCondition("available", "true", "Reason", "Message", gen),
127112
},
128113
},
129114
{
130115
name: "reason updated",
131116
current: []metav1.Condition{
132-
newCondition("available", "false", "Reason", "Message", start, gen),
117+
newCondition("available", "false", "Reason", "Message", gen),
133118
},
134119
updates: []metav1.Condition{
135-
newCondition("available", "false", "New Reason", "Message", middle, gen),
120+
newCondition("available", "false", "New Reason", "Message", gen),
136121
},
137122
expected: []metav1.Condition{
138-
newCondition("available", "false", "New Reason", "Message", middle, gen),
123+
newCondition("available", "false", "New Reason", "Message", gen),
139124
},
140125
},
141126
{
142127
name: "message updated",
143128
current: []metav1.Condition{
144-
newCondition("available", "false", "Reason", "Message", start, gen),
129+
newCondition("available", "false", "Reason", "Message", gen),
145130
},
146131
updates: []metav1.Condition{
147-
newCondition("available", "false", "Reason", "New Message", middle, gen),
132+
newCondition("available", "false", "Reason", "New Message", gen),
148133
},
149134
expected: []metav1.Condition{
150-
newCondition("available", "false", "Reason", "New Message", middle, gen),
135+
newCondition("available", "false", "Reason", "New Message", gen),
151136
},
152137
},
153138
{
154139
name: "observed generation updated",
155140
current: []metav1.Condition{
156-
newCondition("available", "false", "Reason", "Message", start, gen),
141+
newCondition("available", "false", "Reason", "Message", gen),
157142
},
158143
updates: []metav1.Condition{
159-
newCondition("available", "false", "Reason", "Message", middle, gen+1),
144+
newCondition("available", "false", "Reason", "Message", gen+1),
160145
},
161146
expected: []metav1.Condition{
162-
newCondition("available", "false", "Reason", "Message", middle, gen+1),
147+
newCondition("available", "false", "Reason", "Message", gen+1),
163148
},
164149
},
165150
{
166151
name: "status unchanged",
167152
current: []metav1.Condition{
168-
newCondition("available", "false", "Reason", "Message", start, gen),
153+
newCondition("available", "false", "Reason", "Message", gen),
169154
},
170155
updates: []metav1.Condition{
171-
newCondition("available", "false", "Reason", "Message", middle, gen),
156+
newCondition("available", "false", "Reason", "Message", gen),
172157
},
173158
expected: []metav1.Condition{
174-
newCondition("available", "false", "Reason", "Message", start, gen),
159+
newCondition("available", "false", "Reason", "Message", gen),
175160
},
176161
},
177162
}
178163

179-
// Simulate the passage of time between original condition creation
180-
// and update processing
181-
fakeClock.SetTime(later)
182-
183164
for _, tc := range testCases {
184165
got := MergeConditions(tc.current, tc.updates...)
185166
assert.ElementsMatch(t, tc.expected, got, tc.name)
@@ -188,7 +169,7 @@ func TestMergeConditions(t *testing.T) {
188169

189170
func TestMergeConditionsTruncatesMessages(t *testing.T) {
190171
longMsg := strings.Repeat("x", conditionMessageMaxLength+5)
191-
cond := newCondition("available", metav1.ConditionTrue, "Reason", longMsg, time.Now(), 1)
172+
cond := newCondition("available", metav1.ConditionTrue, "Reason", longMsg, 1)
192173
conditions := MergeConditions(nil, cond)
193174

194175
if assert.Len(t, conditions, 1) {

internal/gatewayapi/status/envoypatchpolicy.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package status
77

88
import (
99
"strings"
10-
"time"
1110

1211
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1312
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
@@ -30,22 +29,22 @@ func SetProgrammedForEnvoyPatchPolicy(s *gwapiv1.PolicyStatus) {
3029
}
3130

3231
message := "Patches have been successfully applied."
33-
cond := newCondition(string(egv1a1.PolicyConditionProgrammed), metav1.ConditionTrue, string(egv1a1.PolicyReasonProgrammed), message, time.Now(), 0)
32+
cond := newCondition(string(egv1a1.PolicyConditionProgrammed), metav1.ConditionTrue, string(egv1a1.PolicyReasonProgrammed), message, 0)
3433
for i := range s.Ancestors {
3534
s.Ancestors[i].Conditions = MergeConditions(s.Ancestors[i].Conditions, cond)
3635
}
3736
}
3837

3938
func SetTranslationErrorForEnvoyPatchPolicy(s *gwapiv1.PolicyStatus, errMsg string) {
40-
cond := newCondition(string(egv1a1.PolicyConditionProgrammed), metav1.ConditionFalse, string(egv1a1.PolicyReasonInvalid), errMsg, time.Now(), 0)
39+
cond := newCondition(string(egv1a1.PolicyConditionProgrammed), metav1.ConditionFalse, string(egv1a1.PolicyReasonInvalid), errMsg, 0)
4140
for i := range s.Ancestors {
4241
s.Ancestors[i].Conditions = MergeConditions(s.Ancestors[i].Conditions, cond)
4342
}
4443
}
4544

4645
func SetResourceNotFoundErrorForEnvoyPatchPolicy(s *gwapiv1.PolicyStatus, notFoundResources []string) {
4746
message := "Unable to find xds resources: " + strings.Join(notFoundResources, ",")
48-
cond := newCondition(string(egv1a1.PolicyConditionProgrammed), metav1.ConditionFalse, string(egv1a1.PolicyReasonResourceNotFound), message, time.Now(), 0)
47+
cond := newCondition(string(egv1a1.PolicyConditionProgrammed), metav1.ConditionFalse, string(egv1a1.PolicyReasonResourceNotFound), message, 0)
4948
for i := range s.Ancestors {
5049
s.Ancestors[i].Conditions = MergeConditions(s.Ancestors[i].Conditions, cond)
5150
}

internal/gatewayapi/status/gateway.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package status
88
import (
99
"fmt"
1010
"slices"
11-
"time"
1211

1312
appsv1 "k8s.io/api/apps/v1"
1413
corev1 "k8s.io/api/core/v1"
@@ -19,14 +18,14 @@ import (
1918
)
2019

2120
func UpdateGatewayStatusNotAccepted(gw *gwapiv1.Gateway, reason gwapiv1.GatewayConditionReason, msg string) *gwapiv1.Gateway {
22-
cond := newCondition(string(gwapiv1.GatewayConditionAccepted), metav1.ConditionFalse, string(reason), msg, time.Now(), gw.Generation)
21+
cond := newCondition(string(gwapiv1.GatewayConditionAccepted), metav1.ConditionFalse, string(reason), msg, gw.Generation)
2322
gw.Status.Conditions = MergeConditions(gw.Status.Conditions, cond)
2423
return gw
2524
}
2625

2726
func UpdateGatewayStatusAccepted(gw *gwapiv1.Gateway) *gwapiv1.Gateway {
2827
cond := newCondition(string(gwapiv1.GatewayConditionAccepted), metav1.ConditionTrue,
29-
string(gwapiv1.GatewayReasonAccepted), "The Gateway has been scheduled by Envoy Gateway", time.Now(), gw.Generation)
28+
string(gwapiv1.GatewayReasonAccepted), "The Gateway has been scheduled by Envoy Gateway", gw.Generation)
3029
gw.Status.Conditions = MergeConditions(gw.Status.Conditions, cond)
3130
return gw
3231
}
@@ -144,7 +143,6 @@ func SetGatewayListenerStatusCondition(gateway *gwapiv1.Gateway, listenerStatusI
144143
Reason: string(reason),
145144
Message: message,
146145
ObservedGeneration: gateway.Generation,
147-
LastTransitionTime: metav1.NewTime(time.Now()),
148146
}
149147
gateway.Status.Listeners[listenerStatusIdx].Conditions = MergeConditions(gateway.Status.Listeners[listenerStatusIdx].Conditions, cond)
150148
}
@@ -162,14 +160,14 @@ func updateGatewayProgrammedCondition(gw *gwapiv1.Gateway, envoyObj client.Objec
162160
if len(gw.Status.Addresses) == 0 {
163161
gw.Status.Conditions = MergeConditions(gw.Status.Conditions,
164162
newCondition(string(gwapiv1.GatewayConditionProgrammed), metav1.ConditionFalse, string(gwapiv1.GatewayReasonAddressNotAssigned),
165-
messageAddressNotAssigned, time.Now(), gw.Generation))
163+
messageAddressNotAssigned, gw.Generation))
166164
return
167165
}
168166

169167
if len(gw.Status.Addresses) > 16 {
170168
gw.Status.Conditions = MergeConditions(gw.Status.Conditions,
171169
newCondition(string(gwapiv1.GatewayConditionProgrammed), metav1.ConditionFalse, string(gwapiv1.GatewayReasonInvalid),
172-
fmt.Sprintf(messageFmtTooManyAddresses, len(gw.Status.Addresses)), time.Now(), gw.Generation))
170+
fmt.Sprintf(messageFmtTooManyAddresses, len(gw.Status.Addresses)), gw.Generation))
173171

174172
// Truncate the addresses to 16
175173
// so that the status can be updated successfully.
@@ -183,14 +181,14 @@ func updateGatewayProgrammedCondition(gw *gwapiv1.Gateway, envoyObj client.Objec
183181
if obj != nil && obj.Status.AvailableReplicas > 0 {
184182
gw.Status.Conditions = MergeConditions(gw.Status.Conditions,
185183
newCondition(string(gwapiv1.GatewayConditionProgrammed), metav1.ConditionTrue, string(gwapiv1.GatewayConditionProgrammed),
186-
fmt.Sprintf(messageFmtProgrammed, obj.Status.AvailableReplicas, obj.Status.Replicas), time.Now(), gw.Generation))
184+
fmt.Sprintf(messageFmtProgrammed, obj.Status.AvailableReplicas, obj.Status.Replicas), gw.Generation))
187185
return
188186
}
189187
case *appsv1.DaemonSet:
190188
if obj != nil && obj.Status.NumberAvailable > 0 {
191189
gw.Status.Conditions = MergeConditions(gw.Status.Conditions,
192190
newCondition(string(gwapiv1.GatewayConditionProgrammed), metav1.ConditionTrue, string(gwapiv1.GatewayConditionProgrammed),
193-
fmt.Sprintf(messageFmtProgrammed, obj.Status.NumberAvailable, obj.Status.CurrentNumberScheduled), time.Now(), gw.Generation))
191+
fmt.Sprintf(messageFmtProgrammed, obj.Status.NumberAvailable, obj.Status.CurrentNumberScheduled), gw.Generation))
194192
return
195193
}
196194
}
@@ -199,7 +197,7 @@ func updateGatewayProgrammedCondition(gw *gwapiv1.Gateway, envoyObj client.Objec
199197
// Envoy DaemonSet, don't mark the Gateway as ready yet.
200198
gw.Status.Conditions = MergeConditions(gw.Status.Conditions,
201199
newCondition(string(gwapiv1.GatewayConditionProgrammed), metav1.ConditionFalse, string(gwapiv1.GatewayReasonNoResources),
202-
messageNoResources, time.Now(), gw.Generation))
200+
messageNoResources, gw.Generation))
203201
}
204202

205203
// GetGatewayListenerStatusConditions returns the status conditions for a specific listener in the gateway status.

internal/gatewayapi/status/gatewayclass.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
package status
1515

1616
import (
17-
"time"
18-
1917
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2018
"k8s.io/apimachinery/pkg/util/sets"
2119
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
@@ -57,7 +55,6 @@ func computeGatewayClassAcceptedCondition(gatewayClass *gwapiv1.GatewayClass,
5755
Reason: reason,
5856
Message: msg,
5957
ObservedGeneration: gatewayClass.Generation,
60-
LastTransitionTime: metav1.NewTime(time.Now()),
6158
}
6259
default:
6360
return metav1.Condition{
@@ -66,7 +63,6 @@ func computeGatewayClassAcceptedCondition(gatewayClass *gwapiv1.GatewayClass,
6663
Reason: reason,
6764
Message: msg,
6865
ObservedGeneration: gatewayClass.Generation,
69-
LastTransitionTime: metav1.NewTime(time.Now()),
7066
}
7167
}
7268
}

internal/gatewayapi/status/policy.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package status
77

88
import (
99
"sort"
10-
"time"
1110

1211
"k8s.io/apimachinery/pkg/api/meta"
1312
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -104,14 +103,14 @@ func SetConditionForPolicyAncestor(policyStatus *gwapiv1.PolicyStatus, ancestorR
104103
}
105104

106105
// Only create condition and merge if needed
107-
cond := newCondition(string(conditionType), status, string(reason), sanitizedMessage, time.Now(), generation)
106+
cond := newCondition(string(conditionType), status, string(reason), sanitizedMessage, generation)
108107
policyStatus.Ancestors[i].Conditions = MergeConditions(policyStatus.Ancestors[i].Conditions, cond)
109108
return
110109
}
111110
}
112111

113112
// Add condition for new PolicyAncestorStatus
114-
cond := newCondition(string(conditionType), status, string(reason), sanitizedMessage, time.Now(), generation)
113+
cond := newCondition(string(conditionType), status, string(reason), sanitizedMessage, generation)
115114
policyStatus.Ancestors = append(policyStatus.Ancestors, gwapiv1.PolicyAncestorStatus{
116115
AncestorRef: *ancestorRef,
117116
ControllerName: gwapiv1a2.GatewayController(controllerName),

internal/gatewayapi/status/route.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
package status
77

88
import (
9-
"time"
10-
119
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1210
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
1311
)
@@ -21,7 +19,6 @@ func SetRouteStatusCondition(route *gwapiv1.RouteStatus, routeParentStatusIdx in
2119
Reason: string(reason),
2220
Message: message,
2321
ObservedGeneration: routeGeneration,
24-
LastTransitionTime: metav1.NewTime(time.Now()),
2522
}
2623

2724
route.Parents[routeParentStatusIdx].Conditions = MergeConditions(route.Parents[routeParentStatusIdx].Conditions, cond)

0 commit comments

Comments
 (0)