Change:
The TimedWorkQueue object appears to lack a critical feature of the original WorkOueue, namely that similar items are aggregated together. By adding the time member to to the key type, it ensures that (time, item) pairs are unique-- you can add the same item multiple times as long as the time differs. This removes the guarantee that two goroutines wouldn't process the same item at the same time.
Iirc, the timed queue feeds a regular queue, so the guarantee still holds
Sorry, I was thinking of the delaying queue, which does key correctly
I'm going to remove timed workqueue. It's used to gather metrics for queues used in the garbage collector. This feature is supported by a regular workqueue now.

Discussion:
<del> /* Copyright 2016 The Kubernetes 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 workqueue import "time" type TimedWorkQueue struct { *Type } type TimedWorkQueueItem struct { StartTime time.Time Object    interface{} } func NewTimedWorkQueue() *TimedWorkQueue { return &TimedWorkQueue{New()} } // Add adds the obj along with the current timestamp to the queue. func (q TimedWorkQueue) Add(timedItem *TimedWorkQueueItem) { q.Type.Add(timedItem) } // Get gets the obj along with its timestamp from the queue. func (q TimedWorkQueue) Get() (timedItem *TimedWorkQueueItem, shutdown bool) { origin, shutdown := q.Type.Get() if origin == nil { return nil, shutdown } timedItem, _ = origin.(*TimedWorkQueueItem) return timedItem, shutdown } func (q TimedWorkQueue) Done(timedItem *TimedWorkQueueItem) error { q.Type.Done(timedItem) return nil } </del>

<del> /* Copyright 2016 The Kubernetes 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 workqueue import ( "testing" "time" "k8s.io/client-go/pkg/api/v1" ) func TestNoMemoryLeak(t *testing.T) { timedQueue := NewTimedWorkQueue() timedQueue.Add(&TimedWorkQueueItem{Object: &v1.Pod{}, StartTime: time.Time{}}) item, _ := timedQueue.Get() timedQueue.Add(item) // The item should still be in the timedQueue. timedQueue.Done(item) item, _ = timedQueue.Get() timedQueue.Done(item) if len(timedQueue.Type.processing) != 0 { t.Errorf("expect timedQueue.Type.processing to be empty!") } } </del>

"k8s.io/client-go/util/workqueue/default_rate_limiters_test.go", "k8s.io/client-go/util/workqueue/delaying_queue_test.go", "k8s.io/client-go/util/workqueue/rate_limitting_queue_test.go", <del> "k8s.io/client-go/util/workqueue/timed_queue_test.go", </del> ], library = ":k8s.io/client-go/util/workqueue", tags = ["automanaged"], deps = [ "//vendor:k8s.io/apimachinery/pkg/util/wait", <del> "//vendor:k8s.io/client-go/pkg/api/v1", </del> "//vendor:k8s.io/client-go/util/clock", ], )

"k8s.io/client-go/util/workqueue/parallelizer.go", "k8s.io/client-go/util/workqueue/queue.go", "k8s.io/client-go/util/workqueue/rate_limitting_queue.go", <del> "k8s.io/client-go/util/workqueue/timed_queue.go", </del> ], tags = ["automanaged"], deps = [