Repository: knative/serving
Pull request #10121 (2020-11-17 11:13:10)

[Automated] Update net-contour nightly
Produced via:
```shell
for x in net-contour.yaml contour.yaml; do
  curl https://storage.googleapis.com/knative-nightly/net-contour/latest/$x > ${GITHUB_WORKSPACE}/./third_party/contour-latest/$x
done
```
/assign @knative/networking-wg-leads
/cc @knative/networking-wg-leads

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

This pull-request has been approved by: *<a href="https://github.com/knative/serving/pull/10121#" title="Author self-approved">knative-automation</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **markusthoemmes** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @markusthoemmes` 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:

- **[third_party/OWNERS](https://github.com/knative/serving/blob/master/third_party/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":["markusthoemmes"]} -->
knative-prow-robot: @knative-automation: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-knative-serving-upgrade-tests | 2689a8807a491e20c292609b0bc37a72068ef782 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative_serving/10121/pull-knative-serving-upgrade-tests/1328657452895309824) | `/test pull-knative-serving-upgrade-tests`

[Full PR test history](https://gubernator.knative.dev/pr/knative_serving/10121). [Your PR dashboard](https://gubernator.knative.dev/pr/knative-automation).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
codecov[bot]: # [Codecov](https://codecov.io/gh/knative/serving/pull/10121?src=pr&el=h1) Report
> Merging [#10121](https://codecov.io/gh/knative/serving/pull/10121?src=pr&el=desc) (835973c) into [master](https://codecov.io/gh/knative/serving/commit/32eabd48fc03d1f16ae2508d7b50cc9e9ebb8280?el=desc) (32eabd4) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/knative/serving/pull/10121/graphs/tree.svg?width=650&height=150&src=pr&token=MPpDfAj4Ui)](https://codecov.io/gh/knative/serving/pull/10121?src=pr&el=tree)

```diff
@@           Coverage Diff           @@
##           master   #10121   +/-   ##
=======================================
  Coverage   87.98%   87.98%           
=======================================
  Files         185      185           
  Lines        8729     8729           
=======================================
  Hits         7680     7680           
