Repository: knative/serving
Pull request #8213 (2020-06-05 09:35:02)

Add some extra comments to bucketing code
<!--
Request Prow to automatically lint any go code in this PR:

/lint
-->

Was reading through the bucketing code to understand the scaling behaviour, kept some comments as I went that might be be helpful to future readers.

/assign @vagababov @markusthoemmes - I _think_ this is all correct, please check! :)

knative-prow-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/knative/serving/pull/8213#" title="Author self-approved">julz</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **mdemirhan**
You can assign the PR to them by writing `/assign @mdemirhan` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=knative%2Fserving).

<details open>
Needs approval from an approver in each of these files:

- **[pkg/autoscaler/OWNERS](https://github.com/knative/serving/blob/master/pkg/autoscaler/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["mdemirhan"]} -->

Patch:
diff --git a/config/core/configmaps/autoscaler.yaml b/config/core/configmaps/autoscaler.yaml
index 93730f9b3..5e1b8f8e8 100644
--- a/config/core/configmaps/autoscaler.yaml
+++ b/config/core/configmaps/autoscaler.yaml
@@ -20,6 +20,8 @@ metadata:
   labels:
     serving.knative.dev/release: devel
     knative.dev/example-checksum: "b2d0685a"
+  annotations:
+    knative.dev/example-checksum: b2d0685a
 data:
   _example: |
     ################################
diff --git a/config/core/configmaps/defaults.yaml b/config/core/configmaps/defaults.yaml
index 65498adf1..013f05be1 100644
--- a/config/core/configmaps/defaults.yaml
+++ b/config/core/configmaps/defaults.yaml
@@ -20,6 +20,8 @@ metadata:
   labels:
     serving.knative.dev/release: devel
     knative.dev/example-checksum: "7610427c"
+  annotations:
+    knative.dev/example-checksum: 7610427c
 data:
   _example: |
     ################################
diff --git a/config/core/configmaps/deployment.yaml b/config/core/configmaps/deployment.yaml
index 95454a506..57cda9719 100644
--- a/config/core/configmaps/deployment.yaml
+++ b/config/core/configmaps/deployment.yaml
@@ -20,6 +20,8 @@ metadata:
   labels:
     serving.knative.dev/release: devel
     knative.dev/example-checksum: "cf88a4cf"
+  annotations:
+    knative.dev/example-checksum: cf88a4cf
 data:
   # This is the Go import path for the binary that is containerized
   # and substituted here.
diff --git a/config/core/configmaps/domain.yaml b/config/core/configmaps/domain.yaml
index 1c4898de1..3ed72fb54 100644
--- a/config/core/configmaps/domain.yaml
+++ b/config/core/configmaps/domain.yaml
@@ -20,6 +20,8 @@ metadata:
   labels:
     serving.knative.dev/release: devel
     knative.dev/example-checksum: "327d2082"
+  annotations:
+    knative.dev/example-checksum: 327d2082
 data:
   _example: |
     ################################
diff --git a/config/core/configmaps/features.yaml b/config/core/configmaps/features.yaml
index 010236e82..96247dbe6 100644
--- a/config/core/configmaps/features.yaml
+++ b/config/core/configmaps/features.yaml
@@ -20,6 +20,8 @@ metadata:
   labels:
     serving.knative.dev/release: devel
     knative.dev/example-checksum: "303e565f"
+  annotations:
+    knative.dev/example-checksum: 303e565f
 data:
   _example: |
     ################################
diff --git a/config/core/configmaps/gc.yaml b/config/core/configmaps/gc.yaml
index bba83da51..8fbc70850 100644
--- a/config/core/configmaps/gc.yaml
+++ b/config/core/configmaps/gc.yaml
@@ -20,6 +20,8 @@ metadata:
   labels:
     serving.knative.dev/release: devel
     knative.dev/example-checksum: "7a8e5402"
+  annotations:
+    knative.dev/example-checksum: 7a8e5402
 data:
   _example: |
     ################################
diff --git a/config/core/configmaps/leader-election.yaml b/config/core/configmaps/leader-election.yaml
index 7fc2a1a6d..006f4ef87 100644
--- a/config/core/configmaps/leader-election.yaml
+++ b/config/core/configmaps/leader-election.yaml
@@ -20,6 +20,8 @@ metadata:
   labels:
     serving.knative.dev/release: devel
     knative.dev/example-checksum: "82c28949"
+  annotations:
+    knative.dev/example-checksum: 82c28949
 data:
   _example: |
     ################################
diff --git a/config/core/configmaps/logging.yaml b/config/core/configmaps/logging.yaml
index b1bc952d9..b00c2d477 100644
--- a/config/core/configmaps/logging.yaml
+++ b/config/core/configmaps/logging.yaml
@@ -20,6 +20,8 @@ metadata:
   labels:
     serving.knative.dev/release: devel
     knative.dev/example-checksum: "3199de9f"
+  annotations:
+    knative.dev/example-checksum: 3199de9f
 data:
   _example: |
     ################################
diff --git a/config/core/configmaps/network.yaml b/config/core/configmaps/network.yaml
index 690527e66..60ca78bc4 100644
--- a/config/core/configmaps/network.yaml
+++ b/config/core/configmaps/network.yaml
@@ -20,6 +20,8 @@ metadata:
   labels:
     serving.knative.dev/release: devel
     knative.dev/example-checksum: "8b4ff3d6"
+  annotations:
+    knative.dev/example-checksum: 8b4ff3d6
 data:
   _example: |
     ################################
diff --git a/config/core/configmaps/observability.yaml b/config/core/configmaps/observability.yaml
index 7a3dece85..7ed95081b 100644
--- a/config/core/configmaps/observability.yaml
+++ b/config/core/configmaps/observability.yaml
@@ -20,6 +20,8 @@ metadata:
   labels:
     serving.knative.dev/release: devel
     knative.dev/example-checksum: "26889b7b"
+  annotations:
+    knative.dev/example-checksum: 26889b7b
 data:
   _example: |
     ################################
diff --git a/config/core/configmaps/tracing.yaml b/config/core/configmaps/tracing.yaml
index 330d5af33..3b7432cf9 100644
--- a/config/core/configmaps/tracing.yaml
+++ b/config/core/configmaps/tracing.yaml
@@ -20,6 +20,8 @@ metadata:
   labels:
     serving.knative.dev/release: devel
     knative.dev/example-checksum: "e359bd08"
+  annotations:
+    knative.dev/example-checksum: e359bd08
 data:
   _example: |
     ################################
diff --git a/go.mod b/go.mod
index 69d59c85e..c3a2ef594 100644
--- a/go.mod
+++ b/go.mod
@@ -42,9 +42,9 @@ require (
 	k8s.io/code-generator v0.18.0
 	k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29
 	k8s.io/metrics v0.17.6
-	knative.dev/caching v0.0.0-20200521155757-e78d17bc250e
-	knative.dev/pkg v0.0.0-20200603222317-b79e4a24ca50
-	knative.dev/test-infra v0.0.0-20200604135317-9be2b638d932
+	knative.dev/caching v0.0.0-20200604203019-a5bd4f5d0e4f
+	knative.dev/pkg v0.0.0-20200605112617-7b4093b435c0
+	knative.dev/test-infra v0.0.0-20200605033518-4b5d9e1bbdbe
 )
 
 // pin the older grpc - see: https://github.com/grpc/grpc-go/issues/3180
diff --git a/go.sum b/go.sum
index 4545916e9..1d683aa53 100644
--- a/go.sum
+++ b/go.sum
@@ -1308,8 +1308,8 @@ k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl
 k8s.io/utils v0.0.0-20200124190032-861946025e34 h1:HjlUD6M0K3P8nRXmr2B9o4F9dUy9TCj/aEpReeyi6+k=
 k8s.io/utils v0.0.0-20200124190032-861946025e34/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
 knative.dev/caching v0.0.0-20190719140829-2032732871ff/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg=
-knative.dev/caching v0.0.0-20200521155757-e78d17bc250e h1:LN2scNClE8G4a9XzM0AGZkK/rT56A0ZlweaMjNzPMD0=
-knative.dev/caching v0.0.0-20200521155757-e78d17bc250e/go.mod h1:bsKPIG2XZFYL8uw5BAxg7EMBLp0vNpu9jZIGus8HUPU=
+knative.dev/caching v0.0.0-20200604203019-a5bd4f5d0e4f h1:aYxtvdMcdub6gZVCvsE+1xJRl7kX0yruvPfD8oe7OYQ=
+knative.dev/caching v0.0.0-20200604203019-a5bd4f5d0e4f/go.mod h1:7ViMPljYdI1vRAv9Yptyw76i8LF3IHBGGHX27ObT+Qk=
 knative.dev/eventing-contrib v0.6.1-0.20190723221543-5ce18048c08b/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g=
 knative.dev/pkg v0.0.0-20191101194912-56c2594e4f11/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
 knative.dev/pkg v0.0.0-20191111150521-6d806b998379/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
@@ -1320,10 +1320,10 @@ knative.dev/pkg v0.0.0-20200515002500-16d7b963416f/go.mod h1:tMOHGbxtRz8zYFGEGpV
 knative.dev/pkg v0.0.0-20200519155757-14eb3ae3a5a7 h1:9S2r59HZJF9nKvoRLg5zJzx6XpVlVyvVRqz/C/h6h2s=
 knative.dev/pkg v0.0.0-20200519155757-14eb3ae3a5a7/go.mod h1:QgNZTxnwpB/oSpNcfnLVlw+WpEwwyKAvJlvR3hgeltA=
 knative.dev/pkg v0.0.0-20200520073958-94316e20e860/go.mod h1:QgNZTxnwpB/oSpNcfnLVlw+WpEwwyKAvJlvR3hgeltA=
-knative.dev/pkg v0.0.0-20200603004717-9d862737e5c1 h1:RdPH0bgm61DQ/azXkQq04pwFnaHH9xSL5yJ9+X2nuiQ=
-knative.dev/pkg v0.0.0-20200603004717-9d862737e5c1/go.mod h1:8IfPj/lpuKHHg82xZCl2wuFZ3BM96To72sN1W8T9wjQ=
 knative.dev/pkg v0.0.0-20200603222317-b79e4a24ca50 h1:sbJMCCtOENPgfE5dUSwBUxZtJzhfqORhExyWFX7L0Fk=
 knative.dev/pkg v0.0.0-20200603222317-b79e4a24ca50/go.mod h1:8IfPj/lpuKHHg82xZCl2wuFZ3BM96To72sN1W8T9wjQ=
+knative.dev/pkg v0.0.0-20200605112617-7b4093b435c0 h1:DV9r7l21aS/KdO+fcAlkvQr5Clct6WM2VQ3Q8tdRm2g=
+knative.dev/pkg v0.0.0-20200605112617-7b4093b435c0/go.mod h1:8IfPj/lpuKHHg82xZCl2wuFZ3BM96To72sN1W8T9wjQ=
 knative.dev/test-infra v0.0.0-20200407185800-1b88cb3b45a5/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ=
 knative.dev/test-infra v0.0.0-20200505052144-5ea2f705bb55/go.mod h1:WqF1Azka+FxPZ20keR2zCNtiQA1MP9ZB4BH4HuI+SIU=
 knative.dev/test-infra v0.0.0-20200513011557-d03429a76034 h1:JxqONCZVS7or+Fv3ebVQoipuIBH7Ig3Qbx170hgIF+A=
@@ -1334,8 +1334,8 @@ knative.dev/test-infra v0.0.0-20200519161858-554a95a37986 h1:ZDy43jkWPQ75d4l4DGy
 knative.dev/test-infra v0.0.0-20200519161858-554a95a37986/go.mod h1:LeNa1Wvn47efeQUkpkn3XG7Fx9Ga+rhAP13SZyjaEGg=
 knative.dev/test-infra v0.0.0-20200522180958-6a0a9b9d893a h1:c0qTABRcNoxZVu5gsryLWPZtGa/s4zsvovz0nGefuzg=
 knative.dev/test-infra v0.0.0-20200522180958-6a0a9b9d893a/go.mod h1:n9eQkzmSNj8BiqNFl1lzoz68D09uMeJfyOjc132Gbik=
-knative.dev/test-infra v0.0.0-20200604135317-9be2b638d932 h1:7ec3js+msarJKT/GNo9w0S8YOnFUJqaCjvBxrNbzfns=
-knative.dev/test-infra v0.0.0-20200604135317-9be2b638d932/go.mod h1:Iyv1UFMGA1K/qRXYLQPwx1Rm/UIFo0RcaKAjGKdSe8c=
+knative.dev/test-infra v0.0.0-20200605033518-4b5d9e1bbdbe h1:8jvsC2cS3Xc/KOPnCOJSpxtQqgx8ZoDPEgaoRrNq8Uk=
+knative.dev/test-infra v0.0.0-20200605033518-4b5d9e1bbdbe/go.mod h1:wsGme3loBZjSjhuaTUhejJ34EOwKZ5KXkweKL0zSKhM=
 modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
 modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
 modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
diff --git a/pkg/autoscaler/aggregation/bucketing.go b/pkg/autoscaler/aggregation/bucketing.go
index 8112225cc..7fd4cb88f 100644
--- a/pkg/autoscaler/aggregation/bucketing.go
+++ b/pkg/autoscaler/aggregation/bucketing.go
@@ -27,19 +27,33 @@ import (
 // TimedFloat64Buckets keeps buckets that have been collected at a certain time.
 type TimedFloat64Buckets struct {
 	bucketsMutex sync.RWMutex
-	buckets      []float64
-	// The total sum of all valid buckets within the window.
-	windowTotal float64
-	lastWrite   time.Time
+	// buckets is a ring buffer indexed by timeToIndex() % len(buckets).
+	// Each element represents a certain granularity of time, and the total
+	// represented duration adds up to a window length of time.
+	buckets []float64
+
 	// firstWrite holds the time when the first write has been made.
-	// this time is reset to `now` when the very first write happens,
+	// This time is reset to `now` when the very first write happens,
 	// or when a first write happens after `window` time of inactivity.
 	// The difference between `now` and `firstWrite` is used to compute
 	// the number of eligible buckets for computation of average values.
 	firstWrite time.Time
 
+	// lastWrite stores the time when the last write was made.
+	// This is used to detect when we have gaps in the data (i.e. more than a
+	// granularity has expired since the last write) so that we can zero those
+	// entries in the buckets array. It is also used when calculating the
+	// WindowAverage to know how much of the buckets array represents valid data.
+	lastWrite time.Time
+
+	// granularity is the duration represented by each bucket in the buckets ring buffer.
 	granularity time.Duration
-	window      time.Duration
+	// window is the total time represented by the buckets ring buffer.
+	window time.Duration
+	// The total sum of all buckets within the window. This total includes
+	// invalid buckets, e.g. buckets written to before firstTime or after
+	// lastTime are included in this total.
+	windowTotal float64
 }
 
 // Implements stringer interface.
@@ -60,7 +74,7 @@ func NewTimedFloat64Buckets(window, granularity time.Duration) *TimedFloat64Buck
 	}
 }
 
