Skip to content

Commit b1a00bc

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

File tree

10 files changed

+453
-69
lines changed

10 files changed

+453
-69
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: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
package status
1515

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

2019
"github.com/google/go-cmp/cmp"
@@ -42,7 +41,6 @@ func MergeConditions(conditions []metav1.Condition, updates ...metav1.Condition)
4241
conditions[j].Reason = updates[i].Reason
4342
conditions[j].Message = updates[i].Message
4443
conditions[j].ObservedGeneration = updates[i].ObservedGeneration
45-
conditions[j].LastTransitionTime = updates[i].LastTransitionTime
4644
break
4745
}
4846
}
@@ -55,13 +53,12 @@ func MergeConditions(conditions []metav1.Condition, updates ...metav1.Condition)
5553
return conditions
5654
}
5755

58-
func newCondition(t string, status metav1.ConditionStatus, reason, msg string, lt time.Time, og int64) metav1.Condition {
56+
func newCondition(t string, status metav1.ConditionStatus, reason, msg string, og int64) metav1.Condition {
5957
return metav1.Condition{
6058
Type: t,
6159
Status: status,
6260
Reason: reason,
6361
Message: truncateConditionMessage(msg),
64-
LastTransitionTime: metav1.NewTime(lt),
6562
ObservedGeneration: og,
6663
}
6764
}

internal/gatewayapi/status/conditions_test.go

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

2221
"github.com/stretchr/testify/assert"
2322
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24-
utilclock "k8s.io/utils/clock"
25-
fakeclock "k8s.io/utils/clock/testing"
2623
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
2724
)
2825

29-
var clock utilclock.Clock = utilclock.RealClock{}
30-
3126
func TestConditionChanged(t *testing.T) {
3227
testCases := []struct {
3328
name string
@@ -95,17 +90,6 @@ func TestConditionChanged(t *testing.T) {
9590
}
9691

9792
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-
10993
gen := int64(1)
11094

11195
testCases := []struct {
@@ -117,69 +101,65 @@ func TestMergeConditions(t *testing.T) {
117101
{
118102
name: "status updated",
119103
current: []metav1.Condition{
120-
newCondition("available", "false", "Reason", "Message", start, gen),
104+
newCondition("available", "false", "Reason", "Message", gen),
121105
},
122106
updates: []metav1.Condition{
123-
newCondition("available", "true", "Reason", "Message", middle, gen),
107+
newCondition("available", "true", "Reason", "Message", gen),
124108
},
125109
expected: []metav1.Condition{
126-
newCondition("available", "true", "Reason", "Message", middle, gen),
110+
newCondition("available", "true", "Reason", "Message", gen),
127111
},
128112
},
129113
{
130114
name: "reason updated",
131115
current: []metav1.Condition{
132-
newCondition("available", "false", "Reason", "Message", start, gen),
116+
newCondition("available", "false", "Reason", "Message", gen),
133117
},
134118
updates: []metav1.Condition{
135-
newCondition("available", "false", "New Reason", "Message", middle, gen),
119+
newCondition("available", "false", "New Reason", "Message", gen),
136120
},
137121
expected: []metav1.Condition{
138-
newCondition("available", "false", "New Reason", "Message", middle, gen),
122+
newCondition("available", "false", "New Reason", "Message", gen),
139123
},
140124
},
141125
{
142126
name: "message updated",
143127
current: []metav1.Condition{
144-
newCondition("available", "false", "Reason", "Message", start, gen),
128+
newCondition("available", "false", "Reason", "Message", gen),
145129
},
146130
updates: []metav1.Condition{
147-
newCondition("available", "false", "Reason", "New Message", middle, gen),
131+
newCondition("available", "false", "Reason", "New Message", gen),
148132
},
149133
expected: []metav1.Condition{
150-
newCondition("available", "false", "Reason", "New Message", middle, gen),
134+
newCondition("available", "false", "Reason", "New Message", gen),
151135
},
152136
},
153137
{
154138
name: "observed generation updated",
155139
current: []metav1.Condition{
156-
newCondition("available", "false", "Reason", "Message", start, gen),
140+
newCondition("available", "false", "Reason", "Message", gen),
157141
},
158142
updates: []metav1.Condition{
159-
newCondition("available", "false", "Reason", "Message", middle, gen+1),
143+
newCondition("available", "false", "Reason", "Message", gen+1),
160144
},
161145
expected: []metav1.Condition{
162-
newCondition("available", "false", "Reason", "Message", middle, gen+1),
146+
newCondition("available", "false", "Reason", "Message", gen+1),
163147
},
164148
},
165149
{
166150
name: "status unchanged",
167151
current: []metav1.Condition{
168-
newCondition("available", "false", "Reason", "Message", start, gen),
152+
newCondition("available", "false", "Reason", "Message", gen),
169153
},
170154
updates: []metav1.Condition{
171-
newCondition("available", "false", "Reason", "Message", middle, gen),
155+
newCondition("available", "false", "Reason", "Message", gen),
172156
},
173157
expected: []metav1.Condition{
174-
newCondition("available", "false", "Reason", "Message", start, gen),
158+
newCondition("available", "false", "Reason", "Message", gen),
175159
},
176160
},
177161
}
178162

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

189169
func TestMergeConditionsTruncatesMessages(t *testing.T) {
190170
longMsg := strings.Repeat("x", conditionMessageMaxLength+5)
191-
cond := newCondition("available", metav1.ConditionTrue, "Reason", longMsg, time.Now(), 1)
171+
cond := newCondition("available", metav1.ConditionTrue, "Reason", longMsg, 1)
192172
conditions := MergeConditions(nil, cond)
193173

194174
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)