+ Misses        799      798    -1     
- Partials      250      251    +1     
```


| [Impacted Files](https://codecov.io/gh/knative/serving/pull/10121?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pkg/reconciler/autoscaling/kpa/scaler.go](https://codecov.io/gh/knative/serving/pull/10121/diff?src=pr&el=tree#diff-cGtnL3JlY29uY2lsZXIvYXV0b3NjYWxpbmcva3BhL3NjYWxlci5nbw==) | `88.57% <0.00%> (-1.43%)` | :arrow_down: |
| [pkg/activator/net/revision\_backends.go](https://codecov.io/gh/knative/serving/pull/10121/diff?src=pr&el=tree#diff-cGtnL2FjdGl2YXRvci9uZXQvcmV2aXNpb25fYmFja2VuZHMuZ28=) | `91.40% <0.00%> (+0.90%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/knative/serving/pull/10121?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/knative/serving/pull/10121?src=pr&el=footer). Last update [32eabd4...2689a88](https://codecov.io/gh/knative/serving/pull/10121?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
diff --git a/.github/workflows/knative-style.yaml b/.github/workflows/knative-style.yaml
index ecf9cf6f0..56360215f 100644
--- a/.github/workflows/knative-style.yaml
+++ b/.github/workflows/knative-style.yaml
@@ -234,7 +234,7 @@ jobs:
               ch=$(echo $ent | cut -d':' -f3-);
               err="Unknown printer tool, please file an issue in knative-sandbox/.github and assign to @vagababov: $ch"
               if echo $ch | grep --quiet -E "^t.(Errorf|Fatalf|Logf)" ; then
-                err=$(echo $ch | sed  -E 's/([^.fm]+t\.)(Fatal|Error|Log)f([^\%]+)( %[^Tq]",)([^,]+)/\1\2\3",\5/')
+                err=$(echo $ch | sed  -E 's/(^t\.)(Fatal|Error|Log)f([^\%]+)( %[^Tqx]",)([^,]+)/\1\2\3",\5/')
                 # Not a test. Here we deal with various loggers and fmt helpers.
               elif echo $ch | grep --quiet "log" ; then
                 # Capture (x)?log(er)?.
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index 48bba30de..2d1d4bff8 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -278,8 +278,7 @@ You can delete all of the service components with:
 ko delete --ignore-not-found=true \
   -Rf config/core/ \
   -f https://github.com/knative/net-kourier/releases/download/v0.18.0/kourier.yaml \
-  -f ./third_party/cert-manager-0.12.0/cert-manager-crds.yaml \
-  -f ./third_party/cert-manager-0.12.0/cert-manager.yaml
+  -f ./third_party/cert-manager-latest/cert-manager.yaml
 ```
 
 ## Telemetry
diff --git a/config/core/configmaps/gc.yaml b/config/core/configmaps/gc.yaml
index eae65af91..cf1cd004d 100644
--- a/config/core/configmaps/gc.yaml
+++ b/config/core/configmaps/gc.yaml
@@ -20,7 +20,7 @@ metadata:
   labels:
     serving.knative.dev/release: devel
   annotations:
-    knative.dev/example-checksum: "4b89cfa0"
+    knative.dev/example-checksum: "e6149382"
 data:
   _example: |
     ################################
@@ -38,31 +38,11 @@ data:
     # this example block and unindented to be in the data block
     # to actually change the configuration.
 
-    # Delay after revision creation before considering it for GC
-    stale-revision-create-delay: "48h"
-
-    # Duration since a route has pointed at the revision before it
-    # should be GC'd.
-    # This minus lastpinned-debounce must be longer than the controller
-    # resync period (10 hours).
-    stale-revision-timeout: "15h"
-
-    # Minimum number of generations of non-active revisions to keep before
-    # considering them for GC.
-    stale-revision-minimum-generations: "20"
-
-    # To avoid constant updates, we allow an existing annotation to be stale by this
-    # amount before we update the timestamp.
-    stale-revision-lastpinned-debounce: "5h"
-
 
     # ---------------------------------------
-    # V2 Garbage Collector Settings
+    # Garbage Collector Settings
     # ---------------------------------------
     #
-    # These settings are enabled via the "responsive-revision-gc" feature flag.
-    # ALPHA NOTE: This feature is still experimental and under active development.
-    #
     # Active
     #   * Revisions which are referenced by a Route are considered active.
     #   * Individual revisions may be marked with the annotation
diff --git a/go.mod b/go.mod
index f48c5c79b..79c8518dc 100644
--- a/go.mod
+++ b/go.mod
@@ -36,8 +36,8 @@ require (
 	k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29
 	knative.dev/caching v0.0.0-20201113182901-ee88f744543c
 	knative.dev/hack v0.0.0-20201112185459-01a34c573bd8
-	knative.dev/networking v0.0.0-20201116165202-57530ee4cbfc
-	knative.dev/pkg v0.0.0-20201116214403-188df22c59ac
+	knative.dev/networking v0.0.0-20201117050651-847f7830cf46
+	knative.dev/pkg v0.0.0-20201117020252-ab1a398f669c
 )
 
 replace (
diff --git a/go.sum b/go.sum
index 13cac411b..ddd7e5879 100644
--- a/go.sum
+++ b/go.sum
@@ -1188,11 +1188,11 @@ knative.dev/hack v0.0.0-20201103151104-3d5abc3a0075 h1:YAgWplKIy4O5e3F5vUUECmXAA
 knative.dev/hack v0.0.0-20201103151104-3d5abc3a0075/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
 knative.dev/hack v0.0.0-20201112185459-01a34c573bd8 h1:RNbZsAjhswBPtl4C5C5gEFX5/GfWIOZQxfYD9DhkHdY=
 knative.dev/hack v0.0.0-20201112185459-01a34c573bd8/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
-knative.dev/networking v0.0.0-20201116165202-57530ee4cbfc h1:EULBfbpAFt/k2Fz6N/jwv3ZbbQHJOPeS06YXyo3CJO8=
-knative.dev/networking v0.0.0-20201116165202-57530ee4cbfc/go.mod h1:DCZ5pdCpaPkgvwSvgFzDXSDjZ2dByl+tMIHlXV4wvws=
+knative.dev/networking v0.0.0-20201117050651-847f7830cf46 h1:Nl9o0J7nwTYWIwRKzd60WDIuDO3HjHkjAxvepzwlnLA=
+knative.dev/networking v0.0.0-20201117050651-847f7830cf46/go.mod h1:DCZ5pdCpaPkgvwSvgFzDXSDjZ2dByl+tMIHlXV4wvws=
 knative.dev/pkg v0.0.0-20201112201059-93fedf141385/go.mod h1:5vNHKNtZtzlNeNrcDoUtZIn+dma/8DjmpjfdHiwoQyM=
-knative.dev/pkg v0.0.0-20201116214403-188df22c59ac h1:Oa9KWJQdLWIe7G6sPL8OK8ADynJsOJmZOwYZxPlxYSI=
-knative.dev/pkg v0.0.0-20201116214403-188df22c59ac/go.mod h1:4kXxEyYWdNk3pUR6/cx/ToMKG/dAJvEpDYUfV5RYHeU=
+knative.dev/pkg v0.0.0-20201117020252-ab1a398f669c h1:dMBwabvusJrldjzIj4lces/96SnVgFXV7Kpv9z9fiCI=
+knative.dev/pkg v0.0.0-20201117020252-ab1a398f669c/go.mod h1:4kXxEyYWdNk3pUR6/cx/ToMKG/dAJvEpDYUfV5RYHeU=
 pgregory.net/rapid v0.3.3 h1:jCjBsY4ln4Atz78QoBWxUEvAHaFyNDQg9+WU62aCn1U=
 pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
diff --git a/pkg/activator/handler/handler.go b/pkg/activator/handler/handler.go
index 22c08659f..c3b8c9ada 100644
--- a/pkg/activator/handler/handler.go
+++ b/pkg/activator/handler/handler.go
@@ -53,7 +53,7 @@ type activationHandler struct {
 }
 
 // New constructs a new http.Handler that deals with revision activation.
-func New(ctx context.Context, t Throttler, transport http.RoundTripper) http.Handler {
+func New(_ context.Context, t Throttler, transport http.RoundTripper) http.Handler {
 	return &activationHandler{
 		transport: transport,
 		tracingTransport: &ochttp.Transport{
diff --git a/pkg/apis/config/features.go b/pkg/apis/config/features.go
index ce43c1fb5..a3b762c34 100644
--- a/pkg/apis/config/features.go
+++ b/pkg/apis/config/features.go
@@ -49,7 +49,6 @@ func defaultFeaturesConfig() *Features {
 		PodSpecRuntimeClassName: Disabled,
 		PodSpecSecurityContext:  Disabled,
 		PodSpecTolerations:      Disabled,
-		ResponsiveRevisionGC:    Enabled,
 		TagHeaderBasedRouting:   Disabled,
 	}
 }
@@ -67,7 +66,6 @@ func NewFeaturesConfigFromMap(data map[string]string) (*Features, error) {
 		asFlag("kubernetes.podspec-runtimeclassname", &nc.PodSpecRuntimeClassName),
 		asFlag("kubernetes.podspec-securitycontext", &nc.PodSpecSecurityContext),
 		asFlag("kubernetes.podspec-tolerations", &nc.PodSpecTolerations),
-		asFlag("responsive-revision-gc", &nc.ResponsiveRevisionGC),
 		asFlag("tag-header-based-routing", &nc.TagHeaderBasedRouting)); err != nil {
 		return nil, err
 	}
@@ -89,7 +87,6 @@ type Features struct {
 	PodSpecRuntimeClassName Flag
 	PodSpecSecurityContext  Flag
 	PodSpecTolerations      Flag
-	ResponsiveRevisionGC    Flag
 	TagHeaderBasedRouting   Flag
 }
 
diff --git a/pkg/apis/serving/v1/configuration_conversion.go b/pkg/apis/serving/v1/configuration_conversion.go
index fa7fe1082..6f01637ff 100644
--- a/pkg/apis/serving/v1/configuration_conversion.go
+++ b/pkg/apis/serving/v1/configuration_conversion.go
@@ -24,11 +24,11 @@ import (
 )
 
 // ConvertTo implements apis.Convertible
-func (source *Configuration) ConvertTo(ctx context.Context, sink apis.Convertible) error {
+func (source *Configuration) ConvertTo(_ context.Context, sink apis.Convertible) error {
 	return fmt.Errorf("v1 is the highest known version, got: %T", sink)
 }
 
 // ConvertFrom implements apis.Convertible
-func (sink *Configuration) ConvertFrom(ctx context.Context, source apis.Convertible) error {
+func (sink *Configuration) ConvertFrom(_ context.Context, source apis.Convertible) error {
 	return fmt.Errorf("v1 is the highest known version, got: %T", source)
 }
diff --git a/pkg/apis/serving/v1/revision_conversion.go b/pkg/apis/serving/v1/revision_conversion.go
index 50447f527..053b79156 100644
--- a/pkg/apis/serving/v1/revision_conversion.go
+++ b/pkg/apis/serving/v1/revision_conversion.go
@@ -24,11 +24,11 @@ import (
 )
 
 // ConvertTo implements apis.Convertible
-func (source *Revision) ConvertTo(ctx context.Context, sink apis.Convertible) error {
+func (source *Revision) ConvertTo(_ context.Context, sink apis.Convertible) error {
 	return fmt.Errorf("v1 is the highest known version, got: %T", sink)
 }
 
 // ConvertFrom implements apis.Convertible
-func (sink *Revision) ConvertFrom(ctx context.Context, source apis.Convertible) error {
+func (sink *Revision) ConvertFrom(_ context.Context, source apis.Convertible) error {
 	return fmt.Errorf("v1 is the highest known version, got: %T", source)
 }
diff --git a/pkg/apis/serving/v1/revision_helpers.go b/pkg/apis/serving/v1/revision_helpers.go
index 303376026..275b59079 100644
--- a/pkg/apis/serving/v1/revision_helpers.go
+++ b/pkg/apis/serving/v1/revision_helpers.go
@@ -17,8 +17,6 @@ limitations under the License.
 package v1
 
 import (
-	"fmt"
-	"strconv"
 	"time"
 
 	corev1 "k8s.io/api/core/v1"
@@ -91,16 +89,8 @@ type (
 	}
 
 	// +k8s:deepcopy-gen=false
-
-	// LastPinnedParseError is the error returned when the lastPinned annotation
-	// could not be parsed.
-	LastPinnedParseError AnnotationParseError
 )
 
-func (e LastPinnedParseError) Error() string {
-	return fmt.Sprintf("%v lastPinned value: %q", e.Type, e.Value)
-}
-
 // GetContainer returns a pointer to the relevant corev1.Container field.
 // It is never nil and should be exactly the specified container if len(containers) == 1 or
 // if there are multiple containers it returns the container which has Ports
@@ -163,8 +153,7 @@ func (r *Revision) GetRoutingStateModified() time.Time {
 
 // IsReachable returns whether or not the revision can be reached by a route.
 func (r *Revision) IsReachable() bool {
-	return r.Labels[serving.RouteLabelKey] != "" ||
-		RoutingState(r.Labels[serving.RoutingStateLabelKey]) == RoutingStateActive
+	return RoutingState(r.Labels[serving.RoutingStateLabelKey]) == RoutingStateActive
 }
 
 // GetProtocol returns the app level network protocol.
@@ -183,44 +172,6 @@ func (r *Revision) GetProtocol() (p net.ProtocolType) {
 	return
 }
 
-// SetLastPinned sets the revision's last pinned annotations
-// to be the specified time.
-func (r *Revision) SetLastPinned(t time.Time) {
-	if r.Annotations == nil {
-		r.Annotations = make(map[string]string, 1)
-	}
-
-	r.Annotations[serving.RevisionLastPinnedAnnotationKey] = RevisionLastPinnedString(t)
-}
-
-// GetLastPinned returns the time the revision was last pinned.
-func (r *Revision) GetLastPinned() (time.Time, error) {
-	if r.Annotations == nil {
-		return time.Time{}, LastPinnedParseError{
-			Type: AnnotationParseErrorTypeMissing,
-		}
-	}
-
-	str, ok := r.Annotations[serving.RevisionLastPinnedAnnotationKey]
-	if !ok {
-		// If a revision is past the create delay without an annotation it is stale.
-		return time.Time{}, LastPinnedParseError{
-			Type: AnnotationParseErrorTypeMissing,
-		}
-	}
-
-	secs, err := strconv.ParseInt(str, 10, 64)
-	if err != nil {
-		return time.Time{}, LastPinnedParseError{
-			Type:  AnnotationParseErrorTypeInvalid,
-			Value: str,
-			Err:   err,
-		}
-	}
-
-	return time.Unix(secs, 0), nil
-}
-
 // IsActivationRequired returns true if activation is required.
 func (rs *RevisionStatus) IsActivationRequired() bool {
 	if c := revisionCondSet.Manage(rs).GetCondition(RevisionConditionActive); c != nil {
@@ -228,8 +179,3 @@ func (rs *RevisionStatus) IsActivationRequired() bool {
 	}
 	return false
 }
-
-// RevisionLastPinnedString returns a string representation of the specified time.
-func RevisionLastPinnedString(t time.Time) string {
-	return fmt.Sprint(t.Unix())
-}
diff --git a/pkg/apis/serving/v1/revision_validation.go b/pkg/apis/serving/v1/revision_validation.go
index 4ccbf63ac..81e02f7cd 100644
--- a/pkg/apis/serving/v1/revision_validation.go
+++ b/pkg/apis/serving/v1/revision_validation.go
@@ -70,7 +70,7 @@ func (rts *RevisionTemplateSpec) Validate(ctx context.Context) *apis.FieldError
 
 // VerifyNameChange checks that if a user brought their own name previously that it
 // changes at the appropriate times.
-func (rts *RevisionTemplateSpec) VerifyNameChange(ctx context.Context, og *RevisionTemplateSpec) *apis.FieldError {
+func (rts *RevisionTemplateSpec) VerifyNameChange(_ context.Context, og *RevisionTemplateSpec) *apis.FieldError {
 	if rts.Name == "" {
 		// We only check that Name changes when the RevisionTemplate changes.
 		return nil
@@ -114,7 +114,7 @@ func (rs *RevisionSpec) Validate(ctx context.Context) *apis.FieldError {
 }
 
 // Validate implements apis.Validatable
-func (rs *RevisionStatus) Validate(ctx context.Context) *apis.FieldError {
+func (rs *RevisionStatus) Validate(_ context.Context) *apis.FieldError {
 	return nil
 }
 
diff --git a/pkg/apis/serving/v1/route_conversion.go b/pkg/apis/serving/v1/route_conversion.go
index c91117820..50682d0a8 100644
--- a/pkg/apis/serving/v1/route_conversion.go
+++ b/pkg/apis/serving/v1/route_conversion.go
@@ -24,11 +24,11 @@ import (
 )
 
 // ConvertTo implements apis.Convertible
-func (source *Route) ConvertTo(ctx context.Context, sink apis.Convertible) error {
+func (source *Route) ConvertTo(_ context.Context, sink apis.Convertible) error {
 	return fmt.Errorf("v1 is the highest known version, got: %T", sink)
 }
 
 // ConvertFrom implements apis.Convertible
-func (sink *Route) ConvertFrom(ctx context.Context, source apis.Convertible) error {
+func (sink *Route) ConvertFrom(_ context.Context, source apis.Convertible) error {
 	return fmt.Errorf("v1 is the highest known version, got: %T", source)
 }
diff --git a/pkg/apis/serving/v1/service_conversion.go b/pkg/apis/serving/v1/service_conversion.go
index 21f05f3b4..6f427dc11 100644
--- a/pkg/apis/serving/v1/service_conversion.go
+++ b/pkg/apis/serving/v1/service_conversion.go
@@ -24,11 +24,11 @@ import (
 )
 
 // ConvertTo implements apis.Convertible
-func (source *Service) ConvertTo(ctx context.Context, sink apis.Convertible) error {
+func (source *Service) ConvertTo(_ context.Context, sink apis.Convertible) error {
 	return fmt.Errorf("v1 is the highest known version, got: %T", sink)
 }
 
 // ConvertFrom implements apis.Convertible
-func (sink *Service) ConvertFrom(ctx context.Context, source apis.Convertible) error {
+func (sink *Service) ConvertFrom(_ context.Context, source apis.Convertible) error {
 	return fmt.Errorf("v1 is the highest known version, got: %T", source)
 }
diff --git a/pkg/gc/config.go b/pkg/gc/config.go
index 97fe2b9ae..4218e6fc6 100644
--- a/pkg/gc/config.go
+++ b/pkg/gc/config.go
@@ -25,8 +25,6 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 	cm "knative.dev/pkg/configmap"
-	"knative.dev/pkg/controller"
-	"knative.dev/pkg/logging"
 )
 
 const (
@@ -42,16 +40,6 @@ const (
 
 // Config defines the tunable parameters for Garbage Collection.
 type Config struct {
-	// Delay duration after a revision create before considering it for GC
-	StaleRevisionCreateDelay time.Duration
-	// Timeout since a revision lastPinned before it should be GC'd
-	// This must be longer than the controller resync period
-	StaleRevisionTimeout time.Duration
-	// Minimum number of generations of revisions to keep before considering for GC.
-	StaleRevisionMinimumGenerations int64
-	// Minimum staleness duration before updating lastPinned
-	StaleRevisionLastpinnedDebounce time.Duration
-
 	// Duration from creation when a Revision should be considered active
 	// and exempt from GC. Note that GCMaxStaleRevision may override this if set.
 	// Set Disabled (-1) to disable/ignore duration and always consider active.
@@ -70,13 +58,6 @@ type Config struct {
 
 func defaultConfig() *Config {
 	return &Config{
-		// V1 GC Settings
-		StaleRevisionCreateDelay:        48 * time.Hour,
-		StaleRevisionTimeout:            15 * time.Hour,
-		StaleRevisionLastpinnedDebounce: 5 * time.Hour,
-		StaleRevisionMinimumGenerations: 20,
-
-		// V2 GC Settings
 		RetainSinceCreateTime:     48 * time.Hour,
 		RetainSinceLastActiveTime: 15 * time.Hour,
 		MinNonActiveRevisions:     20,
@@ -86,19 +67,11 @@ func defaultConfig() *Config {
 
 // NewConfigFromConfigMapFunc creates a Config from the supplied ConfigMap func.
 func NewConfigFromConfigMapFunc(ctx context.Context) func(configMap *corev1.ConfigMap) (*Config, error) {
-	logger := logging.FromContext(ctx)
-	minRevisionTimeout := controller.GetResyncPeriod(ctx)
 	return func(configMap *corev1.ConfigMap) (*Config, error) {
 		c := defaultConfig()
 
 		var retainCreate, retainActive, max string
 		if err := cm.Parse(configMap.Data,
-			cm.AsDuration("stale-revision-create-delay", &c.StaleRevisionCreateDelay),
-			cm.AsDuration("stale-revision-timeout", &c.StaleRevisionTimeout),
-			cm.AsDuration("stale-revision-lastpinned-debounce", &c.StaleRevisionLastpinnedDebounce),
-			cm.AsInt64("stale-revision-minimum-generations", &c.StaleRevisionMinimumGenerations),
-
-			// v2 settings
 			cm.AsString("retain-since-create-time", &retainCreate),
 			cm.AsString("retain-since-last-active-time", &retainActive),
 			cm.AsInt64("min-non-active-revisions", &c.MinNonActiveRevisions),
@@ -107,17 +80,6 @@ func NewConfigFromConfigMapFunc(ctx context.Context) func(configMap *corev1.Conf
 			return nil, fmt.Errorf("failed to parse data: %w", err)
 		}
 
-		if c.StaleRevisionMinimumGenerations < 0 {
-			return nil, fmt.Errorf(
-				"stale-revision-minimum-generations must be non-negative, was: %d",
-				c.StaleRevisionMinimumGenerations)
-		}
-		if c.StaleRevisionTimeout-c.StaleRevisionLastpinnedDebounce < minRevisionTimeout {
-			logger.Warnf("Got revision timeout of %v, minimum supported value is %v",
-				c.StaleRevisionTimeout, minRevisionTimeout+c.StaleRevisionLastpinnedDebounce)
-			c.StaleRevisionTimeout = minRevisionTimeout + c.StaleRevisionLastpinnedDebounce
-		}
-
 		// validate V2 settings
 		if err := parseDisabledOrDuration(retainCreate, &c.RetainSinceCreateTime); err != nil {
 			return nil, fmt.Errorf("failed to parse retain-since-create-time: %w", err)
@@ -126,13 +88,13 @@ func NewConfigFromConfigMapFunc(ctx context.Context) func(configMap *corev1.Conf
 			return nil, fmt.Errorf("failed to parse retain-since-last-active-time: %w", err)
 		}
 		if err := parseDisabledOrInt64(max, &c.MaxNonActiveRevisions); err != nil {
-			return nil, fmt.Errorf("failed to parse max-stale-revisions: %w", err)
+			return nil, fmt.Errorf("failed to parse max-non-active-revisions: %w", err)
 		}
 		if c.MinNonActiveRevisions < 0 {
 			return nil, fmt.Errorf("min-non-active-revisions must be non-negative, was: %d", c.MinNonActiveRevisions)
 		}
 		if c.MaxNonActiveRevisions >= 0 && c.MinNonActiveRevisions > c.MaxNonActiveRevisions {
-			return nil, fmt.Errorf("min-non-active-revisions(%d) must be <= max-stale-revisions(%d)", c.MinNonActiveRevisions, c.MaxNonActiveRevisions)
+			return nil, fmt.Errorf("min-non-active-revisions(%d) must be <= max-non-active-revisions(%d)", c.MinNonActiveRevisions, c.MaxNonActiveRevisions)
 		}
 		return c, nil
 	}
diff --git a/pkg/reconciler/autoscaling/kpa/resources/decider.go b/pkg/reconciler/autoscaling/kpa/resources/decider.go
index 52e7979b4..8b8cde4c1 100644
--- a/pkg/reconciler/autoscaling/kpa/resources/decider.go
+++ b/pkg/reconciler/autoscaling/kpa/resources/decider.go
@@ -47,7 +47,7 @@ type Deciders interface {
 // MakeDecider constructs a Decider resource from a PodAutoscaler taking
 // into account the PA's ContainerConcurrency and the relevant
 // autoscaling annotation.
-func MakeDecider(ctx context.Context, pa *asv1a1.PodAutoscaler, config *autoscalerconfig.Config) *scaling.Decider {
+func MakeDecider(_ context.Context, pa *asv1a1.PodAutoscaler, config *autoscalerconfig.Config) *scaling.Decider {
 	panicThresholdPercentage := config.PanicThresholdPercentage
 	if x, ok := pa.PanicThresholdPercentage(); ok {
 		panicThresholdPercentage = x
diff --git a/pkg/reconciler/configuration/resources/revision.go b/pkg/reconciler/configuration/resources/revision.go
index a8919958e..9fb516dcd 100644
--- a/pkg/reconciler/configuration/resources/revision.go
+++ b/pkg/reconciler/configuration/resources/revision.go
@@ -23,10 +23,8 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/clock"
 	"knative.dev/pkg/kmeta"
-	cfgmap "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/apis/serving"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
-	"knative.dev/serving/pkg/reconciler/configuration/config"
 )
 
 // MakeRevision creates a revision object from configuration.
@@ -44,9 +42,7 @@ func MakeRevision(ctx context.Context, configuration *v1.Configuration, clock cl
 	}
 
 	// Pending tells the labeler that we have not processed this revision.
-	if config.FromContextOrDefaults(ctx).Features.ResponsiveRevisionGC != cfgmap.Disabled {
-		rev.SetRoutingState(v1.RoutingStatePending, clock)
-	}
+	rev.SetRoutingState(v1.RoutingStatePending, clock)
 
 	updateRevisionLabels(rev, configuration)
 	updateRevisionAnnotations(rev, configuration)
diff --git a/pkg/reconciler/gc/config/store.go b/pkg/reconciler/gc/config/store.go
index cac21568f..83d6604c5 100644
--- a/pkg/reconciler/gc/config/store.go
+++ b/pkg/reconciler/gc/config/store.go
@@ -30,7 +30,6 @@ type cfgKey struct{}
 // Config is the configuration for GC.
 type Config struct {
 	RevisionGC *gc.Config
-	Features   *apiconfig.Features
 }
 
 // FromContext fetches the config from the context.
@@ -57,7 +56,6 @@ func (s *Store) ToContext(ctx context.Context) context.Context {
 func (s *Store) Load() *Config {
 	return &Config{
 		RevisionGC: s.UntypedLoad(gc.ConfigName).(*gc.Config).DeepCopy(),
-		Features:   s.UntypedLoad(apiconfig.FeaturesConfigName).(*apiconfig.Features).DeepCopy(),
 	}
 }
 
diff --git a/pkg/reconciler/gc/reconciler.go b/pkg/reconciler/gc/reconciler.go
index 5f5abc3ec..478c6a3c0 100644
--- a/pkg/reconciler/gc/reconciler.go
+++ b/pkg/reconciler/gc/reconciler.go
@@ -20,13 +20,10 @@ import (
 	"context"
 
 	pkgreconciler "knative.dev/pkg/reconciler"
-	cfgmap "knative.dev/serving/pkg/apis/config"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	clientset "knative.dev/serving/pkg/client/clientset/versioned"
 	configreconciler "knative.dev/serving/pkg/client/injection/reconciler/serving/v1/configuration"
 	listers "knative.dev/serving/pkg/client/listers/serving/v1"
-	configns "knative.dev/serving/pkg/reconciler/gc/config"
-	gcv1 "knative.dev/serving/pkg/reconciler/gc/v1"
 	gcv2 "knative.dev/serving/pkg/reconciler/gc/v2"
 )
 
@@ -43,12 +40,5 @@ var _ configreconciler.Interface = (*reconciler)(nil)
 
 // ReconcileKind implements Interface.ReconcileKind.
 func (c *reconciler) ReconcileKind(ctx context.Context, config *v1.Configuration) pkgreconciler.Event {
-	switch configns.FromContext(ctx).Features.ResponsiveRevisionGC {
-
-	case cfgmap.Disabled: // v1 logic
-		return gcv1.Collect(ctx, c.client, c.revisionLister, config)
-
-	default: // v2 logic
-		return gcv2.Collect(ctx, c.client, c.revisionLister, config)
-	}
+	return gcv2.Collect(ctx, c.client, c.revisionLister, config)
 }
diff --git a/pkg/reconciler/gc/v1/gc.go b/pkg/reconciler/gc/v1/gc.go
deleted file mode 100644
index 875a9c8f8..000000000
--- a/pkg/reconciler/gc/v1/gc.go
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
-Copyright 2020 The Knative Authors
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1
-
-import (
-	"context"
-	"errors"
-	"sort"
-	"time"
-
-	"go.uber.org/zap"
-	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/labels"
-	"knative.dev/pkg/logging"
-	pkgreconciler "knative.dev/pkg/reconciler"
-	"knative.dev/serving/pkg/apis/serving"
-	v1 "knative.dev/serving/pkg/apis/serving/v1"
-	clientset "knative.dev/serving/pkg/client/clientset/versioned"
-	listers "knative.dev/serving/pkg/client/listers/serving/v1"
-	configns "knative.dev/serving/pkg/reconciler/gc/config"
-)
-
-// Collect deletes stale revisions if they are sufficiently old
-func Collect(
-	ctx context.Context,
-	client clientset.Interface,
-	revisionLister listers.RevisionLister,
-	config *v1.Configuration) pkgreconciler.Event {
-	cfg := configns.FromContext(ctx).RevisionGC
-	logger := logging.FromContext(ctx)
-
-	selector := labels.SelectorFromSet(labels.Set{serving.ConfigurationLabelKey: config.Name})
-	revs, err := revisionLister.Revisions(config.Namespace).List(selector)
-	if err != nil {
-		return err
-	}
-
-	gcSkipOffset := cfg.StaleRevisionMinimumGenerations
-
-	if gcSkipOffset >= int64(len(revs)) {
-		return nil
-	}
-
-	// Sort by creation timestamp descending
-	sort.Slice(revs, func(i, j int) bool {
-		return revs[j].CreationTimestamp.Before(&revs[i].CreationTimestamp)
-	})
-
-	for _, rev := range revs[gcSkipOffset:] {
-		if isRevisionStale(ctx, rev, config) {
-			err := client.ServingV1().Revisions(rev.Namespace).Delete(ctx, rev.Name, metav1.DeleteOptions{})
-			if err != nil {
-				logger.With(zap.Error(err)).Errorf("Failed to delete stale revision %q", rev.Name)
-				continue
-			}
-		}
-	}
-	return nil
-}
-
-func isRevisionStale(ctx context.Context, rev *v1.Revision, config *v1.Configuration) bool {
-	if config.Status.LatestReadyRevisionName == rev.Name {
-		return false
-	}
-
-	cfg := configns.FromContext(ctx).RevisionGC
-	logger := logging.FromContext(ctx)
-
-	curTime := time.Now()
-	if rev.ObjectMeta.CreationTimestamp.Add(cfg.StaleRevisionCreateDelay).After(curTime) {
-		// Revision was created sooner than staleRevisionCreateDelay. Ignore it.
-		return false
-	}
-
-	lastPin, err := rev.GetLastPinned()
-	if err != nil {
-		var errLastPinned v1.LastPinnedParseError
-		if errors.As(err, &errLastPinned) && errLastPinned.Type != v1.AnnotationParseErrorTypeMissing {
-			logger.Errorw("Failed to determine revision last pinned", zap.Error(err))
-		} else {
-			// Revision was never pinned and its RevisionConditionReady is not true after staleRevisionCreateDelay.
-			// It usually happens when ksvc was deployed with wrong configuration.
-			rc := rev.Status.GetCondition(v1.RevisionConditionReady)
-			if rc == nil || rc.Status != corev1.ConditionTrue {
-				return true
-			}
-		}
-		return false
-	}
-
-	ret := lastPin.Add(cfg.StaleRevisionTimeout).Before(curTime)
-	if ret {
-		logger.Infof("Detected stale revision %v with creation time %v and lastPinned time %v.", rev.ObjectMeta.Name, rev.ObjectMeta.CreationTimestamp, lastPin)
-	}
-	return ret
-}
diff --git a/pkg/reconciler/gc/v2/gc.go b/pkg/reconciler/gc/v2/gc.go
index b27416bb0..bece2e05c 100644
--- a/pkg/reconciler/gc/v2/gc.go
+++ b/pkg/reconciler/gc/v2/gc.go
@@ -159,14 +159,11 @@ func isRevisionStale(cfg *gc.Config, rev *v1.Revision, logger *zap.SugaredLogger
 }
 
 // revisionLastActiveTime returns if present:
-// routingStateModified, then lastPinnedTime, then the created time.
+// routingStateModified, then the created time.
 // This is used for sort-ordering by most recently active.
 func revisionLastActiveTime(rev *v1.Revision) time.Time {
 	if t := rev.GetRoutingStateModified(); !t.IsZero() {
 		return t
 	}
-	if t, err := rev.GetLastPinned(); err == nil {
-		return t
-	}
 	return rev.ObjectMeta.GetCreationTimestamp().Time
 }
diff --git a/pkg/reconciler/labeler/controller.go b/pkg/reconciler/labeler/controller.go
index 85bd9aecb..d30dd0193 100644
--- a/pkg/reconciler/labeler/controller.go
+++ b/pkg/reconciler/labeler/controller.go
@@ -30,7 +30,6 @@ import (
 	routereconciler "knative.dev/serving/pkg/client/injection/reconciler/serving/v1/route"
 	servingreconciler "knative.dev/serving/pkg/reconciler"
 	"knative.dev/serving/pkg/reconciler/configuration/config"
-	labelerv1 "knative.dev/serving/pkg/reconciler/labeler/v1"
 	labelerv2 "knative.dev/serving/pkg/reconciler/labeler/v2"
 
 	"knative.dev/pkg/configmap"
@@ -99,11 +98,7 @@ func newControllerWithClock(
 	))
 
 	client := servingclient.Get(ctx)
-
-	c.caccV1 = labelerv1.NewConfigurationAccessor(client, tracker, configInformer.Lister())
 	c.caccV2 = labelerv2.NewConfigurationAccessor(client, tracker, configInformer.Lister(), configInformer.Informer().GetIndexer(), clock)
-
-	c.raccV1 = labelerv1.NewRevisionAccessor(client, tracker, revisionInformer.Lister())
 	c.raccV2 = labelerv2.NewRevisionAccessor(client, tracker, revisionInformer.Lister(), revisionInformer.Informer().GetIndexer(), clock)
 
 	return impl
diff --git a/pkg/reconciler/labeler/labeler.go b/pkg/reconciler/labeler/labeler.go
index 3b23ff2b0..f6299eca5 100644
--- a/pkg/reconciler/labeler/labeler.go
+++ b/pkg/reconciler/labeler/labeler.go
@@ -20,19 +20,13 @@ import (
 	"context"
 
 	pkgreconciler "knative.dev/pkg/reconciler"
-	cfgmap "knative.dev/serving/pkg/apis/config"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	routereconciler "knative.dev/serving/pkg/client/injection/reconciler/serving/v1/route"
-	"knative.dev/serving/pkg/reconciler/configuration/config"
-	labelerv1 "knative.dev/serving/pkg/reconciler/labeler/v1"
 	labelerv2 "knative.dev/serving/pkg/reconciler/labeler/v2"
 )
 
 // Reconciler implements controller.Reconciler for Route resources.
 type Reconciler struct {
-	caccV1 *labelerv1.Configuration
-	raccV1 *labelerv1.Revision
-
 	caccV2 *labelerv2.Configuration
 	raccV2 *labelerv2.Revision
 }
@@ -44,52 +38,17 @@ var _ routereconciler.Finalizer = (*Reconciler)(nil)
 // FinalizeKind removes all Route reference metadata from its traffic targets.
 // This does not modify or observe spec for the Route itself.
 func (rec *Reconciler) FinalizeKind(ctx context.Context, r *v1.Route) pkgreconciler.Event {
-	newGC := config.FromContextOrDefaults(ctx).Features.ResponsiveRevisionGC
-
-	// v1 logic
-	if newGC == cfgmap.Disabled || newGC == cfgmap.Allowed {
-		if err := labelerv1.ClearLabels(ctx, r.Namespace, r.Name, rec.caccV1, rec.raccV1); err != nil {
-			return err
-		}
+	if err := labelerv2.ClearRoutingMeta(ctx, r, rec.caccV2, rec.raccV2); err != nil {
+		return err
 	}
-
-	// v2 logic
-	if newGC == cfgmap.Allowed || newGC == cfgmap.Enabled {
-		if err := labelerv2.ClearRoutingMeta(ctx, r, rec.caccV2, rec.raccV2); err != nil {
-			return err
-		}
-	}
-
 	return nil
 }
 
 // ReconcileKind syncs the Route reference metadata to its traffic targets.
 // This does not modify or observe spec for the Route itself.
 func (rec *Reconciler) ReconcileKind(ctx context.Context, r *v1.Route) pkgreconciler.Event {
-	switch config.FromContextOrDefaults(ctx).Features.ResponsiveRevisionGC {
-	case cfgmap.Disabled:
-		if err := labelerv1.SyncLabels(ctx, r, rec.caccV1, rec.raccV1); err != nil {
-			return err
-		}
-		// Clear the new label for downgrade
-		if err := labelerv2.ClearRoutingMeta(ctx, r, rec.caccV2, rec.raccV2); err != nil {
-			return err
-		}
-	case cfgmap.Allowed: // Both labelers on, down/upgrade don't lose data.
-		if err := labelerv1.SyncLabels(ctx, r, rec.caccV1, rec.raccV1); err != nil {
-			return err
-		}
-		if err := labelerv2.SyncRoutingMeta(ctx, r, rec.caccV2, rec.raccV2); err != nil {
-			return err
-		}
-	case cfgmap.Enabled:
-		if err := labelerv2.SyncRoutingMeta(ctx, r, rec.caccV2, rec.raccV2); err != nil {
-			return err
-		}
-		// Clear the old label for upgrade
-		if err := labelerv1.ClearLabels(ctx, r.Namespace, r.Name, rec.caccV1, rec.raccV1); err != nil {
-			return err
-		}
+	if err := labelerv2.SyncRoutingMeta(ctx, r, rec.caccV2, rec.raccV2); err != nil {
+		return err
 	}
 
 	return nil
diff --git a/pkg/reconciler/labeler/v1/accessors.go b/pkg/reconciler/labeler/v1/accessors.go
deleted file mode 100644
index 465440241..000000000
--- a/pkg/reconciler/labeler/v1/accessors.go
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
-Copyright 2020 The Knative Authors
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1
-
-import (
-	"context"
-
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/labels"
-	"k8s.io/apimachinery/pkg/types"
-	"knative.dev/pkg/kmeta"
-
-	"knative.dev/pkg/tracker"
-	"knative.dev/serving/pkg/apis/serving"
-	clientset "knative.dev/serving/pkg/client/clientset/versioned"
-	listers "knative.dev/serving/pkg/client/listers/serving/v1"
-)
-
-// Accessor defines an abstraction for manipulating labeled entity
-// (Configuration, Revision) with shared logic.
-type Accessor interface {
-	get(ctx context.Context, ns, name string) (kmeta.Accessor, error)
-	list(ctx context.Context, ns, name string) ([]kmeta.Accessor, error)
-	patch(ctx context.Context, ns, name string, pt types.PatchType, p []byte) error
-}
-
-// Revision is an implementation of Accessor for Revisions.
-type Revision struct {
-	client         clientset.Interface
-	tracker        tracker.Interface
-	revisionLister listers.RevisionLister
-}
-
-// Revision implements Accessor
-var _ Accessor = (*Revision)(nil)
-
-// NewRevisionAccessor is a factory function to make a new revision accessor.
-func NewRevisionAccessor(
-	client clientset.Interface,
-	tracker tracker.Interface,
-	lister listers.RevisionLister) *Revision {
-	return &Revision{
-		client:         client,
-		tracker:        tracker,
-		revisionLister: lister,
-	}
-}
-
-// get implements Accessor
-func (r *Revision) get(ctx context.Context, ns, name string) (kmeta.Accessor, error) {
-	return r.revisionLister.Revisions(ns).Get(name)
-}
-
-// list implements Accessor
-func (r *Revision) list(ctx context.Context, ns, name string) ([]kmeta.Accessor, error) {
-	rl, err := r.revisionLister.Revisions(ns).List(labels.SelectorFromSet(labels.Set{
-		serving.RouteLabelKey: name,
-	}))
-	if err != nil {
-		return nil, err
-	}
-	// Need a copy to change types in Go
-	kl := make([]kmeta.Accessor, len(rl))
-	for i, r := range rl {
-		kl[i] = r
-	}
-	return kl, err
-}
-
-// patch implements Accessor
-func (r *Revision) patch(ctx context.Context, ns, name string, pt types.PatchType, p []byte) error {
-	_, err := r.client.ServingV1().Revisions(ns).Patch(ctx, name, pt, p, metav1.PatchOptions{})
-	return err
-}
-
-// Configuration is an implementation of Accessor for Configurations.
-type Configuration struct {
-	client              clientset.Interface
-	tracker             tracker.Interface
-	configurationLister listers.ConfigurationLister
-}
-
-// Configuration implements Accessor
-var _ Accessor = (*Configuration)(nil)
-
-// NewConfigurationAccessor is a factory function to make a new configuration Accessor.
-func NewConfigurationAccessor(
-	client clientset.Interface,
-	tracker tracker.Interface,
-	lister listers.ConfigurationLister) *Configuration {
-	return &Configuration{
-		client:              client,
-		tracker:             tracker,
-		configurationLister: lister,
-	}
-}
-
-// get implements Accessor
-func (c *Configuration) get(ctx context.Context, ns, name string) (kmeta.Accessor, error) {
-	return c.configurationLister.Configurations(ns).Get(name)
-}
-
-// list implements Accessor
-func (c *Configuration) list(ctx context.Context, ns, name string) ([]kmeta.Accessor, error) {
-	cl, err := c.configurationLister.Configurations(ns).List(labels.SelectorFromSet(labels.Set{
-		serving.RouteLabelKey: name,
-	}))
-	if err != nil {
-		return nil, err
-	}
-	// Need a copy to change types in Go
-	kl := make([]kmeta.Accessor, len(cl))
-	for i, c := range cl {
-		kl[i] = c
-	}
-	return kl, err
-}
-
-// patch implements Accessor
-func (c *Configuration) patch(ctx context.Context, ns, name string, pt types.PatchType, p []byte) error {
-	_, err := c.client.ServingV1().Configurations(ns).Patch(ctx, name, pt, p, metav1.PatchOptions{})
-	return err
-}
diff --git a/pkg/reconciler/labeler/v1/labels.go b/pkg/reconciler/labeler/v1/labels.go
deleted file mode 100644
index fe6fef962..000000000
--- a/pkg/reconciler/labeler/v1/labels.go
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
-Copyright 2018 The Knative Authors
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1
-
-import (
-	"context"
-	"encoding/json"
-	"fmt"
-
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/types"
-	"k8s.io/apimachinery/pkg/util/sets"
-	"knative.dev/pkg/kmeta"
-	"knative.dev/pkg/tracker"
-
-	"knative.dev/serving/pkg/apis/serving"
-	v1 "knative.dev/serving/pkg/apis/serving/v1"
-)
-
-// SyncLabels makes sure that the revisions and configurations referenced from
-// a Route are labeled with route labels.
-func SyncLabels(ctx context.Context, r *v1.Route, cacc *Configuration, racc *Revision) error {
-	revisions := sets.NewString()
-	configs := sets.NewString()
-
-	// Walk the Route's .status.traffic and .spec.traffic and build a list
-	// of revisions and configurations to label
-	for _, tt := range append(r.Status.Traffic, r.Spec.Traffic...) {
-		revName := tt.RevisionName
-		configName := tt.ConfigurationName
-
-		if revName != "" {
-			if err := racc.tracker.TrackReference(ref(r.Namespace, revName, "Revision"), r); err != nil {
-				return err
-			}
-
-			rev, err := racc.get(ctx, r.Namespace, revName)
-			if err != nil {
-				// The revision might not exist (yet). The informers will notify if it gets created.
-				continue
-			}
-
-			revisions.Insert(revName)
-
-			// If the owner reference is a configuration, treat it like a configuration target
-			if owner := metav1.GetControllerOf(rev); owner != nil && owner.Kind == "Configuration" {
-				configName = owner.Name
-			}
-		}
-
-		if configName != "" {
-			if err := cacc.tracker.TrackReference(ref(r.Namespace, configName, "Configuration"), r); err != nil {
-				return err
-			}
-
-			config, err := cacc.configurationLister.Configurations(r.Namespace).Get(configName)
-			if err != nil {
-				// The config might not exist (yet). The informers will notify if it gets created.
-				continue
-			}
-
-			configs.Insert(configName)
-
-			// If the target is for the latest revision, add the latest created revision to the list
-			// so that there is a smooth transition when the new revision becomes ready.
-			if config.Status.LatestCreatedRevisionName != "" && tt.LatestRevision != nil && *tt.LatestRevision {
-				revisions.Insert(config.Status.LatestCreatedRevisionName)
-			}
-		}
-	}
-
-	// Clear old labels only after the route is fully resolved
-	if r.IsReady() || r.IsFailed() {
-		if err := deleteLabelForNotListed(ctx, r.Namespace, r.Name, racc, revisions); err != nil {
-			return err
-		}
-		if err := deleteLabelForNotListed(ctx, r.Namespace, r.Name, cacc, configs); err != nil {
-			return err
-		}
-	}
-
-	if err := setLabelForListed(ctx, r, racc, revisions); err != nil {
-		return err
-	}
-	return setLabelForListed(ctx, r, cacc, configs)
-}
-
-// ClearLabels removes any labels for a named route from given accessors.
-func ClearLabels(ctx context.Context, ns, name string, accs ...Accessor) error {
-	for _, acc := range accs {
-		if err := deleteLabelForNotListed(ctx, ns, name, acc, nil /*none listed*/); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// setLabelForListed uses the accessor to attach the label for this route to every element
-// listed within "names" in the same namespace.
-func setLabelForListed(ctx context.Context, route *v1.Route, acc Accessor, names sets.String) error {
-	for name := range names {
-		elt, err := acc.get(ctx, route.Namespace, name)
-		if err != nil {
-			return err
-		}
-		routeName, ok := elt.GetLabels()[serving.RouteLabelKey]
-		if ok {
-			if routeName != route.Name {
-				return fmt.Errorf("%s %q is already in use by %q, and cannot be used by %q",
-					elt.GroupVersionKind(), elt.GetName(), routeName, route.Name)
-			}
-		} else {
-			if err := setRouteLabel(ctx, acc, elt, &route.Name); err != nil {
-				return fmt.Errorf("failed to add route label to %s %q: %w",
-					elt.GroupVersionKind(), elt.GetName(), err)
-			}
-		}
-	}
-
-	return nil
-}
-
-// deleteLabelForNotListed uses the accessor to delete the label from any listable entity that is
-// not named within our list.  Unlike setLabelForListed, this function takes ns/name instead of a
-// Route so that it can clean things up when a Route ceases to exist.
-func deleteLabelForNotListed(ctx context.Context, ns, name string, acc Accessor, names sets.String) error {
-	oldList, err := acc.list(ctx, ns, name)
-	if err != nil {
-		return err
-	}
-
-	// Delete label for newly removed traffic targets.
-	for _, elt := range oldList {
-		if names.Has(elt.GetName()) {
-			continue
-		}
-
-		if err := setRouteLabel(ctx, acc, elt, nil); err != nil {
-			return fmt.Errorf("failed to remove route label to %s %q: %w",
-				elt.GroupVersionKind(), elt.GetName(), err)
-		}
-	}
-
-	return nil
-}
-
-// setRouteLabel toggles the route label on the specified element through the provided accessor.
-// a nil route name will cause the route label to be deleted, and a non-nil route will cause
-// that route name to be attached to the element.
-func setRouteLabel(ctx context.Context, acc Accessor, elt kmeta.Accessor, routeName *string) error {
-	mergePatch := map[string]interface{}{
-		"metadata": map[string]interface{}{
-			"labels": map[string]interface{}{
-				serving.RouteLabelKey: routeName,
-			},
-		},
-	}
-
-	patch, err := json.Marshal(mergePatch)
-	if err != nil {
-		return err
-	}
-
-	return acc.patch(ctx, elt.GetNamespace(), elt.GetName(), types.MergePatchType, patch)
-}
-
-func ref(namespace, name, kind string) tracker.Reference {
-	apiVersion, kind := v1.SchemeGroupVersion.WithKind(kind).ToAPIVersionAndKind()
-	return tracker.Reference{
-		APIVersion: apiVersion,
-		Kind:       kind,
-		Name:       name,
-		Namespace:  namespace,
-	}
-}
diff --git a/pkg/reconciler/labeler/v2/accessors.go b/pkg/reconciler/labeler/v2/accessors.go
index e55b3601d..2eed2d400 100644
--- a/pkg/reconciler/labeler/v2/accessors.go
+++ b/pkg/reconciler/labeler/v2/accessors.go
@@ -141,7 +141,7 @@ func updateRouteAnnotation(acc kmeta.Accessor, routeName string, diffAnn map[str
 }
 
 // list implements Accessor
-func (r *Revision) list(ctx context.Context, ns, routeName string, state v1.RoutingState) ([]kmeta.Accessor, error) {
+func (r *Revision) list(_ context.Context, ns, routeName string, state v1.RoutingState) ([]kmeta.Accessor, error) {
 	kl := make([]kmeta.Accessor, 0, 1)
 	filter := func(m interface{}) {
 		r := m.(*v1.Revision)
@@ -202,7 +202,7 @@ func NewConfigurationAccessor(
 }
 
 // list implements Accessor
-func (c *Configuration) list(ctx context.Context, ns, routeName string, state v1.RoutingState) ([]kmeta.Accessor, error) {
+func (c *Configuration) list(_ context.Context, ns, routeName string, state v1.RoutingState) ([]kmeta.Accessor, error) {
 	kl := make([]kmeta.Accessor, 0, 1)
 	filter := func(m interface{}) {
 		c := m.(*v1.Configuration)
diff --git a/pkg/reconciler/metric/metric.go b/pkg/reconciler/metric/metric.go
index b1c491397..6c654a9ee 100644
--- a/pkg/reconciler/metric/metric.go
+++ b/pkg/reconciler/metric/metric.go
@@ -36,7 +36,7 @@ type reconciler struct {
 var _ metricreconciler.Interface = (*reconciler)(nil)
 
 // ReconcileKind implements Interface.ReconcileKind.
-func (r *reconciler) ReconcileKind(ctx context.Context, metric *v1alpha1.Metric) pkgreconciler.Event {
+func (r *reconciler) ReconcileKind(_ context.Context, metric *v1alpha1.Metric) pkgreconciler.Event {
 	if err := r.collector.CreateOrUpdate(metric); err != nil {
 		switch {
 		case errors.Is(err, metrics.ErrFailedGetEndpoints):
diff --git a/pkg/reconciler/route/reconcile_resources.go b/pkg/reconciler/route/reconcile_resources.go
index 109e38baa..da5b2afec 100644
--- a/pkg/reconciler/route/reconcile_resources.go
+++ b/pkg/reconciler/route/reconcile_resources.go
@@ -19,7 +19,6 @@ package route
 import (
 	"context"
 	"encoding/json"
-	"errors"
 	"fmt"
 
 	"github.com/davecgh/go-spew/spew"
@@ -29,17 +28,14 @@ import (
 	"k8s.io/apimachinery/pkg/api/equality"
 	apierrs "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/apimachinery/pkg/util/sets"
 
 	"knative.dev/networking/pkg/apis/networking"
 	netv1alpha1 "knative.dev/networking/pkg/apis/networking/v1alpha1"
-	"knative.dev/pkg/apis/duck"
 	"knative.dev/pkg/controller"
 	"knative.dev/pkg/kmeta"
 	"knative.dev/pkg/logging"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
-	"knative.dev/serving/pkg/reconciler/route/config"
 	"knative.dev/serving/pkg/reconciler/route/resources"
 	"knative.dev/serving/pkg/reconciler/route/resources/names"
 	"knative.dev/serving/pkg/reconciler/route/traffic"
@@ -210,56 +206,6 @@ func (c *Reconciler) updatePlaceholderServices(ctx context.Context, route *v1.Ro
 	return eg.Wait()
 }
 
-// Update the lastPinned annotation on revisions we target so they don't get GC'd.
-func (c *Reconciler) reconcileTargetRevisions(ctx context.Context, t *traffic.Config, route *v1.Route) error {
-	gcConfig := config.FromContext(ctx).GC
-	logger := logging.FromContext(ctx)
-	lpDebounce := gcConfig.StaleRevisionLastpinnedDebounce
-
-	eg, egCtx := errgroup.WithContext(ctx)
-	for _, target := range t.Targets {
-		for _, rt := range target {
-			tt := rt.TrafficTarget
-			eg.Go(func() error {
-				rev, err := c.revisionLister.Revisions(route.Namespace).Get(tt.RevisionName)
-				if apierrs.IsNotFound(err) {
-					logger.Infof("Unable to update lastPinned for missing revision %q", tt.RevisionName)
-					return nil
-				} else if err != nil {
-					return err
-				}
-
-				newRev := rev.DeepCopy()
-
-				lastPin, err := newRev.GetLastPinned()
-				if err != nil {
-					// Missing is an expected error case for a not yet pinned revision.
-					var errLastPinned v1.LastPinnedParseError
-					if errors.As(err, &errLastPinned) && errLastPinned.Type != v1.AnnotationParseErrorTypeMissing {
-						return err
-					}
-				} else if lastPin.Add(lpDebounce).After(c.clock.Now()) {
-					// Enforce a delay before performing an update on lastPinned to avoid excess churn.
-					return nil
-				}
-
-				newRev.SetLastPinned(c.clock.Now())
-
-				patch, err := duck.CreateMergePatch(rev, newRev)
-				if err != nil {
-					return err
-				}
-
-				if _, err := c.client.ServingV1().Revisions(route.Namespace).Patch(egCtx, rev.Name, types.MergePatchType, patch, metav1.PatchOptions{}); err != nil {
-					return fmt.Errorf("failed to set revision annotation: %w", err)
-				}
-				return nil
-			})
-		}
-	}
-	return eg.Wait()
-}
-
 func serializeRollout(ctx context.Context, r *traffic.Rollout) string {
 	sr, err := json.Marshal(r)
 	if err != nil {
diff --git a/pkg/reconciler/route/route.go b/pkg/reconciler/route/route.go
index c149d4833..b25a2aa84 100644
--- a/pkg/reconciler/route/route.go
+++ b/pkg/reconciler/route/route.go
@@ -41,7 +41,6 @@ import (
 	pkgreconciler "knative.dev/pkg/reconciler"
 	"knative.dev/pkg/system"
 	"knative.dev/pkg/tracker"
-	cfgmap "knative.dev/serving/pkg/apis/config"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	clientset "knative.dev/serving/pkg/client/clientset/versioned"
 	routereconciler "knative.dev/serving/pkg/client/injection/reconciler/serving/v1/route"
@@ -127,14 +126,6 @@ func (c *Reconciler) ReconcileKind(ctx context.Context, r *v1.Route) pkgreconcil
 		return err
 	}
 
-	if config.FromContextOrDefaults(ctx).Features.ResponsiveRevisionGC != cfgmap.Enabled {
-		// In all cases we will add annotations to the referred targets.  This is so that when they become
-		// routable we can know (through a listener) and attempt traffic configuration again.
-		if err := c.reconcileTargetRevisions(ctx, traffic, r); err != nil {
-			return err
-		}
-	}
-
 	r.Status.Address = &duckv1.Addressable{
 		URL: &apis.URL{
 			Scheme: "http",
diff --git a/pkg/reconciler/service/resources/configuration.go b/pkg/reconciler/service/resources/configuration.go
index 7ec5d1811..6e5920765 100644
--- a/pkg/reconciler/service/resources/configuration.go
+++ b/pkg/reconciler/service/resources/configuration.go
@@ -23,7 +23,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"knative.dev/pkg/kmeta"
-	cfgmap "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/apis/serving"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	labelerv2 "knative.dev/serving/pkg/reconciler/labeler/v2"
@@ -32,28 +31,22 @@ import (
 
 // MakeConfiguration creates a Configuration from a Service object.
 func MakeConfiguration(service *v1.Service) (*v1.Configuration, error) {
-	return MakeConfigurationFromExisting(service, &v1.Configuration{}, cfgmap.Enabled)
+	return MakeConfigurationFromExisting(service, &v1.Configuration{})
 }
 
 // MakeConfigurationFromExisting creates a Configuration from a Service object given an existing Configuration.
-func MakeConfigurationFromExisting(service *v1.Service, existing *v1.Configuration, gc cfgmap.Flag) (*v1.Configuration, error) {
+func MakeConfigurationFromExisting(service *v1.Service, existing *v1.Configuration) (*v1.Configuration, error) {
 	labels := map[string]string{serving.ServiceLabelKey: service.Name}
 	anns := kmeta.FilterMap(service.GetAnnotations(), func(key string) bool {
 		return key == corev1.LastAppliedConfigAnnotation
 	})
 
 	routeName := names.Route(service)
-	if gc != cfgmap.Enabled {
-		labels[serving.RouteLabelKey] = routeName
-	}
-
-	if gc != cfgmap.Disabled {
-		set := labelerv2.GetListAnnValue(existing.Annotations, serving.RoutesAnnotationKey)
-		if !set.Has(routeName) {
-			set.Insert(routeName)
-		}
-		anns[serving.RoutesAnnotationKey] = strings.Join(set.UnsortedList(), ",")
+	set := labelerv2.GetListAnnValue(existing.Annotations, serving.RoutesAnnotationKey)
+	if !set.Has(routeName) {
+		set.Insert(routeName)
 	}
+	anns[serving.RoutesAnnotationKey] = strings.Join(set.UnsortedList(), ",")
 
 	return &v1.Configuration{
 		ObjectMeta: metav1.ObjectMeta{
diff --git a/pkg/reconciler/service/service.go b/pkg/reconciler/service/service.go
index f21d57dd7..ca360ce91 100644
--- a/pkg/reconciler/service/service.go
+++ b/pkg/reconciler/service/service.go
@@ -34,7 +34,6 @@ import (
 	"knative.dev/pkg/kmp"
 	"knative.dev/pkg/logging"
 	pkgreconciler "knative.dev/pkg/reconciler"
-	cfgmap "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/apis/serving"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	listers "knative.dev/serving/pkg/client/listers/serving/v1"
@@ -185,8 +184,7 @@ func (c *Reconciler) checkRoutesNotReady(config *v1.Configuration, logger *zap.S
 }
 
 func (c *Reconciler) createConfiguration(ctx context.Context, service *v1.Service) (*v1.Configuration, error) {
-	gc := cfgmap.FromContextOrDefaults(ctx).Features.ResponsiveRevisionGC
-	cfg, err := resources.MakeConfigurationFromExisting(service, &v1.Configuration{}, gc)
+	cfg, err := resources.MakeConfiguration(service)
 	if err != nil {
 		return nil, err
 	}
@@ -214,8 +212,7 @@ func (c *Reconciler) reconcileConfiguration(ctx context.Context, service *v1.Ser
 	// We are setting the up-to-date default values here so an update won't be triggered if the only
 	// diff is the new default values.
 	existing.SetDefaults(ctx)
-	gc := cfgmap.FromContextOrDefaults(ctx).Features.ResponsiveRevisionGC
-	desiredConfig, err := resources.MakeConfigurationFromExisting(service, existing, gc)
+	desiredConfig, err := resources.MakeConfigurationFromExisting(service, existing)
 	if err != nil {
 		return nil, err
 	}
diff --git a/vendor/knative.dev/pkg/network/handlers/drain.go b/vendor/knative.dev/pkg/network/handlers/drain.go
index 42a6f25a6..75919578c 100644
--- a/vendor/knative.dev/pkg/network/handlers/drain.go
+++ b/vendor/knative.dev/pkg/network/handlers/drain.go
@@ -47,7 +47,7 @@ var newTimer = func(d time.Duration) timer {
 }
 
 // Drainer wraps an inner http.Handler to support responding to kubelet
-// probes with a "200 OK" until the handler is told to Drain.
+// probes and KProbes with a "200 OK" until the handler is told to Drain.
 // When the Drainer is told to Drain, it will immediately start to fail
 // probes with a "500 shutting down", and the call will block until no
 // requests have been received for QuietPeriod (defaults to
@@ -83,6 +83,14 @@ func (d *Drainer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		}
 		return
 	}
+	if network.IsKProbe(r) {
+		if d.draining() {
+			http.Error(w, "shutting down", http.StatusServiceUnavailable)
+		} else {
+			network.ServeKProbe(w, r)
+		}
+		return
+	}
 
 	d.reset()
 	d.Inner.ServeHTTP(w, r)
diff --git a/vendor/knative.dev/pkg/network/network.go b/vendor/knative.dev/pkg/network/network.go
index 66766266c..93e63399d 100644
--- a/vendor/knative.dev/pkg/network/network.go
+++ b/vendor/knative.dev/pkg/network/network.go
@@ -17,6 +17,7 @@ limitations under the License.
 package network
 
 import (
+	"fmt"
 	"net/http"
 	"strings"
 	"time"
@@ -54,6 +55,16 @@ const (
 	// included in request metrics.
 	ProbeHeaderName = "K-Network-Probe"
 
+	// ProbeHeaderValue is the value of a header that can be added to
+	// requests to probe the knative networking layer.  Requests
+	// with `K-Network-Probe` this value will not be passed to the user
+	// container or included in request metrics.
+	ProbeHeaderValue = "probe"
+
+	// HashHeaderName is the name of an internal header that Ingress controller
+	// uses to find out which version of the networking config is deployed.
+	HashHeaderName = "K-Network-Hash"
+
 	// Since K8s 1.8, prober requests have
 	//   User-Agent = "kube-probe/{major-version}.{minor-version}".
 	KubeProbeUAPrefix = "kube-probe/"
@@ -68,3 +79,19 @@ func IsKubeletProbe(r *http.Request) bool {
 	return strings.HasPrefix(r.Header.Get("User-Agent"), KubeProbeUAPrefix) ||
 		r.Header.Get(KubeletProbeHeaderName) != ""
 }
+
+// IsKProbe returns true if the request is a knatvie probe.
+func IsKProbe(r *http.Request) bool {
+	return r.Header.Get(ProbeHeaderName) == ProbeHeaderValue
+}
+
+// ServeKProbe serve KProbe requests.
+func ServeKProbe(w http.ResponseWriter, r *http.Request) {
+	hh := r.Header.Get(HashHeaderName)
+	if hh == "" {
+		http.Error(w, fmt.Sprintf("a probe request must contain a non-empty %q header", HashHeaderName), http.StatusBadRequest)
+		return
+	}
+	w.Header().Set(HashHeaderName, hh)
+	w.WriteHeader(http.StatusOK)
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 92a0cea0c..a048758de 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -976,7 +976,7 @@ knative.dev/caching/pkg/client/listers/caching/v1alpha1
 # knative.dev/hack v0.0.0-20201112185459-01a34c573bd8
 ## explicit
 knative.dev/hack
-# knative.dev/networking v0.0.0-20201116165202-57530ee4cbfc
+# knative.dev/networking v0.0.0-20201117050651-847f7830cf46
 ## explicit
 knative.dev/networking/config
 knative.dev/networking/pkg
@@ -1009,7 +1009,7 @@ knative.dev/networking/test/conformance/ingress
 knative.dev/networking/test/defaultsystem
 knative.dev/networking/test/test_images/grpc-ping/proto
 knative.dev/networking/test/types
-# knative.dev/pkg v0.0.0-20201116214403-188df22c59ac
+# knative.dev/pkg v0.0.0-20201117020252-ab1a398f669c
 ## explicit
 knative.dev/pkg/apiextensions/storageversion
 knative.dev/pkg/apiextensions/storageversion/cmd/migrate


Test patch:
diff --git a/pkg/activator/handler/handler_test.go b/pkg/activator/handler/handler_test.go
index ea35298e5..6c5a3efe1 100644
--- a/pkg/activator/handler/handler_test.go
+++ b/pkg/activator/handler/handler_test.go
@@ -64,7 +64,7 @@ type fakeThrottler struct {
 	err error
 }
 
-func (ft fakeThrottler) Try(ctx context.Context, f func(string) error) error {
+func (ft fakeThrottler) Try(_ context.Context, f func(string) error) error {
 	if ft.err != nil {
 		return ft.err
 	}
diff --git a/pkg/apis/config/features_test.go b/pkg/apis/config/features_test.go
index f0e5629ef..0ec3bf592 100644
--- a/pkg/apis/config/features_test.go
+++ b/pkg/apis/config/features_test.go
@@ -66,7 +66,6 @@ func TestFeaturesConfiguration(t *testing.T) {
 			PodSpecRuntimeClassName: Enabled,
 			PodSpecSecurityContext:  Enabled,
 			PodSpecTolerations:      Enabled,
-			ResponsiveRevisionGC:    Enabled,
 			TagHeaderBasedRouting:   Enabled,
 		}),
 		data: map[string]string{
@@ -242,24 +241,6 @@ func TestFeaturesConfiguration(t *testing.T) {
 		data: map[string]string{
 			"kubernetes.podspec-tolerations": "Disabled",
 		},
-	}, {
-		name:    "responsive-revision-gc Allowed",
-		wantErr: false,
-		wantFeatures: defaultWith(&Features{
-			ResponsiveRevisionGC: Allowed,
-		}),
-		data: map[string]string{
-			"responsive-revision-gc": "Allowed",
-		},
-	}, {
-		name:    "responsive-revision-gc Enabled",
-		wantErr: false,
-		wantFeatures: defaultWith(&Features{
-			ResponsiveRevisionGC: Enabled,
-		}),
-		data: map[string]string{
-			"responsive-revision-gc": "Enabled",
-		},
 	}, {
 		name:    "security context Allowed",
 		wantErr: false,
diff --git a/pkg/apis/serving/v1/revision_helpers_test.go b/pkg/apis/serving/v1/revision_helpers_test.go
index a45b7f556..aeb5b699b 100644
--- a/pkg/apis/serving/v1/revision_helpers_test.go
+++ b/pkg/apis/serving/v1/revision_helpers_test.go
@@ -106,92 +106,18 @@ func TestIsActivationRequired(t *testing.T) {
 	}
 }
 
-func TestRevisionGetLastPinned(t *testing.T) {
-	cases := []struct {
-		name              string
-		annotations       map[string]string
-		expectTime        time.Time
-		setLastPinnedTime time.Time
-		expectErr         error
-	}{{
-		name: "Nil annotations",
-		expectErr: LastPinnedParseError{
-			Type: AnnotationParseErrorTypeMissing,
-		},
-	}, {
-		name:        "Empty map annotations",
-		annotations: map[string]string{},
-		expectErr: LastPinnedParseError{
-			Type: AnnotationParseErrorTypeMissing,
-		},
-	}, {
-		name:              "Empty map annotations - with set time",
-		annotations:       map[string]string{},
-		setLastPinnedTime: time.Unix(1000, 0),
-		expectTime:        time.Unix(1000, 0),
-	}, {
-		name:        "Invalid time",
-		annotations: map[string]string{serving.RevisionLastPinnedAnnotationKey: "abcd"},
-		expectErr: LastPinnedParseError{
-			Type:  AnnotationParseErrorTypeInvalid,
-			Value: "abcd",
-		},
-	}, {
-		name:        "Valid time",
-		annotations: map[string]string{serving.RevisionLastPinnedAnnotationKey: "10000"},
-		expectTime:  time.Unix(10000, 0),
-	}, {
-		name:              "Valid time empty annotations",
-		setLastPinnedTime: time.Unix(1000, 0),
-		expectTime:        time.Unix(1000, 0),
-	}}
-
-	for _, tc := range cases {
-		t.Run(tc.name, func(t *testing.T) {
-			rev := Revision{
-				ObjectMeta: metav1.ObjectMeta{
-					Annotations: tc.annotations,
-				},
-			}
-
-			if tc.setLastPinnedTime != (time.Time{}) {
-				rev.SetLastPinned(tc.setLastPinnedTime)
-			}
-
-			pt, err := rev.GetLastPinned()
-			failErr := func() {
-				t.Fatalf("Expected error %v got %v", tc.expectErr, err)
-			}
-
-			if tc.expectErr == nil {
-				if err != nil {
-					failErr()
-				}
-			} else {
-				if tc.expectErr.Error() != err.Error() {
-					failErr()
-				}
-			}
-
-			if tc.expectTime != pt {
-				t.Fatalf("Expected pin time %v got %v", tc.expectTime, pt)
-			}
-		})
-	}
-}
-
 func TestRevisionIsReachable(t *testing.T) {
 	tests := []struct {
 		name   string
 		labels map[string]string
 		want   bool
 	}{{
-		name:   "has route annotation",
-		labels: map[string]string{serving.RouteLabelKey: "the-route"},
+		name:   "has serving state label",
+		labels: map[string]string{serving.RoutingStateLabelKey: "active"},
 		want:   true,
 	}, {
 		name:   "empty route annotation",
-		labels: map[string]string{serving.RouteLabelKey: ""},
+		labels: map[string]string{serving.RoutingStateLabelKey: ""},
 		want:   false,
 	}, {
 		name:   "no route annotation",
diff --git a/pkg/gc/config_test.go b/pkg/gc/config_test.go
index e686b8e85..a4fc035e4 100644
--- a/pkg/gc/config_test.go
+++ b/pkg/gc/config_test.go
@@ -47,42 +47,16 @@ func TestOurConfig(t *testing.T) {
 	}, {
 		name: "with value overrides",
 		want: &Config{
-			StaleRevisionCreateDelay:        15 * time.Hour,
-			StaleRevisionTimeout:            14 * time.Hour,
-			StaleRevisionMinimumGenerations: 10,
-			StaleRevisionLastpinnedDebounce: 2*time.Hour + 30*time.Minute + 44*time.Second,
-			RetainSinceCreateTime:           17 * time.Hour,
-			RetainSinceLastActiveTime:       16 * time.Hour,
-			MinNonActiveRevisions:           5,
-			MaxNonActiveRevisions:           500,
+			RetainSinceCreateTime:     17 * time.Hour,
+			RetainSinceLastActiveTime: 16 * time.Hour,
+			MinNonActiveRevisions:     5,
+			MaxNonActiveRevisions:     500,
 		},
 		data: map[string]string{
-			"stale-revision-create-delay":        "15h",
-			"stale-revision-timeout":             "14h",
-			"stale-revision-minimum-generations": "10",
-			"stale-revision-lastpinned-debounce": "2h30m44s",
-			"retain-since-create-time":           "17h",
-			"retain-since-last-active-time":      "16h",
-			"min-non-active-revisions":           "5",
-			"max-non-active-revisions":           "500",
-		},
-	}, {
-		name: "invalid duration",
-		fail: true,
-		data: map[string]string{
-			"stale-revision-create-delay": "invalid",
-		},
-	}, {
-		name: "invalid negative minimum generation",
-		fail: true,
-		data: map[string]string{
-			"stale-revision-minimum-generations": "-1",
-		},
-	}, {
-		name: "invalid minimum generation",
-		fail: true,
-		data: map[string]string{
-			"stale-revision-minimum-generations": "invalid",
+			"retain-since-create-time":      "17h",
+			"retain-since-last-active-time": "16h",
+			"min-non-active-revisions":      "5",
+			"max-non-active-revisions":      "500",
 		},
 	}, {
 		name: "Invalid negative min stale",
@@ -157,23 +131,6 @@ func TestOurConfig(t *testing.T) {
 		data: map[string]string{
 			"max-non-active-revisions": disabled,
 		},
-	}, {
-		name: "below minimum timeout",
-		fail: false,
-		want: &Config{
-			StaleRevisionCreateDelay:        15 * time.Hour,
-			StaleRevisionTimeout:            15 * time.Hour,
-			StaleRevisionMinimumGenerations: 20,
-			StaleRevisionLastpinnedDebounce: 5 * time.Hour,
-			RetainSinceCreateTime:           48 * time.Hour,
-			RetainSinceLastActiveTime:       15 * time.Hour,
-			MinNonActiveRevisions:           20,
-			MaxNonActiveRevisions:           1000,
-		},
-		data: map[string]string{
-			"stale-revision-create-delay": "15h",
-			"stale-revision-timeout":      "1h",
-		},
 	}} {
 		t.Run(tt.name, func(t *testing.T) {
 			got, err := NewConfigFromConfigMapFunc(logtesting.TestContextWithLogger(t))(
diff --git a/pkg/gc/zz_generated.deepcopy_test.go b/pkg/gc/zz_generated.deepcopy_test.go
index 70f09a94e..a94eb9270 100644
--- a/pkg/gc/zz_generated.deepcopy_test.go
+++ b/pkg/gc/zz_generated.deepcopy_test.go
@@ -25,10 +25,10 @@ import (
 
 func TestDeepCopy(t *testing.T) {
 	src := Config{
-		StaleRevisionCreateDelay:        5 * time.Minute,
-		StaleRevisionTimeout:            5 * time.Minute,
-		StaleRevisionMinimumGenerations: 1,
-		StaleRevisionLastpinnedDebounce: 1 * time.Minute,
+		RetainSinceCreateTime:     5 * time.Minute,
+		RetainSinceLastActiveTime: 5 * time.Minute,
+		MinNonActiveRevisions:     1,
+		MaxNonActiveRevisions:     5,
 	}
 
 	if diff := cmp.Diff(src, *src.DeepCopy()); diff != "" {
@@ -39,10 +39,10 @@ func TestDeepCopy(t *testing.T) {
 func TestDeepCopyInto(t *testing.T) {
 	var dest Config
 	src := Config{
-		StaleRevisionCreateDelay:        5 * time.Minute,
-		StaleRevisionTimeout:            5 * time.Minute,
-		StaleRevisionMinimumGenerations: 1,
-		StaleRevisionLastpinnedDebounce: 1 * time.Minute,
+		RetainSinceCreateTime:     5 * time.Minute,
+		RetainSinceLastActiveTime: 5 * time.Minute,
+		MinNonActiveRevisions:     1,
+		MaxNonActiveRevisions:     5,
 	}
 
 	src.DeepCopyInto(&dest)
diff --git a/pkg/reconciler/configuration/configuration_test.go b/pkg/reconciler/configuration/configuration_test.go
index 3e167626f..675fa7941 100644
--- a/pkg/reconciler/configuration/configuration_test.go
+++ b/pkg/reconciler/configuration/configuration_test.go
@@ -37,7 +37,6 @@ import (
 	"knative.dev/pkg/controller"
 	"knative.dev/pkg/logging"
 	"knative.dev/pkg/ptr"
-	cfgmap "knative.dev/serving/pkg/apis/config"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	servingclient "knative.dev/serving/pkg/client/injection/client/fake"
 	configreconciler "knative.dev/serving/pkg/client/injection/reconciler/serving/v1/configuration"
@@ -69,18 +68,6 @@ func TestReconcile(t *testing.T) {
 	test(t)
 }
 
-func TestReconcileNewGCEnabled(t *testing.T) {
-	testClock = clock.NewFakeClock(time.Now())
-
-	c := &config.Config{
-		Features: &cfgmap.Features{
-			ResponsiveRevisionGC: cfgmap.Enabled,
-		},
-	}
-	testCtx = config.ToContext(context.Background(), c)
-	test(t)
-}
-
 func test(t *testing.T) {
 	retryAttempted := false
 	now := testClock.Now()
diff --git a/pkg/reconciler/configuration/resources/revision_test.go b/pkg/reconciler/configuration/resources/revision_test.go
index 2a365c531..aa1ab1179 100644
--- a/pkg/reconciler/configuration/resources/revision_test.go
+++ b/pkg/reconciler/configuration/resources/revision_test.go
@@ -27,10 +27,8 @@ import (
 	"k8s.io/apimachinery/pkg/util/clock"
 
 	"knative.dev/pkg/ptr"
-	cfgmap "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/apis/serving"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
-	"knative.dev/serving/pkg/reconciler/configuration/config"
 )
 
 var fakeCurTime = time.Unix(1e9, 0)
@@ -121,9 +119,11 @@ func TestMakeRevisions(t *testing.T) {
 		},
 		want: &v1.Revision{
 			ObjectMeta: metav1.ObjectMeta{
-				Namespace:   "with",
-				Name:        "labels-00100",
-				Annotations: map[string]string{},
+				Namespace: "with",
+				Name:      "labels-00100",
+				Annotations: map[string]string{
+					serving.RoutingStateModifiedAnnotationKey: v1.RoutingStateModifiedString(clock),
+				},
 				OwnerReferences: []metav1.OwnerReference{{
 					APIVersion:         v1.SchemeGroupVersion.String(),
 					Kind:               "Configuration",
@@ -135,6 +135,7 @@ func TestMakeRevisions(t *testing.T) {
 					serving.ConfigurationLabelKey:           "labels",
 					serving.ConfigurationGenerationLabelKey: "100",
 					serving.ServiceLabelKey:                 "",
+					serving.RoutingStateLabelKey:            "pending",
 					"foo":                                   "bar",
 					"baz":                                   "blah",
 				},
@@ -188,10 +189,12 @@ func TestMakeRevisions(t *testing.T) {
 					serving.ConfigurationLabelKey:           "annotations",
 					serving.ConfigurationGenerationLabelKey: "100",
 					serving.ServiceLabelKey:                 "",
+					serving.RoutingStateLabelKey:            "pending",
 				},
 				Annotations: map[string]string{
 					"foo": "bar",
 					"baz": "blah",
+					serving.RoutingStateModifiedAnnotationKey: v1.RoutingStateModifiedString(clock),
 				},
 			},
 			Spec: v1.RevisionSpec{
@@ -297,6 +300,7 @@ func TestMakeRevisions(t *testing.T) {
 					"serving.knative.dev/creator": "someone",
 					"foo":                         "bar",
 					"baz":                         "blah",
+					serving.RoutingStateModifiedAnnotationKey: v1.RoutingStateModifiedString(clock),
 				},
 				OwnerReferences: []metav1.OwnerReference{{
 					APIVersion:         v1.SchemeGroupVersion.String(),
@@ -309,6 +313,7 @@ func TestMakeRevisions(t *testing.T) {
 					serving.ConfigurationLabelKey:           "config",
 					serving.ConfigurationGenerationLabelKey: "10",
 					serving.ServiceLabelKey:                 "",
+					serving.RoutingStateLabelKey:            "pending",
 				},
 			},
 			Spec: v1.RevisionSpec{
@@ -323,29 +328,10 @@ func TestMakeRevisions(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.name, func(t *testing.T) {
-			ctx := context.Background()
-			ctx = enableResponsiveGC(ctx, test.responsiveGC)
-
-			got := MakeRevision(ctx, test.configuration, clock)
+			got := MakeRevision(context.Background(), test.configuration, clock)
 			if diff := cmp.Diff(test.want, got); diff != "" {
 				t.Error("MakeRevision (-want, +got) =", diff)
 			}
 		})
 	}
 }
-
-func enableResponsiveGC(ctx context.Context, enabled bool) context.Context {
-	flag := cfgmap.Disabled
-	if enabled {
-		flag = cfgmap.Enabled
-	}
-
-	defaultDefaults, _ := cfgmap.NewDefaultsConfigFromMap(map[string]string{})
-	c := &config.Config{
-		Features: &cfgmap.Features{
-			ResponsiveRevisionGC: flag,
-		},
-		Defaults: defaultDefaults,
-	}
-	return config.ToContext(ctx, c)
-}
diff --git a/pkg/reconciler/gc/config/store_test.go b/pkg/reconciler/gc/config/store_test.go
index 6b1f3051f..6ef71c76e 100644
--- a/pkg/reconciler/gc/config/store_test.go
+++ b/pkg/reconciler/gc/config/store_test.go
@@ -23,7 +23,6 @@ import (
 	"github.com/google/go-cmp/cmp"
 
 	logtesting "knative.dev/pkg/logging/testing"
-	apiconfig "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/gc"
 
 	. "knative.dev/pkg/configmap/testing"
@@ -47,11 +46,4 @@ func TestStoreLoadWithContext(t *testing.T) {
 			t.Error("Unexpected controller config (-want, +got):", diff)
 		}
 	})
-
-	t.Run("features", func(t *testing.T) {
-		expected, _ := apiconfig.NewFeaturesConfigFromConfigMap(featuresConfig)
-		if diff := cmp.Diff(expected, config.Features); diff != "" {
-			t.Error("Unexpected controller config (-want, +got):", diff)
-		}
-	})
 }
diff --git a/pkg/reconciler/gc/reconciler_test.go b/pkg/reconciler/gc/reconciler_test.go
index 39317262c..dd237d9c5 100644
--- a/pkg/reconciler/gc/reconciler_test.go
+++ b/pkg/reconciler/gc/reconciler_test.go
@@ -32,7 +32,6 @@ import (
 	"knative.dev/pkg/logging"
 	"knative.dev/pkg/ptr"
 	pkgrec "knative.dev/pkg/reconciler"
-	apiconfig "knative.dev/serving/pkg/apis/config"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	servingclient "knative.dev/serving/pkg/client/injection/client/fake"
 	configreconciler "knative.dev/serving/pkg/client/injection/reconciler/serving/v1/configuration"
@@ -59,7 +58,6 @@ var revisionSpec = v1.RevisionSpec{
 
 func TestGCReconcile(t *testing.T) {
 	now := time.Now()
-	tenMinutesAgo := now.Add(-10 * time.Minute)
 
 	old := now.Add(-11 * time.Minute)
 	older := now.Add(-12 * time.Minute)
@@ -69,90 +67,11 @@ func TestGCReconcile(t *testing.T) {
 		ConfigStore: &testConfigStore{
 			config: &config.Config{
 				RevisionGC: &gc.Config{
-					// v1 settings
-					StaleRevisionCreateDelay:        5 * time.Minute,
-					StaleRevisionTimeout:            5 * time.Minute,
-					StaleRevisionMinimumGenerations: 2,
-
-					// v2 settings
 					RetainSinceCreateTime:     5 * time.Minute,
 					RetainSinceLastActiveTime: 5 * time.Minute,
 					MinNonActiveRevisions:     1,
 					MaxNonActiveRevisions:     gc.Disabled,
 				},
-				Features: &apiconfig.Features{
-					ResponsiveRevisionGC: apiconfig.Disabled,
-				},
-			},
-		}}
-
-	table := TableTest{{
-		Name: "delete oldest, keep two V1",
-		Objects: []runtime.Object{
-			cfg("keep-two", "foo", 5556,
-				WithLatestCreated("5556"),
-				WithLatestReady("5556"),
-				WithConfigObservedGen),
-			rev("keep-two", "foo", 5554, MarkRevisionReady,
-				WithRevName("5554"),
-				WithCreationTimestamp(oldest),
-				WithLastPinned(tenMinutesAgo)),
-			rev("keep-two", "foo", 5555, MarkRevisionReady,
-				WithRevName("5555"),
-				WithCreationTimestamp(older),
-				WithLastPinned(tenMinutesAgo)),
-			rev("keep-two", "foo", 5556, MarkRevisionReady,
-				WithRevName("5556"),
-				WithCreationTimestamp(old),
-				WithLastPinned(tenMinutesAgo)),
-		},
-		WantDeletes: []clientgotesting.DeleteActionImpl{{
-			ActionImpl: clientgotesting.ActionImpl{
-				Namespace: "foo",
-				Verb:      "delete",
-				Resource:  v1.SchemeGroupVersion.WithResource("revisions"),
-			},
-			Name: "5554",
-		}},
-		Key: "foo/keep-two",
-	}}
-
-	table.Test(t, MakeFactory(func(ctx context.Context, listers *Listers, cmw configmap.Watcher) controller.Reconciler {
-		r := &reconciler{
-			client:         servingclient.Get(ctx),
-			revisionLister: listers.GetRevisionLister(),
-		}
-		return configreconciler.NewReconciler(ctx, logging.FromContext(ctx),
-			servingclient.Get(ctx), listers.GetConfigurationLister(),
-			controller.GetEventRecorder(ctx), r, controllerOpts)
-	}))
-}
-
-func TestGCReconcileV2(t *testing.T) {
-	now := time.Now()
-
-	old := now.Add(-11 * time.Minute)
-	older := now.Add(-12 * time.Minute)
-	oldest := now.Add(-13 * time.Minute)
-
-	controllerOpts := controller.Options{
-		ConfigStore: &testConfigStore{
-			config: &config.Config{
-				RevisionGC: &gc.Config{
-					// v1 settings
-					StaleRevisionCreateDelay:        5 * time.Minute,
-					StaleRevisionTimeout:            5 * time.Minute,
-					StaleRevisionMinimumGenerations: 2,
-
-					// v2 settings
-					RetainSinceCreateTime:     5 * time.Minute,
-					RetainSinceLastActiveTime: 5 * time.Minute,
-					MinNonActiveRevisions:     1,
-					MaxNonActiveRevisions:     gc.Disabled,
-				},
-				Features: &apiconfig.Features{
-					ResponsiveRevisionGC: apiconfig.Enabled,
-				},
 			},
 		}}
 
diff --git a/pkg/reconciler/gc/v1/gc_test.go b/pkg/reconciler/gc/v1/gc_test.go
deleted file mode 100644
index daad61dac..000000000
--- a/pkg/reconciler/gc/v1/gc_test.go
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
-Copyright 2020 The Knative Authors
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1
-
-import (
-	"context"
-	"fmt"
-	"testing"
-	"time"
-
-	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/util/clock"
-	clientgotesting "k8s.io/client-go/testing"
-	duckv1 "knative.dev/pkg/apis/duck/v1"
-	"knative.dev/pkg/ptr"
-	pkgrec "knative.dev/pkg/reconciler"
-	v1 "knative.dev/serving/pkg/apis/serving/v1"
-	fakeservingclient "knative.dev/serving/pkg/client/injection/client/fake"
-	fakerevisioninformer "knative.dev/serving/pkg/client/injection/informers/serving/v1/revision/fake"
-	gcconfig "knative.dev/serving/pkg/gc"
-	"knative.dev/serving/pkg/reconciler/configuration/resources"
-	"knative.dev/serving/pkg/reconciler/gc/config"
-
-	_ "knative.dev/serving/pkg/client/injection/informers/serving/v1/configuration/fake"
-
-	. "knative.dev/pkg/reconciler/testing"
-	. "knative.dev/serving/pkg/testing/v1"
-)
-
-var revisionSpec = v1.RevisionSpec{
-	PodSpec: corev1.PodSpec{
-		Containers: []corev1.Container{{
-			Image: "busybox",
-		}},
-	},
-	TimeoutSeconds: ptr.Int64(60),
-}
-
-func TestCollect(t *testing.T) {
-	now := time.Now()
-	tenMinutesAgo := now.Add(-10 * time.Minute)
-
-	old := now.Add(-11 * time.Minute)
-	older := now.Add(-12 * time.Minute)
-	oldest := now.Add(-13 * time.Minute)
-
-	cfgMap := &config.Config{
-		RevisionGC: &gcconfig.Config{
-			StaleRevisionCreateDelay:        5 * time.Minute,
-			StaleRevisionTimeout:            5 * time.Minute,
-			StaleRevisionMinimumGenerations: 2,
-		},
-	}
-	ctx, _ := SetupFakeContext(t)
-	ctx = config.ToContext(ctx, cfgMap)
-
-	table := []struct {
-		name        string
-		cfg         *v1.Configuration
-		revs        []*v1.Revision
-		wantDeletes []clientgotesting.DeleteActionImpl
-	}{{
-		name: "delete oldest, keep two",
-		cfg: cfg("keep-two", "foo", 5556,
-			WithLatestCreated("5556"),
-			WithLatestReady("5556"),
-			WithConfigObservedGen),
-		revs: []*v1.Revision{
-			rev(ctx, "keep-two", "foo", 5554, MarkRevisionReady,
-				WithRevName("5554"),
-				WithCreationTimestamp(oldest),
-				WithLastPinned(tenMinutesAgo)),
-			rev(ctx, "keep-two", "foo", 5555, MarkRevisionReady,
-				WithRevName("5555"),
-				WithCreationTimestamp(older),
-				WithLastPinned(tenMinutesAgo)),
-			rev(ctx, "keep-two", "foo", 5556, MarkRevisionReady,
-				WithRevName("5556"),
-				WithCreationTimestamp(old),
-				WithLastPinned(tenMinutesAgo)),
-		},
-		wantDeletes: []clientgotesting.DeleteActionImpl{{
-			ActionImpl: clientgotesting.ActionImpl{
-				Namespace: "foo",
-				Verb:      "delete",
-				Resource:  v1.SchemeGroupVersion.WithResource("revisions"),
-			},
-			Name: "5554",
-		}},
-	}, {
-		name: "keep oldest when no lastPinned",
-		cfg: cfg("keep-no-last-pinned", "foo", 5556,
-			WithLatestCreated("5556"),
-			WithLatestReady("5556"),
-			WithConfigObservedGen),
-		revs: []*v1.Revision{
-			// No lastPinned so we will keep this.
-			rev(ctx, "keep-no-last-pinned", "foo", 5554, MarkRevisionReady,
-				WithRevName("5554"),
-				WithCreationTimestamp(oldest)),
-			rev(ctx, "keep-no-last-pinned", "foo", 5555, MarkRevisionReady,
-				WithRevName("5555"),
-				WithCreationTimestamp(older),
-				WithLastPinned(tenMinutesAgo)),
-			rev(ctx, "keep-no-last-pinned", "foo", 5556, MarkRevisionReady,
-				WithRevName("5556"),
-				WithCreationTimestamp(old),
-				WithLastPinned(tenMinutesAgo)),
-		},
-	}, {
-		name: "keep recent lastPinned",
-		cfg: cfg("keep-recent-last-pinned", "foo", 5556,
-			WithLatestCreated("5556"),
-			WithLatestReady("5556"),
-			WithConfigObservedGen),
-		revs: []*v1.Revision{
-			rev(ctx, "keep-recent-last-pinned", "foo", 5554, MarkRevisionReady,
-				WithRevName("5554"),
-				WithCreationTimestamp(oldest),
-				// This is an indication that things are still routing here.
-				WithLastPinned(now)),
-			rev(ctx, "keep-recent-last-pinned", "foo", 5555, MarkRevisionReady,
-				WithRevName("5555"),
-				WithCreationTimestamp(older),
-				WithLastPinned(tenMinutesAgo)),
-			rev(ctx, "keep-recent-last-pinned", "foo", 5556, MarkRevisionReady,
-				WithRevName("5556"),
-				WithCreationTimestamp(old),
-				WithLastPinned(tenMinutesAgo)),
-		},
-	}, {
-		name: "keep LatestReadyRevision",
-		cfg: cfg("keep-two", "foo", 5556,
-			WithLatestReady("5554"),
-			// This comes after 'WithLatestReady' so the
-			// Configuration's 'Ready' Status is 'Unknown'
-			WithLatestCreated("5556"),
-			WithConfigObservedGen),
-		revs: []*v1.Revision{
-			// Create a revision where the LatestReady is 5554, but LatestCreated is 5556.
-			// We should keep LatestReady even if it is old.
-			rev(ctx, "keep-two", "foo", 5554, MarkRevisionReady,
-				WithRevName("5554"),
-				WithCreationTimestamp(oldest),
-				WithLastPinned(tenMinutesAgo)),
-			rev(ctx, "keep-two", "foo", 5555, // Not Ready
-				WithRevName("5555"),
-				WithCreationTimestamp(older),
-				WithLastPinned(tenMinutesAgo)),
-			rev(ctx, "keep-two", "foo", 5556, // Not Ready
-				WithRevName("5556"),
-				WithCreationTimestamp(old),
-				WithLastPinned(tenMinutesAgo)),
-		},
-	}, {
-		name: "keep stale revision because of minimum generations",
-		cfg: cfg("keep-all", "foo", 5554,
-			// Don't set the latest ready revision here
-			// since those by default are always retained
-			WithLatestCreated("keep-all"),
-			WithConfigObservedGen),
-		revs: []*v1.Revision{
-			rev(ctx, "keep-all", "foo", 5554,
-				WithRevName("keep-all"),
-				WithCreationTimestamp(oldest),
-				WithLastPinned(tenMinutesAgo)),
-		},
-	}}
-
-	for _, test := range table {
-		t.Run(test.name, func(t *testing.T) {
-			ctx, _ = SetupFakeContext(t)
-			ctx = config.ToContext(ctx, cfgMap)
-			client := fakeservingclient.Get(ctx)
-
-			ri := fakerevisioninformer.Get(ctx)
-			for _, rev := range test.revs {
-				ri.Informer().GetIndexer().Add(rev)
-			}
-
-			recorderList := ActionRecorderList{client}
-
-			Collect(ctx, client, ri.Lister(), test.cfg)
-
-			actions, err := recorderList.ActionsByVerb()
-			if err != nil {
-				t.Errorf("Error capturing actions by verb: %q", err)
-			}
-
-			for i, want := range test.wantDeletes {
-				if i >= len(actions.Deletes) {
-					t.Errorf("Missing delete: %#v", want)
-					continue
-				}
-				got := actions.Deletes[i]
-				if got.GetName() != want.GetName() {
-					t.Errorf("Unexpected delete[%d]: %#v", i, got)
-				}
-			}
-			if got, want := len(actions.Deletes), len(test.wantDeletes); got > want {
-				for _, extra := range actions.Deletes[want:] {
-					t.Errorf("Extra delete: %s/%s", extra.GetNamespace(), extra.GetName())
-				}
-			}
-		})
-	}
-}
-
-func TestIsRevisionStale(t *testing.T) {
-	curTime := time.Now()
-	staleTime := curTime.Add(-10 * time.Minute)
-
-	tests := []struct {
-		name      string
-		rev       *v1.Revision
-		latestRev string
-		want      bool
-	}{{
-		name: "fresh revision that was never pinned",
-		rev: &v1.Revision{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:              "myrev",
-				CreationTimestamp: metav1.NewTime(curTime),
-			},
-		},
-		want: false,
-	}, {
-		name: "stale revision that was never pinned w/ Ready status",
-		rev: &v1.Revision{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:              "myrev",
-				CreationTimestamp: metav1.NewTime(staleTime),
-			},
-			Status: v1.RevisionStatus{
-				Status: duckv1.Status{
-					Conditions: duckv1.Conditions{{
-						Type:   v1.RevisionConditionReady,
-						Status: "True",
-					}},
-				},
-			},
-		},
-		want: false,
-	}, {
-		name: "stale revision that was never pinned w/o Ready status",
-		rev: &v1.Revision{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:              "myrev",
-				CreationTimestamp: metav1.NewTime(staleTime),
-			},
-			Status: v1.RevisionStatus{
-				Status: duckv1.Status{
-					Conditions: duckv1.Conditions{{
-						Type:   v1.RevisionConditionReady,
-						Status: "Unknown",
-					}},
-				},
-			},
-		},
-		want: true,
-	}, {
-		name: "stale revision that was previously pinned",
-		rev: &v1.Revision{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:              "myrev",
-				CreationTimestamp: metav1.NewTime(staleTime),
-				Annotations: map[string]string{
-					"serving.knative.dev/lastPinned": fmt.Sprint(staleTime.Unix()),
-				},
-			},
-		},
-		want: true,
-	}, {
-		name: "fresh revision that was previously pinned",
-		rev: &v1.Revision{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:              "myrev",
-				CreationTimestamp: metav1.NewTime(staleTime),
-				Annotations: map[string]string{
-					"serving.knative.dev/lastPinned": fmt.Sprint(curTime.Unix()),
-				},
-			},
-		},
-		want: false,
-	}, {
-		name: "stale latest ready revision",
-		rev: &v1.Revision{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:              "myrev",
-				CreationTimestamp: metav1.NewTime(staleTime),
-				Annotations: map[string]string{
-					"serving.knative.dev/lastPinned": fmt.Sprint(staleTime.Unix()),
-				},
-			},
-		},
-		latestRev: "myrev",
-		want:      false,
-	}}
-
-	cfgStore := testConfigStore{
-		config: &config.Config{
-			RevisionGC: &gcconfig.Config{
-				StaleRevisionCreateDelay:        5 * time.Minute,
-				StaleRevisionTimeout:            5 * time.Minute,
-				StaleRevisionMinimumGenerations: 2,
-			},
-		},
-	}
-	ctx := cfgStore.ToContext(context.Background())
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			cfg := &v1.Configuration{
-				Status: v1.ConfigurationStatus{
-					ConfigurationStatusFields: v1.ConfigurationStatusFields{
-						LatestReadyRevisionName: test.latestRev,
-					},
-				},
-			}
-
-			got := isRevisionStale(ctx, test.rev, cfg)
-
-			if got != test.want {
-				t.Errorf("IsRevisionStale = %v want: %v", got, test.want)
-			}
-		})
-	}
-}
-
-func cfg(name, namespace string, generation int64, co ...ConfigOption) *v1.Configuration {
-	c := &v1.Configuration{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:       name,
-			Namespace:  namespace,
-			Generation: generation,
-		},
-		Spec: v1.ConfigurationSpec{
-			Template: v1.RevisionTemplateSpec{
-				Spec: *revisionSpec.DeepCopy(),
-			},
-		},
-	}
-	for _, opt := range co {
-		opt(c)
-	}
-	c.SetDefaults(context.Background())
-	return c
-}
-
-func rev(ctx context.Context, name, namespace string, generation int64, ro ...RevisionOption) *v1.Revision {
-	config := cfg(name, namespace, generation)
-	rev := resources.MakeRevision(ctx, config, clock.RealClock{})
-	rev.SetDefaults(context.Background())
-
-	for _, opt := range ro {
-		opt(rev)
-	}
-	return rev
-}
-
-type testConfigStore struct {
-	config *config.Config
-}
-
-func (t *testConfigStore) ToContext(ctx context.Context) context.Context {
-	return config.ToContext(ctx, t.config)
-}
-
-var _ pkgrec.ConfigStore = (*testConfigStore)(nil)
diff --git a/pkg/reconciler/gc/v2/gc_test.go b/pkg/reconciler/gc/v2/gc_test.go
index 1126bac35..6c7eea2b1 100644
--- a/pkg/reconciler/gc/v2/gc_test.go
+++ b/pkg/reconciler/gc/v2/gc_test.go
@@ -18,7 +18,6 @@ package v2
 
 import (
 	"context"
-	"fmt"
 	"testing"
 	"time"
 
@@ -490,30 +489,6 @@ func TestIsRevisionStale(t *testing.T) {
 			},
 		},
 		want: false,
-	}, {
-		name: "stale pinned time",
-		rev: &v1.Revision{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:              "myrev",
-				CreationTimestamp: metav1.NewTime(staleTime),
-				Annotations: map[string]string{
-					"serving.knative.dev/lastPinned": fmt.Sprint(staleTime.Unix()),
-				},
-			},
-		},
-		want: true,
-	}, {
-		name: "fresh pinned time",
-		rev: &v1.Revision{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:              "myrev",
-				CreationTimestamp: metav1.NewTime(staleTime),
-				Annotations: map[string]string{
-					"serving.knative.dev/lastPinned": fmt.Sprint(curTime.Unix()),
-				},
-			},
-		},
-		want: false,
 	}, {
 		name: "stale revisionStateModified",
 		rev: &v1.Revision{
diff --git a/pkg/reconciler/labeler/labeler_both_test.go b/pkg/reconciler/labeler/labeler_both_test.go
deleted file mode 100644
index 4cd6242a7..000000000
--- a/pkg/reconciler/labeler/labeler_both_test.go
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-Copyright 2020 The Knative Authors
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package labeler
-
-import (
-	"context"
-	"testing"
-
-	// Inject the fake informers that this controller needs.
-	servingclient "knative.dev/serving/pkg/client/injection/client/fake"
-	_ "knative.dev/serving/pkg/client/injection/informers/serving/v1/configuration/fake"
-	_ "knative.dev/serving/pkg/client/injection/informers/serving/v1/revision/fake"
-	_ "knative.dev/serving/pkg/client/injection/informers/serving/v1/route/fake"
-
-	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/util/clock"
-	clientgotesting "k8s.io/client-go/testing"
-	routereconciler "knative.dev/serving/pkg/client/injection/reconciler/serving/v1/route"
-
-	"knative.dev/pkg/configmap"
-	"knative.dev/pkg/controller"
-	"knative.dev/pkg/logging"
-	cfgmap "knative.dev/serving/pkg/apis/config"
-	v1 "knative.dev/serving/pkg/apis/serving/v1"
-
-	. "knative.dev/pkg/reconciler/testing"
-	labelerv1 "knative.dev/serving/pkg/reconciler/labeler/v1"
-	labelerv2 "knative.dev/serving/pkg/reconciler/labeler/v2"
-	. "knative.dev/serving/pkg/reconciler/testing/v1"
-	. "knative.dev/serving/pkg/testing/v1"
-)
-
-func TestV2ReconcileAllowed(t *testing.T) {
-	now := metav1.Now()
-	fakeTime := now.Time
-
-	table := TableTest{{
-		Name: "change configurations",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Allowed),
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "config-change", "new-config", WithRouteFinalizer),
-
-			rev("default", "old-config",
-				WithRevisionLabel("serving.knative.dev/route", "config-change"),
-				WithRevisionAnn("serving.knative.dev/routes", "config-change"),
-				WithRoutingState(v1.RoutingStateActive)),
-
-			simpleConfig("default", "new-config"),
-			rev("default", "new-config"),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			// v1 sync
-			patchRemoveLabel("default", rev("default", "old-config").Name,
-				"serving.knative.dev/route"),
-			patchAddLabel("default", rev("default", "new-config").Name, "serving.knative.dev/route", "config-change"),
-			patchAddLabel("default", "new-config", "serving.knative.dev/route", "config-change"),
-
-			// v2 sync
-			patchRemoveRouteAndServingStateLabel("default", rev("default", "old-config").Name, now.Time),
-			patchAddRouteAndServingStateLabel(
-				"default", rev("default", "new-config").Name, "config-change", now.Time),
-			patchAddRouteAnn("default", "new-config", "config-change"),
-		},
-		Key: "default/config-change",
-	}, {
-		Name: "failure while removing a rev annotation should return an error",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Allowed),
-		// Induce a failure during patching
-		WantErr: true,
-		WithReactors: []clientgotesting.ReactionFunc{
-			InduceFailure("patch", "revisions"),
-		},
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "add-label-failure", "new-config", WithRouteFinalizer),
-			simpleConfig("default", "new-config",
-				WithConfigLabel("serving.knative.dev/route", "add-label-failure")),
-			rev("default", "new-config"),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchAddLabel("default", rev("default", "new-config").Name,
-				"serving.knative.dev/route", "add-label-failure"),
-		},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeWarning, "InternalError",
-				`failed to add route label to /, Kind= "new-config-dbnfd": inducing failure for patch revisions`),
-		},
-		Key: "default/add-label-failure",
-	}}
-
-	table.Test(t, MakeFactory(func(ctx context.Context, listers *Listers, cmw configmap.Watcher) controller.Reconciler {
-		clock := clock.NewFakeClock(fakeTime)
-		client := servingclient.Get(ctx)
-		cLister := listers.GetConfigurationLister()
-		cIndexer := listers.IndexerFor(&v1.Configuration{})
-		rLister := listers.GetRevisionLister()
-		rIndexer := listers.IndexerFor(&v1.Revision{})
-		r := &Reconciler{
-			caccV1: labelerv1.NewConfigurationAccessor(client, &NullTracker{}, cLister),
-			caccV2: labelerv2.NewConfigurationAccessor(client, &NullTracker{}, cLister, cIndexer, clock),
-			raccV1: labelerv1.NewRevisionAccessor(client, &NullTracker{}, rLister),
-			raccV2: labelerv2.NewRevisionAccessor(client, &NullTracker{}, rLister, rIndexer, clock),
-		}
-
-		return routereconciler.NewReconciler(ctx, logging.FromContext(ctx), servingclient.Get(ctx),
-			listers.GetRouteLister(), controller.GetEventRecorder(ctx), r)
-	}))
-}
diff --git a/pkg/reconciler/labeler/labelerv1_test.go b/pkg/reconciler/labeler/labelerv1_test.go
deleted file mode 100644
index ad0337a7a..000000000
--- a/pkg/reconciler/labeler/labelerv1_test.go
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
-Copyright 2020 The Knative Authors
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package labeler
-
-import (
-	"context"
-	"fmt"
-	"testing"
-
-	// Inject the fake informers that this controller needs.
-	servingclient "knative.dev/serving/pkg/client/injection/client/fake"
-	_ "knative.dev/serving/pkg/client/injection/informers/serving/v1/configuration/fake"
-	_ "knative.dev/serving/pkg/client/injection/informers/serving/v1/revision/fake"
-	_ "knative.dev/serving/pkg/client/injection/informers/serving/v1/route/fake"
-
-	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/util/clock"
-	clientgotesting "k8s.io/client-go/testing"
-	routereconciler "knative.dev/serving/pkg/client/injection/reconciler/serving/v1/route"
-
-	"knative.dev/pkg/configmap"
-	"knative.dev/pkg/controller"
-	"knative.dev/pkg/logging"
-	cfgmap "knative.dev/serving/pkg/apis/config"
-	v1 "knative.dev/serving/pkg/apis/serving/v1"
-
-	. "knative.dev/pkg/reconciler/testing"
-	labelerv1 "knative.dev/serving/pkg/reconciler/labeler/v1"
-	labelerv2 "knative.dev/serving/pkg/reconciler/labeler/v2"
-	. "knative.dev/serving/pkg/reconciler/testing/v1"
-	. "knative.dev/serving/pkg/testing/v1"
-)
-
-func TestV1Reconcile(t *testing.T) {
-	now := metav1.Now()
-	fakeTime := now.Time
-
-	table := TableTest{{
-		Name: "bad workqueue key",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		// Make sure Reconcile handles bad keys.
-		Key: "too/many/parts",
-	}, {
-		Name: "key not found",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		// Make sure Reconcile handles good keys that don't exist.
-		Key: "foo/not-found",
-	}, {
-		Name: "label runLatest configuration",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "first-reconcile", "the-config"),
-			simpleConfig("default", "the-config"),
-			rev("default", "the-config"),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchAddFinalizerAction("default", "first-reconcile"),
-			patchAddLabel("default", rev("default", "the-config").Name,
-				"serving.knative.dev/route", "first-reconcile"),
-			patchAddLabel("default", "the-config", "serving.knative.dev/route", "first-reconcile"),
-		},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeNormal, "FinalizerUpdate", "Updated %q finalizers", "first-reconcile"),
-		},
-		Key: "default/first-reconcile",
-	}, {
-		Name: "label pinned revision",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		Objects: []runtime.Object{
-			pinnedRoute("default", "pinned-revision", "the-revision"),
-			simpleConfig("default", "the-config"),
-			rev("default", "the-config"),
-			rev("default", "the-config", WithRevName("the-revision")),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchAddFinalizerAction("default", "pinned-revision"),
-			patchAddLabel("default", "the-revision",
-				"serving.knative.dev/route", "pinned-revision"),
-			patchAddLabel("default", "the-config",
-				"serving.knative.dev/route", "pinned-revision"),
-		},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeNormal, "FinalizerUpdate", "Updated %q finalizers", "pinned-revision"),
-		},
-		Key: "default/pinned-revision",
-	}, {
-		Name: "steady state",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "steady-state", "the-config", WithRouteFinalizer),
-			simpleConfig("default", "the-config",
-				WithConfigLabel("serving.knative.dev/route", "steady-state")),
-			rev("default", "the-config",
-				WithRevisionLabel("serving.knative.dev/route", "steady-state")),
-		},
-		Key: "default/steady-state",
-	}, {
-		Name: "no ready revision",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "no-ready-revision", "the-config", WithStatusTraffic()),
-			simpleConfig("default", "the-config", WithLatestReady("")),
-			rev("default", "the-config"),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchAddFinalizerAction("default", "no-ready-revision"),
-			patchAddLabel("default", rev("default", "the-config").Name,
-				"serving.knative.dev/route", "no-ready-revision"),
-			patchAddLabel("default", "the-config",
-				"serving.knative.dev/route", "no-ready-revision"),
-		},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeNormal, "FinalizerUpdate", "Updated %q finalizers", "no-ready-revision"),
-		},
-		Key: "default/no-ready-revision",
-	}, {
-		Name: "transitioning route",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "transitioning-route", "old", WithRouteFinalizer,
-				WithSpecTraffic(configTraffic("new"))),
-			simpleConfig("default", "old",
-				WithConfigLabel("serving.knative.dev/route", "transitioning-route")),
-			rev("default", "old",
-				WithRevisionLabel("serving.knative.dev/route", "transitioning-route")),
-			simpleConfig("default", "new"),
-			rev("default", "new"),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchAddLabel("default", rev("default", "new").Name,
-				"serving.knative.dev/route", "transitioning-route"),
-			patchAddLabel("default", "new",
-				"serving.knative.dev/route", "transitioning-route"),
-		},
-		Key: "default/transitioning-route",
-	}, {
-		Name: "failure adding label (revision)",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		// Induce a failure during patching
-		WantErr: true,
-		WithReactors: []clientgotesting.ReactionFunc{
-			InduceFailure("patch", "revisions"),
-		},
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "add-label-failure", "the-config", WithRouteFinalizer),
-			simpleConfig("default", "the-config"),
-			rev("default", "the-config"),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchAddLabel("default", rev("default", "the-config").Name,
-				"serving.knative.dev/route", "add-label-failure"),
-		},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeWarning, "InternalError",
-				`failed to add route label to /, Kind= "the-config-dbnfd": inducing failure for patch revisions`),
-		},
-		Key: "default/add-label-failure",
-	}, {
-		Name: "failure adding label (configuration)",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		// Induce a failure during patching
-		WantErr: true,
-		WithReactors: []clientgotesting.ReactionFunc{
-			InduceFailure("patch", "configurations"),
-		},
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "add-label-failure", "the-config", WithRouteFinalizer),
-			simpleConfig("default", "the-config"),
-			rev("default", "the-config",
-				WithRevisionLabel("serving.knative.dev/route", "add-label-failure")),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchAddLabel("default", "the-config", "serving.knative.dev/route", "add-label-failure"),
-		},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeWarning, "InternalError",
-				`failed to add route label to /, Kind= "the-config": inducing failure for patch configurations`),
-		},
-		Key: "default/add-label-failure",
-	}, {
-		Name:    "label config with incorrect label",
-		Ctx:     setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		WantErr: true,
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "the-route", "the-config", WithRouteFinalizer),
-			simpleConfig("default", "the-config",
-				WithConfigLabel("serving.knative.dev/route", "another-route")),
-			rev("default", "the-config",
-				WithRevisionLabel("serving.knative.dev/route", "another-route")),
-		},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeWarning, "InternalError",
-				`/, Kind= "the-config-dbnfd" is already in use by "another-route", and cannot be used by "the-route"`),
-		},
-		Key: "default/the-route",
-	}, {
-		Name: "change configurations",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "config-change", "new-config", WithRouteFinalizer),
-			simpleConfig("default", "old-config",
-				WithConfigLabel("serving.knative.dev/route", "config-change")),
-			rev("default", "old-config",
-				WithRevisionLabel("serving.knative.dev/route", "config-change")),
-			simpleConfig("default", "new-config"),
-			rev("default", "new-config"),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchRemoveLabel("default", rev("default", "old-config").Name,
-				"serving.knative.dev/route"),
-			patchRemoveLabel("default", "old-config", "serving.knative.dev/route"),
-			patchAddLabel("default", rev("default", "new-config").Name,
-				"serving.knative.dev/route", "config-change"),
-			patchAddLabel("default", "new-config", "serving.knative.dev/route", "config-change"),
-		},
-		Key: "default/config-change",
-	}, {
-		Name: "update configuration",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "config-update", "the-config", WithRouteFinalizer),
-			simpleConfig("default", "the-config",
-				WithLatestCreated("the-config-ecoge"),
-				WithConfigLabel("serving.knative.dev/route", "config-update")),
-			rev("default", "the-config",
-				WithRevisionLabel("serving.knative.dev/route", "config-update")),
-			rev("default", "the-config",
-				WithRevName("the-config-ecoge")),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchAddLabel("default", "the-config-ecoge",
-				"serving.knative.dev/route", "config-update"),
-		},
-		Key: "default/config-update",
-	}, {
-		Name: "delete route",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "delete-route", "the-config", WithRouteFinalizer, WithRouteDeletionTimestamp(&now)),
-			simpleConfig("default", "the-config",
-				WithConfigLabel("serving.knative.dev/route", "delete-route")),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchRemoveLabel("default", "the-config", "serving.knative.dev/route"),
-			patchRemoveFinalizerAction("default", "delete-route"),
-		},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeNormal, "FinalizerUpdate", `Updated "delete-route" finalizers`),
-		},
-		Key: "default/delete-route",
-	}, {
-		Name:    "delete route failure",
-		Ctx:     setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		WantErr: true,
-		WithReactors: []clientgotesting.ReactionFunc{
-			InduceFailure("patch", "configurations"),
-		},
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "delete-route", "the-config", WithRouteFinalizer, WithRouteDeletionTimestamp(&now)),
-			simpleConfig("default", "the-config",
-				WithConfigLabel("serving.knative.dev/route", "delete-route")),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchRemoveLabel("default", "the-config", "serving.knative.dev/route"),
-		},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeWarning, "InternalError",
-				`failed to remove route label to /, Kind= "the-config": inducing failure for patch configurations`),
-		},
-		Key: "default/delete-route",
-	}, {
-		Name: "failure while removing a cfg annotation should return an error",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		// Induce a failure during patching
-		WantErr: true,
-		WithReactors: []clientgotesting.ReactionFunc{
-			InduceFailure("patch", "configurations"),
-		},
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "delete-label-failure", "new-config", WithRouteFinalizer),
-			simpleConfig("default", "old-config",
-				WithConfigLabel("serving.knative.dev/route", "delete-label-failure")),
-			simpleConfig("default", "new-config",
-				WithConfigLabel("serving.knative.dev/route", "delete-label-failure")),
-			rev("default", "new-config",
-				WithRevisionLabel("serving.knative.dev/route", "delete-label-failure")),
-			rev("default", "old-config"),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchRemoveLabel("default", "old-config", "serving.knative.dev/route"),
-		},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeWarning, "InternalError",
-				`failed to remove route label to /, Kind= "old-config": inducing failure for patch configurations`),
-		},
-		Key: "default/delete-label-failure",
-	}, {
-		Name: "failure while removing a rev annotation should return an error",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		// Induce a failure during patching
-		WantErr: true,
-		WithReactors: []clientgotesting.ReactionFunc{
-			InduceFailure("patch", "revisions"),
-		},
-		Objects: []runtime.Object{
-			simpleRunLatest("default", "delete-label-failure", "new-config", WithRouteFinalizer),
-			simpleConfig("default", "old-config",
-				WithConfigLabel("serving.knative.dev/route", "delete-label-failure")),
-			simpleConfig("default", "new-config",
-				WithConfigLabel("serving.knative.dev/route", "delete-label-failure")),
-			rev("default", "new-config",
-				WithRevisionLabel("serving.knative.dev/route", "delete-label-failure")),
-			rev("default", "old-config",
-				WithRevisionLabel("serving.knative.dev/route", "delete-label-failure")),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchRemoveLabel("default", rev("default", "old-config").Name,
-				"serving.knative.dev/route"),
-		},
-		WantEvents: []string{
-			Eventf(corev1.EventTypeWarning, "InternalError",
-				`failed to remove route label to /, Kind= "old-config-dbnfd": inducing failure for patch revisions`),
-		},
-		Key: "default/delete-label-failure",
-	}}
-
-	table.Test(t, MakeFactory(func(ctx context.Context, listers *Listers, cmw configmap.Watcher) controller.Reconciler {
-		ctx = setResponsiveGCFeature(ctx, cfgmap.Disabled)
-		clock := clock.NewFakeClock(fakeTime)
-		client := servingclient.Get(ctx)
-		cLister := listers.GetConfigurationLister()
-		cIndexer := listers.IndexerFor(&v1.Configuration{})
-		rLister := listers.GetRevisionLister()
-		rIndexer := listers.IndexerFor(&v1.Revision{})
-		r := &Reconciler{
-			caccV1: labelerv1.NewConfigurationAccessor(client, &NullTracker{}, cLister),
-			caccV2: labelerv2.NewConfigurationAccessor(client, &NullTracker{}, cLister, cIndexer, clock),
-			raccV1: labelerv1.NewRevisionAccessor(client, &NullTracker{}, rLister),
-			raccV2: labelerv2.NewRevisionAccessor(client, &NullTracker{}, rLister, rIndexer, clock),
-		}
-
-		return routereconciler.NewReconciler(ctx, logging.FromContext(ctx), servingclient.Get(ctx),
-			listers.GetRouteLister(), controller.GetEventRecorder(ctx), r)
-	}))
-}
-
-func patchRemoveLabel(namespace, name, key string) clientgotesting.PatchActionImpl {
-	return clientgotesting.PatchActionImpl{
-		Name:       name,
-		ActionImpl: clientgotesting.ActionImpl{Namespace: namespace},
-		Patch:      []byte(fmt.Sprintf(`{"metadata":{"labels":{%q:null}}}`, key)),
-	}
-}
-
-func patchAddLabel(namespace, name, key, value string) clientgotesting.PatchActionImpl {
-	return clientgotesting.PatchActionImpl{
-		Name:       name,
-		ActionImpl: clientgotesting.ActionImpl{Namespace: namespace},
-		Patch:      []byte(fmt.Sprintf(`{"metadata":{"labels":{%q:%q}}}`, key, value)),
-	}
-}
diff --git a/pkg/reconciler/labeler/labelerv2_test.go b/pkg/reconciler/labeler/labelerv2_test.go
index fceea3bd9..796afa0fa 100644
--- a/pkg/reconciler/labeler/labelerv2_test.go
+++ b/pkg/reconciler/labeler/labelerv2_test.go
@@ -46,8 +46,6 @@ import (
 	autoscalercfg "knative.dev/serving/pkg/autoscaler/config"
 
 	. "knative.dev/pkg/reconciler/testing"
-	"knative.dev/serving/pkg/reconciler/configuration/config"
-	labelerv1 "knative.dev/serving/pkg/reconciler/labeler/v1"
 	labelerv2 "knative.dev/serving/pkg/reconciler/labeler/v2"
 	. "knative.dev/serving/pkg/reconciler/testing/v1"
 	. "knative.dev/serving/pkg/testing/v1"
@@ -59,17 +57,14 @@ func TestV2Reconcile(t *testing.T) {
 
 	table := TableTest{{
 		Name: "bad workqueue key",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		// Make sure Reconcile handles bad keys.
 		Key: "too/many/parts",
 	}, {
 		Name: "key not found",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		// Make sure Reconcile handles good keys that don't exist.
 		Key: "foo/not-found",
 	}, {
 		Name: "label runLatest configuration",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		Objects: []runtime.Object{
 			simpleRunLatest("default", "first-reconcile", "the-config"),
 			simpleConfig("default", "the-config"),
@@ -87,7 +82,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/first-reconcile",
 	}, {
 		Name: "label pinned revision",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		Objects: []runtime.Object{
 			pinnedRoute("default", "pinned-revision", "the-revision"),
 			simpleConfig("default", "the-config"),
@@ -107,7 +101,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/pinned-revision",
 	}, {
 		Name: "steady state",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		Objects: []runtime.Object{
 			simpleRunLatest("default", "steady-state", "the-config", WithRouteFinalizer),
 			simpleConfig("default", "the-config",
@@ -120,7 +113,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/steady-state",
 	}, {
 		Name: "no ready revision",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		Objects: []runtime.Object{
 			simpleRunLatest("default", "no-ready-revision", "the-config", WithStatusTraffic()),
 			simpleConfig("default", "the-config", WithLatestReady("")),
@@ -139,7 +131,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/no-ready-revision",
 	}, {
 		Name: "transitioning route",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		Objects: []runtime.Object{
 			simpleRunLatest("default", "transitioning-route", "old", WithRouteFinalizer,
 				WithSpecTraffic(configTraffic("new"))),
@@ -160,7 +151,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/transitioning-route",
 	}, {
 		Name: "failure adding annotation (revision)",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		// Induce a failure during patching
 		WantErr: true,
 		WithReactors: []clientgotesting.ReactionFunc{
@@ -182,7 +172,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/add-label-failure",
 	}, {
 		Name: "failure adding annotation (configuration)",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		// Induce a failure during patching
 		WantErr: true,
 		WithReactors: []clientgotesting.ReactionFunc{
@@ -206,7 +195,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/add-label-failure",
 	}, {
 		Name: "delete route existing ann",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		Objects: []runtime.Object{
 			simpleRunLatest("default", "delete-route", "the-config", WithRouteFinalizer, WithRouteDeletionTimestamp(&now)),
 			simpleConfig("default", "the-config",
@@ -222,7 +210,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/delete-route",
 	}, {
 		Name: "change configurations",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		Objects: []runtime.Object{
 			simpleRunLatest("default", "config-change", "new-config", WithRouteFinalizer),
 			simpleConfig("default", "old-config",
@@ -243,7 +230,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/config-change",
 	}, {
 		Name: "update configuration",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		Objects: []runtime.Object{
 			simpleRunLatest("default", "config-update", "the-config", WithRouteFinalizer),
 			simpleConfig("default", "the-config",
@@ -262,7 +248,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/config-update",
 	}, {
 		Name: "delete route",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		Objects: []runtime.Object{
 			simpleRunLatest("default", "delete-route", "the-config", WithRouteFinalizer, WithRouteDeletionTimestamp(&now)),
 			simpleConfig("default", "the-config",
@@ -278,7 +263,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/delete-route",
 	}, {
 		Name:    "delete route failure",
-		Ctx:     setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		WantErr: true,
 		WithReactors: []clientgotesting.ReactionFunc{
 			InduceFailure("patch", "configurations"),
@@ -298,7 +282,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/delete-route",
 	}, {
 		Name: "failure while removing a cfg annotation should return an error",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		// Induce a failure during patching
 		WantErr: true,
 		WithReactors: []clientgotesting.ReactionFunc{
@@ -326,7 +309,6 @@ func TestV2Reconcile(t *testing.T) {
 		Key: "default/delete-label-failure",
 	}, {
 		Name: "failure while removing a rev annotation should return an error",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
 		// Induce a failure during patching
 		WantErr: true,
 		WithReactors: []clientgotesting.ReactionFunc{
@@ -362,9 +344,7 @@ func TestV2Reconcile(t *testing.T) {
 		rLister := listers.GetRevisionLister()
 		rIndexer := listers.IndexerFor(&v1.Revision{})
 		r := &Reconciler{
-			caccV1: labelerv1.NewConfigurationAccessor(client, &NullTracker{}, cLister),
 			caccV2: labelerv2.NewConfigurationAccessor(client, &NullTracker{}, cLister, cIndexer, clock),
-			raccV1: labelerv1.NewRevisionAccessor(client, &NullTracker{}, rLister),
 			raccV2: labelerv2.NewRevisionAccessor(client, &NullTracker{}, rLister, rIndexer, clock),
 		}
 
@@ -534,9 +514,3 @@ func TestNew(t *testing.T) {
 		t.Fatal("Expected NewController to return a non-nil value")
 	}
 }
-
-func setResponsiveGCFeature(ctx context.Context, flag cfgmap.Flag) context.Context {
-	c := config.FromContextOrDefaults(ctx)
-	c.Features.ResponsiveRevisionGC = flag
-	return config.ToContext(ctx, c)
-}
diff --git a/pkg/reconciler/revision/resources/imagecache_test.go b/pkg/reconciler/revision/resources/imagecache_test.go
index dc0345f4e..a1155a972 100644
--- a/pkg/reconciler/revision/resources/imagecache_test.go
+++ b/pkg/reconciler/revision/resources/imagecache_test.go
@@ -43,8 +43,7 @@ func TestMakeImageCache(t *testing.T) {
 				Namespace: "foo",
 				Name:      "bar",
 				Annotations: map[string]string{
-					"a":                                     "b",
-					serving.RevisionLastPinnedAnnotationKey: "c",
+					"a": "b",
 				},
 				UID: "1234",
 			},
@@ -98,8 +97,7 @@ func TestMakeImageCache(t *testing.T) {
 				Namespace: "foo",
 				Name:      "bar",
 				Annotations: map[string]string{
-					"a":                                     "b",
-					serving.RevisionLastPinnedAnnotationKey: "c",
+					"a": "b",
 				},
 				UID: "1234",
 			},
@@ -161,8 +159,7 @@ func TestMakeImageCache(t *testing.T) {
 				Namespace: "foo",
 				Name:      "bar",
 				Annotations: map[string]string{
-					"a":                                     "b",
-					serving.RevisionLastPinnedAnnotationKey: "c",
+					"a": "b",
 				},
 				UID: "1234",
 			},
diff --git a/pkg/reconciler/revision/resources/pa_test.go b/pkg/reconciler/revision/resources/pa_test.go
index 88ec41f03..a1290ebb1 100644
--- a/pkg/reconciler/revision/resources/pa_test.go
+++ b/pkg/reconciler/revision/resources/pa_test.go
@@ -44,11 +44,10 @@ func TestMakePA(t *testing.T) {
 					Name:      "bar",
 					UID:       "1234",
 					Labels: map[string]string{
-						serving.RouteLabelKey: "some-route",
+						serving.RoutingStateLabelKey: "active",
 					},
 					Annotations: map[string]string{
-						"a":                                     "b",
-						serving.RevisionLastPinnedAnnotationKey: "timeless",
+						"a": "b",
 					},
 				},
 				Spec: v1.RevisionSpec{
@@ -260,7 +259,7 @@ func TestMakePA(t *testing.T) {
 					Name:      "robin",
 					UID:       "4321",
 					Labels: map[string]string{
-						serving.RouteLabelKey: "asdf",
+						serving.RoutingStateLabelKey: "active",
 					},
 				},
 				Spec: v1.RevisionSpec{
diff --git a/pkg/reconciler/revision/table_test.go b/pkg/reconciler/revision/table_test.go
index b7d821d89..5f11ff0db 100644
--- a/pkg/reconciler/revision/table_test.go
+++ b/pkg/reconciler/revision/table_test.go
@@ -38,7 +38,6 @@ import (
 	tracingconfig "knative.dev/pkg/tracing/config"
 	asv1a1 "knative.dev/serving/pkg/apis/autoscaling/v1alpha1"
 	defaultconfig "knative.dev/serving/pkg/apis/config"
-	"knative.dev/serving/pkg/apis/serving"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	"knative.dev/serving/pkg/autoscaler/config/autoscalerconfig"
 	servingclient "knative.dev/serving/pkg/client/injection/client"
@@ -387,7 +386,7 @@ func TestReconcile(t *testing.T) {
 		Objects: []runtime.Object{
 			Revision("foo", "fix-mutated-pa",
 				WithK8sServiceName("ill-follow-the-sun"), WithLogURL, MarkRevisionReady,
-				WithRevisionLabel(serving.RouteLabelKey, "foo")),
+				WithRoutingState(v1.RoutingStateActive)),
 			pa("foo", "fix-mutated-pa", WithProtocolType(networking.ProtocolH2C),
 				WithTraffic, WithPASKSReady, WithScaleTargetInitialized, WithReachabilityReachable,
 				WithPAStatusService("fix-mutated-pa")),
@@ -400,7 +399,7 @@ func TestReconcile(t *testing.T) {
 				// When our reconciliation has to change the service
 				// we should see the following mutations to status.
 				WithK8sServiceName("fix-mutated-pa"),
-				WithRevisionLabel(serving.RouteLabelKey, "foo"), WithLogURL, MarkRevisionReady,
+				WithRoutingState(v1.RoutingStateActive), WithLogURL, MarkRevisionReady,
 				withDefaultContainerStatuses()),
 		}},
 		WantUpdates: []clientgotesting.UpdateActionImpl{{
diff --git a/pkg/reconciler/route/config/store_test.go b/pkg/reconciler/route/config/store_test.go
index 9de536ff2..c9b7b89d3 100644
--- a/pkg/reconciler/route/config/store_test.go
+++ b/pkg/reconciler/route/config/store_test.go
@@ -19,7 +19,6 @@ package config
 import (
 	"context"
 	"testing"
-	"time"
 
 	"github.com/google/go-cmp/cmp"
 	network "knative.dev/networking/pkg"
@@ -62,19 +61,6 @@ func TestStoreLoadWithContext(t *testing.T) {
 			t.Error("Unexpected controller config (-want, +got):", diff)
 		}
 	})
-
-	t.Run("gc invalid timeout", func(t *testing.T) {
-		gcConfig.Data["stale-revision-timeout"] = "1h"
-		expected, err := gc.NewConfigFromConfigMapFunc(ctx)(gcConfig)
-
-		if err != nil {
-			t.Error("Got error parsing gc config with invalid timeout:", err)
-		}
-
-		if expected.StaleRevisionTimeout != 15*time.Hour {
-			t.Errorf("Expected revision timeout of %v, got %v", 15*time.Hour, expected.StaleRevisionTimeout)
-		}
-	})
 }
 
 func TestStoreLoadWithContextOrDefaults(t *testing.T) {
diff --git a/pkg/reconciler/route/domains/domains_test.go b/pkg/reconciler/route/domains/domains_test.go
index 363fc0dcb..6cbcb39e7 100644
--- a/pkg/reconciler/route/domains/domains_test.go
+++ b/pkg/reconciler/route/domains/domains_test.go
@@ -19,7 +19,6 @@ package domains
 import (
 	"context"
 	"testing"
-	"time"
 
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
@@ -30,7 +29,6 @@ import (
 	network "knative.dev/networking/pkg"
 	"knative.dev/serving/pkg/apis/serving"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
-	"knative.dev/serving/pkg/gc"
 	"knative.dev/serving/pkg/reconciler/route/config"
 )
 
@@ -48,9 +46,6 @@ func testConfig() *config.Config {
 			DefaultIngressClass: "ingress-class-foo",
 			DomainTemplate:      network.DefaultDomainTemplate,
 		},
-		GC: &gc.Config{
-			StaleRevisionLastpinnedDebounce: 1 * time.Minute,
-		},
 	}
 }
 
diff --git a/pkg/reconciler/route/reconcile_resources_test.go b/pkg/reconciler/route/reconcile_resources_test.go
index e0f3426bf..b227c0722 100644
--- a/pkg/reconciler/route/reconcile_resources_test.go
+++ b/pkg/reconciler/route/reconcile_resources_test.go
@@ -18,9 +18,7 @@ package route
 
 import (
 	"context"
-	"errors"
 	"testing"
-	"time"
 
 	"github.com/google/go-cmp/cmp"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -29,11 +27,9 @@ import (
 	netv1alpha1 "knative.dev/networking/pkg/apis/networking/v1alpha1"
 	fakeingressinformer "knative.dev/networking/pkg/client/injection/informers/networking/v1alpha1/ingress/fake"
 	"knative.dev/pkg/ptr"
-	"knative.dev/serving/pkg/apis/serving"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	fakeservingclient "knative.dev/serving/pkg/client/injection/client/fake"
 	fakerevisioninformer "knative.dev/serving/pkg/client/injection/informers/serving/v1/revision/fake"
-	"knative.dev/serving/pkg/gc"
 	"knative.dev/serving/pkg/reconciler/route/config"
 	"knative.dev/serving/pkg/reconciler/route/traffic"
 
@@ -90,85 +86,14 @@ func TestReconcileIngressUpdate(t *testing.T) {
 	}
 }
 
-func TestReconcileTargetValidRevision(t *testing.T) {
-	var reconciler *Reconciler
-	ctx, _, _, _, cancel := newTestSetup(t, func(r *Reconciler) {
-		reconciler = r
-	})
-	defer cancel()
-
-	r := Route("test-ns", "test-route", WithRouteLabel(map[string]string{"route": "test-route"}))
-	rev := newTestRevision(r.Namespace, "revision")
-	tc := traffic.Config{Targets: map[string]traffic.RevisionTargets{
-		traffic.DefaultTarget: {{
-			TrafficTarget: v1.TrafficTarget{
-				RevisionName: "revision",
-				Percent:      ptr.Int64(100),
-			},
-		}}}}
-
-	ctx = config.ToContext(ctx, &config.Config{
-		GC: &gc.Config{
-			StaleRevisionLastpinnedDebounce: time.Minute,
-		},
-	})
-
-	fakeservingclient.Get(ctx).ServingV1().Revisions(r.Namespace).Create(ctx, rev, metav1.CreateOptions{})
-	fakerevisioninformer.Get(ctx).Informer().GetIndexer().Add(rev)
-
-	// Get timestamp before reconciling, so that we can compare this to the last pinned timestamp
-	// after reconciliation
-	beforeTimestamp, err := getLastPinnedTimestamp(t, rev)
-	if err != nil {
-		t.Fatal("Error getting last pinned:", err)
-	}
-
-	if err = reconciler.reconcileTargetRevisions(updateContext(ctx), &tc, r); err != nil {
-		t.Fatal("Error reconciling target revisions:", err)
-	}
-
-	// Verify last pinned annotation is updated correctly
-	newRev, err := fakeservingclient.Get(ctx).ServingV1().Revisions(r.Namespace).Get(ctx, rev.Name, metav1.GetOptions{})
-	if err != nil {
-		t.Fatal("Error getting revision:", err)
-	}
-	afterTimestamp, err := getLastPinnedTimestamp(t, newRev)
-	if err != nil {
-		t.Fatal("Error getting last pinned timestamps:", err)
-	}
-	if beforeTimestamp == afterTimestamp {
-		t.Fatal("The last pinned timestamp is not updated")
-	}
-}
-
 func TestReconcileRevisionTargetDoesNotExist(t *testing.T) {
-	var reconciler *Reconciler
-	ctx, _, _, _, cancel := newTestSetup(t, func(r *Reconciler) {
-		reconciler = r
-	})
+	ctx, _, _, _, cancel := newTestSetup(t)
 	defer cancel()
 
 	r := Route("test-ns", "test-route", WithRouteLabel(map[string]string{"route": "test-route"}))
 	rev := newTestRevision(r.Namespace, "revision")
-	tcInvalidRev := traffic.Config{Targets: map[string]traffic.RevisionTargets{
-		traffic.DefaultTarget: {{
-			TrafficTarget: v1.TrafficTarget{
-				RevisionName: "invalid-revision",
-				Percent:      ptr.Int64(100),
-			},
-		}}}}
-	ctx = config.ToContext(ctx, &config.Config{
-		GC: &gc.Config{
-			StaleRevisionLastpinnedDebounce: time.Minute,
-		},
-	})
 	fakeservingclient.Get(ctx).ServingV1().Revisions(r.Namespace).Create(ctx, rev, metav1.CreateOptions{})
 	fakerevisioninformer.Get(ctx).Informer().GetIndexer().Add(rev)
-
-	// Try reconciling target revisions for a revision that does not exist. No err should be returned
-	if err := reconciler.reconcileTargetRevisions(ctx, &tcInvalidRev, r); err != nil {
-		t.Fatal("Error reconciling target revisions:", err)
-	}
 }
 
 func newTestRevision(namespace, name string) *v1.Revision {
@@ -176,22 +101,11 @@ func newTestRevision(namespace, name string) *v1.Revision {
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      name,
 			Namespace: namespace,
-			Annotations: map[string]string{
-				serving.RevisionLastPinnedAnnotationKey: v1.RevisionLastPinnedString(time.Now().Add(-1 * time.Hour)),
-			},
 		},
 		Spec: v1.RevisionSpec{},
 	}
 }
 
-func getLastPinnedTimestamp(t *testing.T, rev *v1.Revision) (string, error) {
-	lastPinnedTime, ok := rev.Annotations[serving.RevisionLastPinnedAnnotationKey]
-	if !ok {
-		return "", errors.New("last pinned annotation not found")
-	}
-	return lastPinnedTime, nil
-}
-
 func testIngressParams(t *testing.T, r *v1.Route, trafficOpts ...func(tc *traffic.Config)) (*traffic.Config,
 	[]netv1alpha1.IngressTLS) {
 	tc := &traffic.Config{Targets: map[string]traffic.RevisionTargets{
diff --git a/pkg/reconciler/route/resources/service_test.go b/pkg/reconciler/route/resources/service_test.go
index 688e3a672..770a04624 100644
--- a/pkg/reconciler/route/resources/service_test.go
+++ b/pkg/reconciler/route/resources/service_test.go
@@ -19,7 +19,6 @@ package resources
 import (
 	"context"
 	"testing"
-	"time"
 
 	"github.com/google/go-cmp/cmp"
 
@@ -37,7 +36,6 @@ import (
 	apiConfig "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/apis/serving"
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
-	"knative.dev/serving/pkg/gc"
 	"knative.dev/serving/pkg/reconciler/route/config"
 	"knative.dev/serving/pkg/reconciler/route/traffic"
 
@@ -380,9 +378,6 @@ func testConfig() *config.Config {
 			DomainTemplate:      network.DefaultDomainTemplate,
 			TagTemplate:         network.DefaultTagTemplate,
 		},
-		GC: &gc.Config{
-			StaleRevisionLastpinnedDebounce: 1 * time.Minute,
-		},
 		Features: &apiConfig.Features{
 			MultiContainer:        apiConfig.Disabled,
 			PodSpecAffinity:       apiConfig.Disabled,
@@ -390,7 +385,6 @@ func testConfig() *config.Config {
 			PodSpecDryRun:         apiConfig.Enabled,
 			PodSpecNodeSelector:   apiConfig.Disabled,
 			PodSpecTolerations:    apiConfig.Disabled,
-			ResponsiveRevisionGC:  apiConfig.Disabled,
 			TagHeaderBasedRouting: apiConfig.Disabled,
 		},
 	}
diff --git a/pkg/reconciler/route/table_test.go b/pkg/reconciler/route/table_test.go
index 054439d1e..5c3e986fc 100644
--- a/pkg/reconciler/route/table_test.go
+++ b/pkg/reconciler/route/table_test.go
@@ -47,7 +47,6 @@ import (
 	v1 "knative.dev/serving/pkg/apis/serving/v1"
 	servingclient "knative.dev/serving/pkg/client/injection/client/fake"
 	routereconciler "knative.dev/serving/pkg/client/injection/reconciler/serving/v1/route"
-	"knative.dev/serving/pkg/gc"
 	kaccessor "knative.dev/serving/pkg/reconciler/accessor"
 	"knative.dev/serving/pkg/reconciler/route/config"
 	"knative.dev/serving/pkg/reconciler/route/resources"
@@ -1722,112 +1721,6 @@ func TestReconcile(t *testing.T) {
 	}))
 }
 
-func TestReconcileResponsiveGC(t *testing.T) {
-	table := TableTest{{
-		Name: "Update stale lastPinned",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Disabled),
-		Objects: []runtime.Object{
-			Route("default", "stale-lastpinned", WithConfigTarget("config"),
-				WithURL, WithAddress, WithRouteConditionsAutoTLSDisabled,
-				MarkTrafficAssigned, MarkIngressReady, WithRouteFinalizer,
-				WithRouteGeneration(1), WithRouteObservedGeneration,
-				WithStatusTraffic(
-					v1.TrafficTarget{
-						RevisionName:   "config-00001",
-						Percent:        ptr.Int64(100),
-						LatestRevision: ptr.Bool(true),
-					})),
-			cfg("default", "config",
-				WithConfigGeneration(1), WithLatestCreated("config-00001"), WithLatestReady("config-00001"),
-				// The Route controller attaches our label to this Configuration.
-				WithConfigLabel("serving.knative.dev/route", "stale-lastpinned"),
-			),
-			rev("default", "config", 1, MarkRevisionReady,
-				WithRevName("config-00001"),
-				WithLastPinned(fakeCurTime.Add(-10*time.Minute))),
-			simpleReadyIngress(
-				Route("default", "stale-lastpinned", WithConfigTarget("config"), WithURL),
-				&traffic.Config{
-					Targets: map[string]traffic.RevisionTargets{
-						traffic.DefaultTarget: {{
-							TrafficTarget: v1.TrafficTarget{
-								RevisionName:      "config-00001",
-								ConfigurationName: "config",
-								LatestRevision:    ptr.Bool(true),
-								Percent:           ptr.Int64(100),
-							},
-						}},
-					},
-				},
-			),
-			simpleK8sService(Route("default", "stale-lastpinned", WithConfigTarget("config"))),
-		},
-		WantPatches: []clientgotesting.PatchActionImpl{
-			patchLastPinned("default", "config-00001"),
-		},
-		Key: "default/stale-lastpinned",
-	}, {
-		Name: "lastPinned update disabled",
-		Ctx:  setResponsiveGCFeature(context.Background(), cfgmap.Enabled),
-		Objects: []runtime.Object{
-			Route("default", "stale-lastpinned", WithConfigTarget("config"),
-				WithURL, WithAddress, WithRouteConditionsAutoTLSDisabled,
-				MarkTrafficAssigned, MarkIngressReady, WithRouteFinalizer,
-				WithRouteGeneration(1), WithRouteObservedGeneration,
-				WithStatusTraffic(
-					v1.TrafficTarget{
-						RevisionName:   "config-00001",
-						Percent:        ptr.Int64(100),
-						LatestRevision: ptr.Bool(true),
-					})),
-			cfg("default", "config",
-				WithConfigGeneration(1), WithLatestCreated("config-00001"), WithLatestReady("config-00001"),
-				// The Route controller attaches our label to this Configuration.
-				WithConfigLabel("serving.knative.dev/route", "stale-lastpinned"),
-			),
-			rev("default", "config", 1, MarkRevisionReady,
-				WithRevName("config-00001")),
-			simpleReadyIngress(
-				Route("default", "stale-lastpinned", WithConfigTarget("config"), WithURL),
-				&traffic.Config{
-					Targets: map[string]traffic.RevisionTargets{
-						traffic.DefaultTarget: {{
-							TrafficTarget: v1.TrafficTarget{
-								ConfigurationName: "config",
-								LatestRevision:    ptr.Bool(true),
-								// Use the Revision name from the config.
-								RevisionName: "config-00001",
-								Percent:      ptr.Int64(100),
-							},
-						}},
-					},
-				},
-			),
-			simpleK8sService(Route("default", "stale-lastpinned", WithConfigTarget("config"))),
-		},
-		// WantPatches: Expecting no patch for when disabled.
-		Key: "default/stale-lastpinned",
-	}}
-
-	table.Test(t, MakeFactory(func(ctx context.Context, listers *Listers, cmw configmap.Watcher) controller.Reconciler {
-		r := &Reconciler{
-			kubeclient:          kubeclient.Get(ctx),
-			client:              servingclient.Get(ctx),
-			netclient:           networkingclient.Get(ctx),
-			configurationLister: listers.GetConfigurationLister(),
-			revisionLister:      listers.GetRevisionLister(),
-			serviceLister:       listers.GetK8sServiceLister(),
-			ingressLister:       listers.GetIngressLister(),
-			tracker:             ctx.Value(TrackerKey).(tracker.Interface),
-			clock:               FakeClock{Time: fakeCurTime},
-		}
-
-		return routereconciler.NewReconciler(ctx, logging.FromContext(ctx), servingclient.Get(ctx),
-			listers.GetRouteLister(), controller.GetEventRecorder(ctx), r,
-			controller.Options{ConfigStore: &testConfigStore{config: reconcilerTestConfig(false)}})
-	}))
-}
-
 func TestReconcileEnableAutoTLS(t *testing.T) {
 	table := TableTest{{
 		Name: "check that existing wildcard cert is used when creating a Route",
@@ -2636,24 +2529,10 @@ func mutateIngress(ci *netv1alpha1.Ingress) *netv1alpha1.Ingress {
 	return ci
 }
 
-func patchLastPinned(namespace, name string) clientgotesting.PatchActionImpl {
-	action := clientgotesting.PatchActionImpl{}
-	action.Name = name
-	action.Namespace = namespace
-	lastPinStr := v1.RevisionLastPinnedString(fakeCurTime)
-	patch := fmt.Sprintf(`{"metadata":{"annotations":{"serving.knative.dev/lastPinned":%q}}}`, lastPinStr)
-	action.Patch = []byte(patch)
-	return action
-}
-
 func rev(namespace, name string, generation int64, ro ...RevisionOption) *v1.Revision {
 	r := &v1.Revision{
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace: namespace,
-			Annotations: map[string]string{
-				"serving.knative.dev/lastPinned": v1.RevisionLastPinnedString(
-					fakeCurTime.Add(-1 * time.Second)),
-			},
 			OwnerReferences: []metav1.OwnerReference{{
 				APIVersion:         v1.SchemeGroupVersion.String(),
 				Kind:               "Configuration",
@@ -2697,9 +2576,6 @@ func reconcilerTestConfig(enableAutoTLS bool) *config.Config {
 			TagTemplate:             network.DefaultTagTemplate,
 			HTTPProtocol:            network.HTTPEnabled,
 		},
-		GC: &gc.Config{
-			StaleRevisionLastpinnedDebounce: 1 * time.Minute,
-		},
 		Features: &cfgmap.Features{
 			MultiContainer:        cfgmap.Disabled,
 			PodSpecAffinity:       cfgmap.Disabled,
@@ -2707,7 +2583,6 @@ func reconcilerTestConfig(enableAutoTLS bool) *config.Config {
 			PodSpecDryRun:         cfgmap.Enabled,
 			PodSpecNodeSelector:   cfgmap.Disabled,
 			PodSpecTolerations:    cfgmap.Disabled,
-			ResponsiveRevisionGC:  cfgmap.Disabled,
 			TagHeaderBasedRouting: cfgmap.Disabled,
 		},
 	}
@@ -2739,12 +2614,6 @@ func url(s string) *apis.URL {
 	return url
 }
 
-func setResponsiveGCFeature(ctx context.Context, flag cfgmap.Flag) context.Context {
-	c := cfgmap.FromContextOrDefaults(ctx)
-	c.Features.ResponsiveRevisionGC = flag
-	return cfgmap.ToContext(ctx, c)
-}
-
 func simpleRollout(cfg string, revs []traffic.RevisionRollout) IngressOption {
 	return func(i *netv1alpha1.Ingress) {
 		r := &traffic.Rollout{
diff --git a/pkg/reconciler/route/traffic/traffic_test.go b/pkg/reconciler/route/traffic/traffic_test.go
index 6f610d74c..828e7122b 100644
--- a/pkg/reconciler/route/traffic/traffic_test.go
+++ b/pkg/reconciler/route/traffic/traffic_test.go
@@ -22,7 +22,6 @@ import (
 	"fmt"
 	"os"
 	"testing"
-	"time"
 
 	"github.com/davecgh/go-spew/spew"
 	"github.com/google/go-cmp/cmp"
@@ -38,7 +37,6 @@ import (
 	fakeclientset "knative.dev/serving/pkg/client/clientset/versioned/fake"
 	informers "knative.dev/serving/pkg/client/informers/externalversions"
 	listers "knative.dev/serving/pkg/client/listers/serving/v1"
-	"knative.dev/serving/pkg/gc"
 	"knative.dev/serving/pkg/reconciler/route/config"
 	"knative.dev/serving/pkg/reconciler/route/domains"
 	. "knative.dev/serving/pkg/testing/v1"
@@ -1511,8 +1509,5 @@ func testNetworkConfig() *config.Config {
 			DomainTemplate:      network.DefaultDomainTemplate,
 			TagTemplate:         network.DefaultTagTemplate,
 		},
-		GC: &gc.Config{
-			StaleRevisionLastpinnedDebounce: 1 * time.Minute,
-		},
 	}
 }
diff --git a/pkg/reconciler/service/resources/configuration_test.go b/pkg/reconciler/service/resources/configuration_test.go
index 44fd87f15..34f955d43 100644
--- a/pkg/reconciler/service/resources/configuration_test.go
+++ b/pkg/reconciler/service/resources/configuration_test.go
@@ -21,10 +21,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 
-	cfgmap "knative.dev/serving/pkg/apis/config"
 	"knative.dev/serving/pkg/apis/serving"
-	v1 "knative.dev/serving/pkg/apis/serving/v1"
-	"knative.dev/serving/pkg/reconciler/service/resources/names"
 )
 
 func TestConfigurationSpec(t *testing.T) {
@@ -49,31 +46,6 @@ func TestConfigurationSpec(t *testing.T) {
 	}
 }
 
-func TestConfigurationSpecGCAllowed(t *testing.T) {
-	s := createService()
-	c, _ := MakeConfigurationFromExisting(s, &v1.Configuration{}, cfgmap.Allowed)
-	if got, want := c.Name, testServiceName; got != want {
-		t.Errorf("expected %q for service name got %q", want, got)
-	}
-	if got, want := c.Namespace, testServiceNamespace; got != want {
-		t.Errorf("expected %q for service namespace got %q", want, got)
-	}
-	if got, want := c.Spec.GetTemplate().Spec.GetContainer().Name, testContainerName; got != want {
-		t.Errorf("expected %q for container name got %q", want, got)
-	}
-	expectOwnerReferencesSetCorrectly(t, c.OwnerReferences)
-
-	if got, want := len(c.Labels), 2; got != want {
-		t.Errorf("expected %d labels got %d", want, got)
-	}
-	if got, want := c.Labels[serving.ServiceLabelKey], testServiceName; got != want {
-		t.Errorf("expected %q labels got %q", want, got)
-	}
-	if got, want := c.Annotations[serving.RoutesAnnotationKey], names.Route(s); got != want {
-		t.Errorf("expected %q route annotation got %q", want, got)
-	}
-}
-
 func TestConfigurationHasNoKubectlAnnotation(t *testing.T) {
 	s := createServiceWithKubectlAnnotation()
 	c, err := MakeConfiguration(s)
diff --git a/pkg/testing/v1/revision.go b/pkg/testing/v1/revision.go
index 7bd4f1248..409370408 100644
--- a/pkg/testing/v1/revision.go
+++ b/pkg/testing/v1/revision.go
@@ -87,13 +87,6 @@ func WithCreationTimestamp(t time.Time) RevisionOption {
 	}
 }
 
-// WithLastPinned updates the "last pinned" annotation to the provided timestamp.
-func WithLastPinned(t time.Time) RevisionOption {
-	return func(rev *v1.Revision) {
-		rev.SetLastPinned(t)
-	}
-}
-
 // WithRevisionPreserveAnnotation updates the annotation with preserve key.
 func WithRevisionPreserveAnnotation() RevisionOption {
 	return func(rev *v1.Revision) {
diff --git a/test/v1/revision.go b/test/v1/revision.go
index ea409f06a..8ebbdaa3e 100644
--- a/test/v1/revision.go
+++ b/test/v1/revision.go
@@ -80,14 +80,7 @@ func IsRevisionReady(r *v1.Revision) (bool, error) {
 // IsRevisionRoutingActive will check if the revision is actively routing to a route.
 func IsRevisionRoutingActive(r *v1.Revision) (bool, error) {
 	routingState := r.Labels[serving.RoutingStateLabelKey]
-	if v1.RoutingState(routingState) == v1.RoutingStateActive {
-		return true, nil
-	}
-
-	// TODO(whaught): remove this fallback as we remove the lastPinned annotation
-	// Fallback to lastPinned - this is needed for downgrade tests where the annotation still exists.
-	_, pinned := r.Annotations[serving.RevisionLastPinnedAnnotationKey]
-	return pinned, nil
+	return v1.RoutingState(routingState) == v1.RoutingStateActive, nil
 }
 
 // IsRevisionAtExpectedGeneration returns a function that will check if the annotations
diff --git a/third_party/cert-manager-latest/net-certmanager.yaml b/third_party/cert-manager-latest/net-certmanager.yaml
index 43bb920b1..66516ffac 100644
--- a/third_party/cert-manager-latest/net-certmanager.yaml
+++ b/third_party/cert-manager-latest/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: "v20201110-859a9fd"
+    serving.knative.dev/release: "v20201117-065c199"
     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: "v20201110-859a9fd"
+    serving.knative.dev/release: "v20201117-065c199"
 webhooks:
   - admissionReviewVersions:
       - v1beta1
@@ -86,7 +86,7 @@ metadata:
   name: net-certmanager-webhook-certs
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20201110-859a9fd"
+    serving.knative.dev/release: "v20201117-065c199"
 
 ---
 # Copyright 2020 The Knative Authors
@@ -109,7 +109,7 @@ metadata:
   name: config-certmanager
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20201110-859a9fd"
+    serving.knative.dev/release: "v20201117-065c199"
     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: "v20201110-859a9fd"
+    serving.knative.dev/release: "v20201117-065c199"
     networking.knative.dev/certificate-provider: cert-manager
 spec:
   selector:
@@ -168,14 +168,14 @@ spec:
         cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
       labels:
         app: networking-certmanager
-        serving.knative.dev/release: "v20201110-859a9fd"
+        serving.knative.dev/release: "v20201117-065c199"
     spec:
       serviceAccountName: controller
       containers:
         - name: networking-certmanager
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/controller@sha256:385ddbf5b1799b16cf6f0a1aed0b7f26fd2aabe017fb7f83a9632168bc9f7ed1
+          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/controller@sha256:ef1ebde73534b3f75886180887566f8b3d03855e8402e0e70bc519ebae9f8d5e
           resources:
             requests:
               cpu: 30m
@@ -213,7 +213,7 @@ kind: Service
 metadata:
   labels:
     app: networking-certmanager
-    serving.knative.dev/release: "v20201110-859a9fd"
+    serving.knative.dev/release: "v20201117-065c199"
     networking.knative.dev/certificate-provider: cert-manager
   name: networking-certmanager
   namespace: knative-serving
@@ -250,7 +250,7 @@ metadata:
   name: net-certmanager-webhook
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20201110-859a9fd"
+    serving.knative.dev/release: "v20201117-065c199"
 spec:
   selector:
     matchLabels:
@@ -263,14 +263,14 @@ spec:
       labels:
         app: net-certmanager-webhook
         role: net-certmanager-webhook
-        serving.knative.dev/release: "v20201110-859a9fd"
+        serving.knative.dev/release: "v20201117-065c199"
     spec:
       serviceAccountName: controller
       containers:
         - name: webhook
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/webhook@sha256:e6843cdc1adb80952c88946abad7e1eedca64cab7d6787adb7f82ad02bb72a7f
+          image: gcr.io/knative-nightly/knative.dev/net-certmanager/cmd/webhook@sha256:8d3716b5034e8222061d4818ff88246b34e6eaf52dfb188a9a2f7cee4629792a
           resources:
             requests:
               cpu: 20m
@@ -329,7 +329,7 @@ metadata:
   namespace: knative-serving
   labels:
     role: net-certmanager-webhook
-    serving.knative.dev/release: "v20201110-859a9fd"
+    serving.knative.dev/release: "v20201117-065c199"
 spec:
   ports:
     # Define metrics and profiling for them to be accessible within service meshes.
diff --git a/third_party/contour-latest/contour.yaml b/third_party/contour-latest/contour.yaml
index 62e0a8f5a..7e094a6c8 100644
--- a/third_party/contour-latest/contour.yaml
+++ b/third_party/contour-latest/contour.yaml
@@ -1482,7 +1482,7 @@ spec:
     spec:
       containers:
         - name: contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:f73508daff3d31f7f52101711b10a84d68c1ab420687335b21950681006e78f4
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:77ac49282a903f7f3979531f8cd75bf9aa7d0ccbc4585dcc4e461cb732be77f5
           imagePullPolicy: Always
           command:
             - contour
@@ -1709,7 +1709,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:f73508daff3d31f7f52101711b10a84d68c1ab420687335b21950681006e78f4
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:77ac49282a903f7f3979531f8cd75bf9aa7d0ccbc4585dcc4e461cb732be77f5
           imagePullPolicy: IfNotPresent
           name: contour
           ports:
@@ -1795,7 +1795,7 @@ spec:
           args:
             - envoy
             - shutdown-manager
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:f73508daff3d31f7f52101711b10a84d68c1ab420687335b21950681006e78f4
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:77ac49282a903f7f3979531f8cd75bf9aa7d0ccbc4585dcc4e461cb732be77f5
           imagePullPolicy: IfNotPresent
           lifecycle:
             preStop:
@@ -1871,7 +1871,7 @@ spec:
             - --envoy-key-file=/certs/tls.key
           command:
             - contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:f73508daff3d31f7f52101711b10a84d68c1ab420687335b21950681006e78f4
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:77ac49282a903f7f3979531f8cd75bf9aa7d0ccbc4585dcc4e461cb732be77f5
           imagePullPolicy: IfNotPresent
           name: envoy-initconfig
           volumeMounts:
@@ -3381,7 +3381,7 @@ spec:
     spec:
       containers:
         - name: contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:f73508daff3d31f7f52101711b10a84d68c1ab420687335b21950681006e78f4
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:77ac49282a903f7f3979531f8cd75bf9aa7d0ccbc4585dcc4e461cb732be77f5
           imagePullPolicy: Always
           command:
             - contour
@@ -3608,7 +3608,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:f73508daff3d31f7f52101711b10a84d68c1ab420687335b21950681006e78f4
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:77ac49282a903f7f3979531f8cd75bf9aa7d0ccbc4585dcc4e461cb732be77f5
           imagePullPolicy: IfNotPresent
           name: contour
           ports:
@@ -3694,7 +3694,7 @@ spec:
           args:
             - envoy
             - shutdown-manager
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:f73508daff3d31f7f52101711b10a84d68c1ab420687335b21950681006e78f4
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:77ac49282a903f7f3979531f8cd75bf9aa7d0ccbc4585dcc4e461cb732be77f5
           imagePullPolicy: IfNotPresent
           lifecycle:
             preStop:
@@ -3770,7 +3770,7 @@ spec:
             - --envoy-key-file=/certs/tls.key
           command:
             - contour
-          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:f73508daff3d31f7f52101711b10a84d68c1ab420687335b21950681006e78f4
+          image: gcr.io/knative-nightly/github.com/projectcontour/contour/cmd/contour@sha256:77ac49282a903f7f3979531f8cd75bf9aa7d0ccbc4585dcc4e461cb732be77f5
           imagePullPolicy: IfNotPresent
           name: envoy-initconfig
           volumeMounts:
diff --git a/third_party/contour-latest/net-contour.yaml b/third_party/contour-latest/net-contour.yaml
index 4c8ff5388..c4d0f2fb2 100644
--- a/third_party/contour-latest/net-contour.yaml
+++ b/third_party/contour-latest/net-contour.yaml
@@ -34,7 +34,7 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: contour
-    serving.knative.dev/release: "v20201114-2ae0c66f"
+    serving.knative.dev/release: "v20201117-0db0cb4c"
 data:
   _example: |
     ################################
@@ -105,7 +105,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:6a1866086c4ee0570306239ece6d0a95504042b50c081f39516247063f3e341a
+          image: gcr.io/knative-nightly/knative.dev/net-contour/cmd/controller@sha256:7624c3e445ba06ad75c4d427779d41e2bf82cdc8404bf3aefdaa4a58db3a5ab4
           resources:
             requests:
               cpu: 40m
diff --git a/third_party/istio-latest/net-istio.yaml b/third_party/istio-latest/net-istio.yaml
index fe5004350..341ce03d6 100644
--- a/third_party/istio-latest/net-istio.yaml
+++ b/third_party/istio-latest/net-istio.yaml
@@ -1,4 +1,4 @@
-# Generated when HEAD was cbc1a3d4e2ab6826fc042e3dad501c24d26dc327
+# Generated when HEAD was 7d1ed7ad8c91d140ebf046b099bba37c1f5cc412
 #
 # Copyright 2019 The Knative Authors
 #
@@ -20,7 +20,7 @@ metadata:
   # These are the permissions needed by the Istio Ingress implementation.
   name: knative-serving-istio
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     serving.knative.dev/controller: "true"
     networking.knative.dev/ingress-provider: istio
 rules:
@@ -50,7 +50,7 @@ metadata:
   name: knative-ingress-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -87,7 +87,7 @@ metadata:
   name: cluster-local-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -106,7 +106,7 @@ metadata:
   name: knative-local-gateway
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -125,7 +125,7 @@ metadata:
   name: knative-local-gateway
   namespace: istio-system
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 spec:
   type: ClusterIP
@@ -145,7 +145,7 @@ metadata:
   name: "webhook"
   namespace: "knative-serving"
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -160,7 +160,7 @@ metadata:
   name: "istio-webhook"
   namespace: "knative-serving"
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -189,7 +189,7 @@ kind: MutatingWebhookConfiguration
 metadata:
   name: webhook.istio.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 webhooks:
   - admissionReviewVersions:
@@ -225,7 +225,7 @@ kind: ValidatingWebhookConfiguration
 metadata:
   name: config.webhook.istio.networking.internal.knative.dev
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 webhooks:
   - admissionReviewVersions:
@@ -263,7 +263,7 @@ metadata:
   name: istio-webhook-certs
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 
 ---
@@ -287,7 +287,7 @@ metadata:
   name: config-istio
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 data:
   _example: |
@@ -357,7 +357,7 @@ metadata:
   name: networking-istio
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -373,14 +373,14 @@ spec:
         sidecar.istio.io/inject: "false"
       labels:
         app: networking-istio
-        serving.knative.dev/release: "v20201111-cbc1a3d4"
+        serving.knative.dev/release: "v20201117-7d1ed7ad"
     spec:
       serviceAccountName: controller
       containers:
         - name: networking-istio
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/controller@sha256:604660e3e300ae8e4ebb92724cefea9eb14d997b664ec9cf76be2efc5c86bf20
+          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/controller@sha256:9773631ff1474a6373e4e1b27b4e238893b77bfb76b70b81c4ae9f96e5b59588
           resources:
             requests:
               cpu: 30m
@@ -437,7 +437,7 @@ metadata:
   name: istio-webhook
   namespace: knative-serving
   labels:
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 spec:
   selector:
@@ -451,14 +451,14 @@ spec:
       labels:
         app: istio-webhook
         role: istio-webhook
-        serving.knative.dev/release: "v20201111-cbc1a3d4"
+        serving.knative.dev/release: "v20201117-7d1ed7ad"
     spec:
       serviceAccountName: controller
       containers:
         - name: webhook
           # This is the Go import path for the binary that is containerized
           # and substituted here.
-          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/webhook@sha256:17bc9958b175fb5d58995d35614bae730fbe84bdc48b7adacdad2f556c78d9d6
+          image: gcr.io/knative-nightly/knative.dev/net-istio/cmd/webhook@sha256:03889833812b7843d903313b0fba545962f2b938254daaad495cd1d38c61a9f1
           resources:
             requests:
               cpu: 20m
@@ -512,7 +512,7 @@ metadata:
   namespace: knative-serving
   labels:
     role: istio-webhook
-    serving.knative.dev/release: "v20201111-cbc1a3d4"
+    serving.knative.dev/release: "v20201117-7d1ed7ad"
     networking.knative.dev/ingress-provider: istio
 spec:
   ports:
diff --git a/third_party/kourier-latest/kourier.yaml b/third_party/kourier-latest/kourier.yaml
index 7d63e78d4..e81eb5fa3 100644
--- a/third_party/kourier-latest/kourier.yaml
+++ b/third_party/kourier-latest/kourier.yaml
@@ -117,7 +117,7 @@ spec:
         app: 3scale-kourier-control
     spec:
       containers:
-        - image: gcr.io/knative-nightly/knative.dev/net-kourier/cmd/kourier@sha256:28183c42d1b02e927db16861ed9984c653cc9c0cc72b5d9ab450f3c229c2872e
+        - image: gcr.io/knative-nightly/knative.dev/net-kourier/cmd/kourier@sha256:345af26968f1bb542130a93d7ad672e8cfbd52dcebf9a4f6c8ec67a23af14e72
           name: kourier-control
           env:
             - name: CERTS_SECRET_NAMESPACE