-// IsEmpty returns if no data has been recorded for the `window` period.
+// IsEmpty returns true if no data has been recorded for the `window` period.
 func (t *TimedFloat64Buckets) IsEmpty(now time.Time) bool {
 	now = now.Truncate(t.granularity)
 	t.bucketsMutex.RLock()
@@ -74,6 +88,21 @@ func roundToNDigits(n int, f float64) float64 {
 }
 
 // WindowAverage returns the average bucket value over the window.
+//
+// If the first write was less than the window length ago, an average is
+// returned over the partial window. For example, if firstWrite was 6 seconds
+// ago, the average will be over these 6 seconds worth of buckets, even if the
+// window is 60s. If a window passes with no data being received, the first
+// write time is reset so this behaviour takes effect again.
+//
+// Similarly, if we have not received recent data, the average is based on a
+// partial window. For example, if the window is 60 seconds but we last
+// received data 10 seconds ago, the window average will be the average over
+// the first 50 seconds.
+//
+// In other cases, for example if there are gaps in the data shorter than the
+// window length, the missing data is assumed to be 0 and the average is over
+// the whole window length inclusive of the missing data.
 func (t *TimedFloat64Buckets) WindowAverage(now time.Time) float64 {
 	const precision = 6
 	now = now.Truncate(t.granularity)
@@ -118,6 +147,11 @@ func (t *TimedFloat64Buckets) timeToIndex(tm time.Time) int {
 }
 
 // Record adds a value with an associated time to the correct bucket.
+// If this record would introduce a gap in the data, any intervening times
+// between the last write and this one will be recorded as zero. If an entire
+// window length has expired without data, the firstWrite time is reset,
+// meaning the WindowAverage will be of a partial window until enough data is
+// received to fill it again.
 func (t *TimedFloat64Buckets) Record(now time.Time, value float64) {
 	bucketTime := now.Truncate(t.granularity)
 
diff --git a/third_party/cert-manager-0.12.0/net-certmanager.yaml b/third_party/cert-manager-0.12.0/net-certmanager.yaml
index 711e7d957..61f2f579d 100644
--- a/third_party/cert-manager-0.12.0/net-certmanager.yaml
+++ b/third_party/cert-manager-0.12.0/net-certmanager.yaml
@@ -18,7 +18,7 @@ metadata:
   # These are the permissions needed by the `cert-manager` `Certificate` implementation.
   name: knative-serving-certmanager
   labels:
-    serving.knative.dev/release: "v20200604-b68ba3b"
+    serving.knative.dev/release: "v20200605-b68ba3b"
     serving.knative.dev/controller: "true"
     networking.knative.dev/certificate-provider: cert-manager
 rules:
@@ -49,7 +49,7 @@ kind: ValidatingWebhookConfiguration
 metadata:
   name: config.webhook.net-certmanager.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20200604-b68ba3b"
+    serving.knative.dev/release: "v20200605-b68ba3b"
 webhooks:
 - admissionReviewVersions:
   - v1beta1
@@ -86,7 +86,7 @@ metadata:
   name: net-certmanager-webhook-certs
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200604-b68ba3b"
+    serving.knative.dev/release: "v20200605-b68ba3b"
 
 ---
 # Copyright 2020 The Knative Authors
@@ -109,7 +109,7 @@ metadata:
   name: config-certmanager
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200604-b68ba3b"
+    serving.knative.dev/release: "v20200605-b68ba3b"
     networking.knative.dev/certificate-provider: cert-manager
 data:
   _example: |
@@ -156,7 +156,7 @@ metadata:
   name: networking-certmanager
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200604-b68ba3b"
+    serving.knative.dev/release: "v20200605-b68ba3b"
     networking.knative.dev/certificate-provider: cert-manager
 spec:
   selector:
@@ -168,7 +168,7 @@ spec:
         cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
       labels:
         app: networking-certmanager
-        serving.knative.dev/release: "v20200604-b68ba3b"
+        serving.knative.dev/release: "v20200605-b68ba3b"
     spec:
       serviceAccountName: controller
       containers:
@@ -208,7 +208,7 @@ kind: Service
 metadata:
   labels:
     app: networking-certmanager
-    serving.knative.dev/release: "v20200604-b68ba3b"
+    serving.knative.dev/release: "v20200605-b68ba3b"
     networking.knative.dev/certificate-provider: cert-manager
   name: networking-certmanager
   namespace: knative-serving
@@ -245,7 +245,7 @@ metadata:
   name: net-certmanager-webhook
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20200604-b68ba3b"
+    serving.knative.dev/release: "v20200605-b68ba3b"
 spec:
   selector:
     matchLabels:
@@ -258,7 +258,7 @@ spec:
       labels:
         app: net-certmanager-webhook
         role: net-certmanager-webhook
-        serving.knative.dev/release: "v20200604-b68ba3b"
+        serving.knative.dev/release: "v20200605-b68ba3b"
     spec:
       serviceAccountName: controller
       containers:
@@ -319,7 +319,7 @@ metadata:
   namespace: knative-serving
   labels:
     role: net-certmanager-webhook
-    serving.knative.dev/release: "v20200604-b68ba3b"
+    serving.knative.dev/release: "v20200605-b68ba3b"
 spec:
   ports:
   - # Define metrics and profiling for them to be accessible within service meshes.
diff --git a/vendor/knative.dev/pkg/configmap/example.go b/vendor/knative.dev/pkg/configmap/example.go
index 2ffe448e5..78f8e4a57 100644
--- a/vendor/knative.dev/pkg/configmap/example.go
+++ b/vendor/knative.dev/pkg/configmap/example.go
@@ -25,11 +25,11 @@ const (
 	// ExampleKey signifies a given example configuration in a ConfigMap.
 	ExampleKey = "_example"
 
-	// ExampleChecksumLabel is the label that stores the computed checksum.
-	ExampleChecksumLabel = "knative.dev/example-checksum"
+	// ExampleChecksumAnnotation is the annotation that stores the computed checksum.
+	ExampleChecksumAnnotation = "knative.dev/example-checksum"
 )
 
-// Checksum generates a checksum for the example value to be compared against a respective label.
+// Checksum generates a checksum for the example value to be compared against a respective annotation.
 func Checksum(value string) string {
 	return fmt.Sprintf("%08x", crc32.ChecksumIEEE([]byte(value)))
 }
diff --git a/vendor/knative.dev/pkg/configmap/hash-gen/main.go b/vendor/knative.dev/pkg/configmap/hash-gen/main.go
index c6e5110e3..7bafc5a56 100644
--- a/vendor/knative.dev/pkg/configmap/hash-gen/main.go
+++ b/vendor/knative.dev/pkg/configmap/hash-gen/main.go
@@ -68,19 +68,24 @@ func process(data []byte) ([]byte, error) {
 		return nil, nil
 	}
 
-	labels := traverse(content, "metadata", "labels")
-	if labels == nil {
-		// TODO(markusthoemmes): Potentially handle missing metadata and labels?
-		return nil, errors.New("'metadata.labels' not found")
+	metadata := traverse(content, "metadata")
+	if metadata == nil {
+		return nil, errors.New("'metadata' not found")
+	}
+
+	annotations := traverse(metadata, "annotations")
+	if annotations == nil {
+		annotations = &yaml.Node{Kind: yaml.MappingNode}
+		metadata.Content = append(metadata.Content, strNode("annotations"), annotations)
 	}
 
 	checksum := configmap.Checksum(example.Value)
-	existingLabel := value(labels, configmap.ExampleChecksumLabel)
-	if existingLabel != nil {
-		existingLabel.Value = checksum
+	existingAnnotation := value(annotations, configmap.ExampleChecksumAnnotation)
+	if existingAnnotation != nil {
+		existingAnnotation.Value = checksum
 	} else {
-		labels.Content = append(labels.Content,
-			strNode(configmap.ExampleChecksumLabel),
+		annotations.Content = append(annotations.Content,
+			strNode(configmap.ExampleChecksumAnnotation),
 			strNode(checksum))
 	}
 
diff --git a/vendor/knative.dev/pkg/webhook/configmaps/configmaps.go b/vendor/knative.dev/pkg/webhook/configmaps/configmaps.go
index f6ffb81b7..acac11525 100644
--- a/vendor/knative.dev/pkg/webhook/configmaps/configmaps.go
+++ b/vendor/knative.dev/pkg/webhook/configmaps/configmaps.go
@@ -185,8 +185,8 @@ func (ac *reconciler) validate(ctx context.Context, req *admissionv1beta1.Admiss
 	}
 
 	exampleData, hasExampleData := newObj.Data[configmap.ExampleKey]
-	exampleChecksum, hasExampleChecksumLabel := newObj.Labels[configmap.ExampleChecksumLabel]
-	if hasExampleData && hasExampleChecksumLabel &&
+	exampleChecksum, hasExampleChecksumAnnotation := newObj.Annotations[configmap.ExampleChecksumAnnotation]
+	if hasExampleData && hasExampleChecksumAnnotation &&
 		exampleChecksum != configmap.Checksum(exampleData) {
 		return fmt.Errorf(
 			"%q modified, you likely wanted to create an unindented configuration",
diff --git a/vendor/modules.txt b/vendor/modules.txt
index a8e140628..658c901d9 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1178,7 +1178,7 @@ k8s.io/utils/net
 k8s.io/utils/path
 k8s.io/utils/pointer
 k8s.io/utils/trace
-# knative.dev/caching v0.0.0-20200521155757-e78d17bc250e
+# knative.dev/caching v0.0.0-20200604203019-a5bd4f5d0e4f
 ## explicit
 knative.dev/caching/config
 knative.dev/caching/pkg/apis/caching
@@ -1199,7 +1199,7 @@ knative.dev/caching/pkg/client/injection/informers/caching/v1alpha1/image/fake
 knative.dev/caching/pkg/client/injection/informers/factory
 knative.dev/caching/pkg/client/injection/informers/factory/fake
 knative.dev/caching/pkg/client/listers/caching/v1alpha1
-# knative.dev/pkg v0.0.0-20200603222317-b79e4a24ca50
+# knative.dev/pkg v0.0.0-20200605112617-7b4093b435c0
 ## explicit
 knative.dev/pkg/apiextensions/storageversion
 knative.dev/pkg/apiextensions/storageversion/cmd/migrate
@@ -1316,7 +1316,7 @@ knative.dev/pkg/webhook/resourcesemantics/conversion
 knative.dev/pkg/webhook/resourcesemantics/defaulting
 knative.dev/pkg/webhook/resourcesemantics/validation
 knative.dev/pkg/websocket
-# knative.dev/test-infra v0.0.0-20200604135317-9be2b638d932
+# knative.dev/test-infra v0.0.0-20200605033518-4b5d9e1bbdbe
 ## explicit
 knative.dev/test-infra/scripts
 # sigs.k8s.io/structured-merge-diff/v2 v2.0.1


Test patch:
diff --git a/test/conformance/api/v1/revision_timeout_test.go b/test/conformance/api/v1/revision_timeout_test.go
index 0c8a7a2eb..3e0feb1e3 100644
--- a/test/conformance/api/v1/revision_timeout_test.go
+++ b/test/conformance/api/v1/revision_timeout_test.go
@@ -75,7 +75,7 @@ func sendRequest(t *testing.T, clients *test.Clients, endpoint *url.URL,
 
 	t.Logf("Response status code: %v, expected: %v", resp.StatusCode, expectedResponseCode)
 	if expectedResponseCode != resp.StatusCode {
-		return fmt.Errorf("response status code = %v, want: %v", resp.StatusCode, expectedResponseCode)
+		return fmt.Errorf("response status code = %v, want = %v, response = %v", resp.StatusCode, expectedResponseCode, resp)
 	}
 	return nil
 }
@@ -94,13 +94,13 @@ func TestRevisionTimeout(t *testing.T) {
 	}{{
 		name:           "when scaling up from 0 and does not exceed timeout seconds",
 		shouldScaleTo0: true,
-		timeoutSeconds: 10,
+		timeoutSeconds: 20,
 		expectedStatus: http.StatusOK,
 	}, {
 		name:           "when scaling up from 0 and it writes first byte before timeout",
 		shouldScaleTo0: true,
-		timeoutSeconds: 10,
-		sleep:          15 * time.Second,
+		timeoutSeconds: 20,
+		sleep:          25 * time.Second,
 		expectedStatus: http.StatusOK,
 	}, {
 		name:           "when scaling up from 0 and it does exceed timeout seconds",
diff --git a/test/conformance/api/v1alpha1/revision_timeout_test.go b/test/conformance/api/v1alpha1/revision_timeout_test.go
index 906aa3efc..cfe2cfbf0 100644
--- a/test/conformance/api/v1alpha1/revision_timeout_test.go
+++ b/test/conformance/api/v1alpha1/revision_timeout_test.go
@@ -74,7 +74,7 @@ func sendRequest(t *testing.T, clients *test.Clients, endpoint *url.URL,
 
 	t.Logf("Response status code: %v, expected: %v", resp.StatusCode, expectedResponseCode)
 	if expectedResponseCode != resp.StatusCode {
-		return fmt.Errorf("response status code = %v, want: %v", resp.StatusCode, expectedResponseCode)
+		return fmt.Errorf("response status code = %v, want = %v, response = %v", resp.StatusCode, expectedResponseCode, resp)
 	}
 	return nil
 }
@@ -93,13 +93,13 @@ func TestRevisionTimeout(t *testing.T) {
 	}{{
 		name:           "when scaling up from 0 and does not exceed timeout seconds",
 		shouldScaleTo0: true,
-		timeoutSeconds: 10,
+		timeoutSeconds: 20,
 		expectedStatus: http.StatusOK,
 	}, {
 		name:           "when scaling up from 0 and it writes first byte before timeout",
 		shouldScaleTo0: true,
-		timeoutSeconds: 10,
-		sleep:          15 * time.Second,
+		timeoutSeconds: 20,
+		sleep:          25 * time.Second,
 		expectedStatus: http.StatusOK,
 	}, {
 		name:           "when scaling up from 0 and it does exceed timeout seconds",
diff --git a/test/conformance/api/v1beta1/revision_timeout_test.go b/test/conformance/api/v1beta1/revision_timeout_test.go
index cbffab13c..75774e6b6 100644
--- a/test/conformance/api/v1beta1/revision_timeout_test.go
+++ b/test/conformance/api/v1beta1/revision_timeout_test.go
@@ -74,7 +74,7 @@ func sendRequest(t *testing.T, clients *test.Clients, endpoint *url.URL,
 
 	t.Logf("Response status code: %v, expected: %v", resp.StatusCode, expectedResponseCode)
 	if expectedResponseCode != resp.StatusCode {
-		return fmt.Errorf("response status code = %v, want: %v", resp.StatusCode, expectedResponseCode)
+		return fmt.Errorf("response status code = %v, want = %v, response = %v", resp.StatusCode, expectedResponseCode, resp)
 	}
 	return nil
 }
@@ -93,13 +93,13 @@ func TestRevisionTimeout(t *testing.T) {
 	}{{
 		name:           "when scaling up from 0 and does not exceed timeout seconds",
 		shouldScaleTo0: true,
-		timeoutSeconds: 10,
+		timeoutSeconds: 20,
 		expectedStatus: http.StatusOK,
 	}, {
 		name:           "when scaling up from 0 and it writes first byte before timeout",
 		shouldScaleTo0: true,
-		timeoutSeconds: 10,
-		sleep:          15 * time.Second,
+		timeoutSeconds: 20,
+		sleep:          25 * time.Second,
 		expectedStatus: http.StatusOK,
 	}, {
 		name:           "when scaling up from 0 and it does exceed timeout seconds",
diff --git a/third_party/contour-latest/contour.yaml b/third_party/contour-latest/contour.yaml
index 568543603..0015e9015 100644
--- a/third_party/contour-latest/contour.yaml
+++ b/third_party/contour-latest/contour.yaml
@@ -1432,7 +1432,7 @@ spec:
         # if we change this on each version, you can no longer upgrade
         # just by applying the deployment YAML.
         # See #2423, #2395, #2150, and #2030 for earlier questions about this.
-        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:c7fc6688688e458236c03c300dec1332bfdaa3d881a32398e2c8e2bec4440777
+        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:d7608962e6f610e718df45e492f5a115c47902d0996912e338c9908caaf802a7
         imagePullPolicy: Always
         command:
         - contour
@@ -1672,7 +1672,7 @@ spec:
         - --contour-key-file=/certs/tls.key
         - --config-path=/config/contour.yaml
         command: ["contour"]
-        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:c7fc6688688e458236c03c300dec1332bfdaa3d881a32398e2c8e2bec4440777
+        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:d7608962e6f610e718df45e492f5a115c47902d0996912e338c9908caaf802a7
         imagePullPolicy: Always
         name: contour
         ports:
@@ -1764,7 +1764,7 @@ spec:
         args:
         - envoy
         - shutdown-manager
-        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:c7fc6688688e458236c03c300dec1332bfdaa3d881a32398e2c8e2bec4440777
+        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:d7608962e6f610e718df45e492f5a115c47902d0996912e338c9908caaf802a7
         imagePullPolicy: Always
         lifecycle:
           preStop:
@@ -1840,7 +1840,7 @@ spec:
         - --envoy-key-file=/certs/tls.key
         command:
         - contour
-        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:c7fc6688688e458236c03c300dec1332bfdaa3d881a32398e2c8e2bec4440777
+        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:d7608962e6f610e718df45e492f5a115c47902d0996912e338c9908caaf802a7
         imagePullPolicy: Always
         name: envoy-initconfig
         volumeMounts:
@@ -3305,7 +3305,7 @@ spec:
         # if we change this on each version, you can no longer upgrade
         # just by applying the deployment YAML.
         # See #2423, #2395, #2150, and #2030 for earlier questions about this.
-        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:c7fc6688688e458236c03c300dec1332bfdaa3d881a32398e2c8e2bec4440777
+        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:d7608962e6f610e718df45e492f5a115c47902d0996912e338c9908caaf802a7
         imagePullPolicy: Always
         command:
         - contour
@@ -3545,7 +3545,7 @@ spec:
         - --contour-key-file=/certs/tls.key
         - --config-path=/config/contour.yaml
         command: ["contour"]
-        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:c7fc6688688e458236c03c300dec1332bfdaa3d881a32398e2c8e2bec4440777
+        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:d7608962e6f610e718df45e492f5a115c47902d0996912e338c9908caaf802a7
         imagePullPolicy: Always
         name: contour
         ports:
@@ -3637,7 +3637,7 @@ spec:
         args:
         - envoy
         - shutdown-manager
-        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:c7fc6688688e458236c03c300dec1332bfdaa3d881a32398e2c8e2bec4440777
+        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:d7608962e6f610e718df45e492f5a115c47902d0996912e338c9908caaf802a7
         imagePullPolicy: Always
         lifecycle:
           preStop:
@@ -3713,7 +3713,7 @@ spec:
         - --envoy-key-file=/certs/tls.key
         command:
         - contour
-        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:c7fc6688688e458236c03c300dec1332bfdaa3d881a32398e2c8e2bec4440777
+        image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:d7608962e6f610e718df45e492f5a115c47902d0996912e338c9908caaf802a7
         imagePullPolicy: Always
         name: envoy-initconfig
         volumeMounts:
diff --git a/third_party/contour-latest/net-contour.yaml b/third_party/contour-latest/net-contour.yaml
index 45f451554..a6bb17bc4 100644
--- a/third_party/contour-latest/net-contour.yaml
+++ b/third_party/contour-latest/net-contour.yaml
@@ -35,7 +35,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: contour
-    serving.knative.dev/release: "v20200604-b4bfe323"
+    serving.knative.dev/release: "v20200605-d9d1bc5a"
 data:
   _example: |
     ################################
@@ -94,7 +94,7 @@ spec:
       - name: controller
         # This is the Go import path for the binary that is containerized
         # and substituted here.
-        image: gcr.io/knative-nightly/knative.dev/net-contour/cmd/controller@sha256:526731956804d45bb5593f4d82b0cd0fb1819540f76534a8221d61d306a28042
+        image: gcr.io/knative-nightly/knative.dev/net-contour/cmd/controller@sha256:382f2bc3683bc8caf230977e137c7bc80d27d92f25fab4eaf1a0ca5a296c036a
         resources:
           requests:
             cpu: 40m
diff --git a/vendor/knative.dev/pkg/configmap/testing/configmap.go b/vendor/knative.dev/pkg/configmap/testing/configmap.go
index 5c4a2d8c1..34ed5cd30 100644
--- a/vendor/knative.dev/pkg/configmap/testing/configmap.go
+++ b/vendor/knative.dev/pkg/configmap/testing/configmap.go
@@ -83,12 +83,12 @@ func ConfigMapsFromTestFile(t *testing.T, name string, allowed ...string) (*core
 		}
 	}
 
-	// Check that the hashed exampleBody matches the assigned label, if present.
-	gotChecksum, hasExampleChecksumLabel := orig.Labels[configmap.ExampleChecksumLabel]
-	if hasExampleBody && hasExampleChecksumLabel {
+	// Check that the hashed exampleBody matches the assigned annotation, if present.
+	gotChecksum, hasExampleChecksumAnnotation := orig.Annotations[configmap.ExampleChecksumAnnotation]
+	if hasExampleBody && hasExampleChecksumAnnotation {
 		wantChecksum := configmap.Checksum(exampleBody)
 		if gotChecksum != wantChecksum {
-			t.Errorf("example checksum label = %s, want %s", gotChecksum, wantChecksum)
+			t.Errorf("example checksum annotation = %s, want %s", gotChecksum, wantChecksum)
 		}
 	}
 
diff --git a/vendor/knative.dev/test-infra/scripts/library.sh b/vendor/knative.dev/test-infra/scripts/library.sh
index 092f39811..de059f536 100644
--- a/vendor/knative.dev/test-infra/scripts/library.sh
+++ b/vendor/knative.dev/test-infra/scripts/library.sh
@@ -449,14 +449,18 @@ function report_go_test() {
 }
 
 # Install Knative Serving in the current cluster.
-# Parameters: $1 - Knative Serving manifest.
+# Parameters: $1 - Knative Serving crds manifest.
+#             $2 - Knative Serving core manifest.
+#             $3 - Knative net-istio manifest.
 function start_knative_serving() {
   header "Starting Knative Serving"
   subheader "Installing Knative Serving"
   echo "Installing Serving CRDs from $1"
-  kubectl apply --selector knative.dev/crd-install=true -f "$1"
-  echo "Installing the rest of serving components from $1"
   kubectl apply -f "$1"
+  echo "Installing Serving core components from $2"
+  kubectl apply -f "$2"
+  echo "Installing net-istio components from $3"
+  kubectl apply -f "$3"
   wait_until_pods_running knative-serving || return 1
 }
 
@@ -478,12 +482,14 @@ function start_knative_monitoring() {
 # Install the stable release Knative/serving in the current cluster.
 # Parameters: $1 - Knative Serving version number, e.g. 0.6.0.
 function start_release_knative_serving() {
-  start_knative_serving "https://storage.googleapis.com/knative-releases/serving/previous/v$1/serving.yaml"
+  start_knative_serving "https://storage.googleapis.com/knative-releases/serving/previous/v$1/serving-crds.yaml" \
+    "https://storage.googleapis.com/knative-releases/serving/previous/v$1/serving-core.yaml" \
+    "https://storage.googleapis.com/knative-releases/net-istio/previous/v$1/net-istio.yaml"
 }
 
 # Install the latest stable Knative Serving in the current cluster.
 function start_latest_knative_serving() {
-  start_knative_serving "${KNATIVE_SERVING_RELEASE}"
+  start_knative_serving "${KNATIVE_SERVING_RELEASE_CRDS}" "${KNATIVE_SERVING_RELEASE_CORE}" "${KNATIVE_NET_ISTIO_RELEASE}"
 }
 
 # Install Knative Eventing in the current cluster.
@@ -742,6 +748,8 @@ readonly _TEST_INFRA_SCRIPTS_DIR="$(dirname $(get_canonical_path ${BASH_SOURCE[0
 readonly REPO_NAME_FORMATTED="Knative $(capitalize ${REPO_NAME//-/ })"
 
 # Public latest nightly or release yaml files.
-readonly KNATIVE_SERVING_RELEASE="$(get_latest_knative_yaml_source "serving" "serving")"
+readonly KNATIVE_SERVING_RELEASE_CRDS="$(get_latest_knative_yaml_source "serving" "serving-crds")"
+readonly KNATIVE_SERVING_RELEASE_CORE="$(get_latest_knative_yaml_source "serving" "serving-core")"
+readonly KNATIVE_NET_ISTIO_RELEASE="$(get_latest_knative_yaml_source "net-istio" "net-istio")"
 readonly KNATIVE_EVENTING_RELEASE="$(get_latest_knative_yaml_source "eventing" "eventing")"
 readonly KNATIVE_MONITORING_RELEASE="$(get_latest_knative_yaml_source "serving" "monitoring")"