mirror of
https://github.com/kubernetes/client-go.git
synced 2025-06-28 07:57:20 +00:00
Merge pull request #97326 from victor-timofei/deltafifo-doc
Update DeltaFIFO documentation and group Delta definitions to the top of the file Kubernetes-commit: 9406e145c25e4c3041ec82529176957f164fdb08
This commit is contained in:
commit
e9d996dae2
2
Godeps/Godeps.json
generated
2
Godeps/Godeps.json
generated
@ -460,7 +460,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "k8s.io/api",
|
"ImportPath": "k8s.io/api",
|
||||||
"Rev": "fcac651617f2"
|
"Rev": "9c6b1a9487e0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "k8s.io/apimachinery",
|
"ImportPath": "k8s.io/apimachinery",
|
||||||
|
4
go.mod
4
go.mod
@ -26,7 +26,7 @@ require (
|
|||||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b
|
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
|
||||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
|
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
|
||||||
k8s.io/api v0.0.0-20201209045733-fcac651617f2
|
k8s.io/api v0.0.0-20201218085720-9c6b1a9487e0
|
||||||
k8s.io/apimachinery v0.0.0-20201209085528-15c5dba13c59
|
k8s.io/apimachinery v0.0.0-20201209085528-15c5dba13c59
|
||||||
k8s.io/klog/v2 v2.4.0
|
k8s.io/klog/v2 v2.4.0
|
||||||
k8s.io/utils v0.0.0-20201110183641-67b214c5f920
|
k8s.io/utils v0.0.0-20201110183641-67b214c5f920
|
||||||
@ -34,6 +34,6 @@ require (
|
|||||||
)
|
)
|
||||||
|
|
||||||
replace (
|
replace (
|
||||||
k8s.io/api => k8s.io/api v0.0.0-20201209045733-fcac651617f2
|
k8s.io/api => k8s.io/api v0.0.0-20201218085720-9c6b1a9487e0
|
||||||
k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20201209085528-15c5dba13c59
|
k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20201209085528-15c5dba13c59
|
||||||
)
|
)
|
||||||
|
2
go.sum
2
go.sum
@ -427,7 +427,7 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh
|
|||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
k8s.io/api v0.0.0-20201209045733-fcac651617f2/go.mod h1:xjrWEKNUnu5XTPx3c+1VDDkb3vXmUiTwwHureX1M32c=
|
k8s.io/api v0.0.0-20201218085720-9c6b1a9487e0/go.mod h1:RfHTN0YuX1yj8GjBNCMS6JbbdmX/jjszu9vXIt47SpM=
|
||||||
k8s.io/apimachinery v0.0.0-20201209085528-15c5dba13c59/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
|
k8s.io/apimachinery v0.0.0-20201209085528-15c5dba13c59/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
|
||||||
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
||||||
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
|
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
|
||||||
|
208
tools/cache/delta_fifo.go
vendored
208
tools/cache/delta_fifo.go
vendored
@ -26,54 +26,6 @@ import (
|
|||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewDeltaFIFO returns a Queue which can be used to process changes to items.
|
|
||||||
//
|
|
||||||
// keyFunc is used to figure out what key an object should have. (It is
|
|
||||||
// exposed in the returned DeltaFIFO's KeyOf() method, with additional handling
|
|
||||||
// around deleted objects and queue state).
|
|
||||||
//
|
|
||||||
// 'knownObjects' may be supplied to modify the behavior of Delete,
|
|
||||||
// Replace, and Resync. It may be nil if you do not need those
|
|
||||||
// modifications.
|
|
||||||
//
|
|
||||||
// TODO: consider merging keyLister with this object, tracking a list of
|
|
||||||
// "known" keys when Pop() is called. Have to think about how that
|
|
||||||
// affects error retrying.
|
|
||||||
// NOTE: It is possible to misuse this and cause a race when using an
|
|
||||||
// external known object source.
|
|
||||||
// Whether there is a potential race depends on how the consumer
|
|
||||||
// modifies knownObjects. In Pop(), process function is called under
|
|
||||||
// lock, so it is safe to update data structures in it that need to be
|
|
||||||
// in sync with the queue (e.g. knownObjects).
|
|
||||||
//
|
|
||||||
// Example:
|
|
||||||
// In case of sharedIndexInformer being a consumer
|
|
||||||
// (https://github.com/kubernetes/kubernetes/blob/0cdd940f/staging/
|
|
||||||
// src/k8s.io/client-go/tools/cache/shared_informer.go#L192),
|
|
||||||
// there is no race as knownObjects (s.indexer) is modified safely
|
|
||||||
// under DeltaFIFO's lock. The only exceptions are GetStore() and
|
|
||||||
// GetIndexer() methods, which expose ways to modify the underlying
|
|
||||||
// storage. Currently these two methods are used for creating Lister
|
|
||||||
// and internal tests.
|
|
||||||
//
|
|
||||||
// Also see the comment on DeltaFIFO.
|
|
||||||
//
|
|
||||||
// Warning: This constructs a DeltaFIFO that does not differentiate between
|
|
||||||
// events caused by a call to Replace (e.g., from a relist, which may
|
|
||||||
// contain object updates), and synthetic events caused by a periodic resync
|
|
||||||
// (which just emit the existing object). See https://issue.k8s.io/86015 for details.
|
|
||||||
//
|
|
||||||
// Use `NewDeltaFIFOWithOptions(DeltaFIFOOptions{..., EmitDeltaTypeReplaced: true})`
|
|
||||||
// instead to receive a `Replaced` event depending on the type.
|
|
||||||
//
|
|
||||||
// Deprecated: Equivalent to NewDeltaFIFOWithOptions(DeltaFIFOOptions{KeyFunction: keyFunc, KnownObjects: knownObjects})
|
|
||||||
func NewDeltaFIFO(keyFunc KeyFunc, knownObjects KeyListerGetter) *DeltaFIFO {
|
|
||||||
return NewDeltaFIFOWithOptions(DeltaFIFOOptions{
|
|
||||||
KeyFunction: keyFunc,
|
|
||||||
KnownObjects: knownObjects,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeltaFIFOOptions is the configuration parameters for DeltaFIFO. All are
|
// DeltaFIFOOptions is the configuration parameters for DeltaFIFO. All are
|
||||||
// optional.
|
// optional.
|
||||||
type DeltaFIFOOptions struct {
|
type DeltaFIFOOptions struct {
|
||||||
@ -99,25 +51,6 @@ type DeltaFIFOOptions struct {
|
|||||||
EmitDeltaTypeReplaced bool
|
EmitDeltaTypeReplaced bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDeltaFIFOWithOptions returns a Queue which can be used to process changes to
|
|
||||||
// items. See also the comment on DeltaFIFO.
|
|
||||||
func NewDeltaFIFOWithOptions(opts DeltaFIFOOptions) *DeltaFIFO {
|
|
||||||
if opts.KeyFunction == nil {
|
|
||||||
opts.KeyFunction = MetaNamespaceKeyFunc
|
|
||||||
}
|
|
||||||
|
|
||||||
f := &DeltaFIFO{
|
|
||||||
items: map[string]Deltas{},
|
|
||||||
queue: []string{},
|
|
||||||
keyFunc: opts.KeyFunction,
|
|
||||||
knownObjects: opts.KnownObjects,
|
|
||||||
|
|
||||||
emitDeltaTypeReplaced: opts.EmitDeltaTypeReplaced,
|
|
||||||
}
|
|
||||||
f.cond.L = &f.lock
|
|
||||||
return f
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeltaFIFO is like FIFO, but differs in two ways. One is that the
|
// DeltaFIFO is like FIFO, but differs in two ways. One is that the
|
||||||
// accumulator associated with a given object's key is not that object
|
// accumulator associated with a given object's key is not that object
|
||||||
// but rather a Deltas, which is a slice of Delta values for that
|
// but rather a Deltas, which is a slice of Delta values for that
|
||||||
@ -128,8 +61,11 @@ func NewDeltaFIFOWithOptions(opts DeltaFIFOOptions) *DeltaFIFO {
|
|||||||
// Deleted if the older Deleted's object is a
|
// Deleted if the older Deleted's object is a
|
||||||
// DeletedFinalStateUnknown.
|
// DeletedFinalStateUnknown.
|
||||||
//
|
//
|
||||||
// The other difference is that DeltaFIFO has an additional way that
|
// The other difference is that DeltaFIFO has two additional ways that
|
||||||
// an object can be applied to an accumulator, called Sync.
|
// an object can be applied to an accumulator: Replaced and Sync.
|
||||||
|
// If EmitDeltaTypeReplaced is not set to true, Sync will be used in
|
||||||
|
// replace events for backwards compatibility. Sync is used for periodic
|
||||||
|
// resync events.
|
||||||
//
|
//
|
||||||
// DeltaFIFO is a producer-consumer queue, where a Reflector is
|
// DeltaFIFO is a producer-consumer queue, where a Reflector is
|
||||||
// intended to be the producer, and the consumer is whatever calls
|
// intended to be the producer, and the consumer is whatever calls
|
||||||
@ -193,6 +129,107 @@ type DeltaFIFO struct {
|
|||||||
emitDeltaTypeReplaced bool
|
emitDeltaTypeReplaced bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeltaType is the type of a change (addition, deletion, etc)
|
||||||
|
type DeltaType string
|
||||||
|
|
||||||
|
// Change type definition
|
||||||
|
const (
|
||||||
|
Added DeltaType = "Added"
|
||||||
|
Updated DeltaType = "Updated"
|
||||||
|
Deleted DeltaType = "Deleted"
|
||||||
|
// Replaced is emitted when we encountered watch errors and had to do a
|
||||||
|
// relist. We don't know if the replaced object has changed.
|
||||||
|
//
|
||||||
|
// NOTE: Previous versions of DeltaFIFO would use Sync for Replace events
|
||||||
|
// as well. Hence, Replaced is only emitted when the option
|
||||||
|
// EmitDeltaTypeReplaced is true.
|
||||||
|
Replaced DeltaType = "Replaced"
|
||||||
|
// Sync is for synthetic events during a periodic resync.
|
||||||
|
Sync DeltaType = "Sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Delta is a member of Deltas (a list of Delta objects) which
|
||||||
|
// in its turn is the type stored by a DeltaFIFO. It tells you what
|
||||||
|
// change happened, and the object's state after* that change.
|
||||||
|
//
|
||||||
|
// [*] Unless the change is a deletion, and then you'll get the final
|
||||||
|
// state of the object before it was deleted.
|
||||||
|
type Delta struct {
|
||||||
|
Type DeltaType
|
||||||
|
Object interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deltas is a list of one or more 'Delta's to an individual object.
|
||||||
|
// The oldest delta is at index 0, the newest delta is the last one.
|
||||||
|
type Deltas []Delta
|
||||||
|
|
||||||
|
// NewDeltaFIFO returns a Queue which can be used to process changes to items.
|
||||||
|
//
|
||||||
|
// keyFunc is used to figure out what key an object should have. (It is
|
||||||
|
// exposed in the returned DeltaFIFO's KeyOf() method, with additional handling
|
||||||
|
// around deleted objects and queue state).
|
||||||
|
//
|
||||||
|
// 'knownObjects' may be supplied to modify the behavior of Delete,
|
||||||
|
// Replace, and Resync. It may be nil if you do not need those
|
||||||
|
// modifications.
|
||||||
|
//
|
||||||
|
// TODO: consider merging keyLister with this object, tracking a list of
|
||||||
|
// "known" keys when Pop() is called. Have to think about how that
|
||||||
|
// affects error retrying.
|
||||||
|
// NOTE: It is possible to misuse this and cause a race when using an
|
||||||
|
// external known object source.
|
||||||
|
// Whether there is a potential race depends on how the consumer
|
||||||
|
// modifies knownObjects. In Pop(), process function is called under
|
||||||
|
// lock, so it is safe to update data structures in it that need to be
|
||||||
|
// in sync with the queue (e.g. knownObjects).
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// In case of sharedIndexInformer being a consumer
|
||||||
|
// (https://github.com/kubernetes/kubernetes/blob/0cdd940f/staging/
|
||||||
|
// src/k8s.io/client-go/tools/cache/shared_informer.go#L192),
|
||||||
|
// there is no race as knownObjects (s.indexer) is modified safely
|
||||||
|
// under DeltaFIFO's lock. The only exceptions are GetStore() and
|
||||||
|
// GetIndexer() methods, which expose ways to modify the underlying
|
||||||
|
// storage. Currently these two methods are used for creating Lister
|
||||||
|
// and internal tests.
|
||||||
|
//
|
||||||
|
// Also see the comment on DeltaFIFO.
|
||||||
|
//
|
||||||
|
// Warning: This constructs a DeltaFIFO that does not differentiate between
|
||||||
|
// events caused by a call to Replace (e.g., from a relist, which may
|
||||||
|
// contain object updates), and synthetic events caused by a periodic resync
|
||||||
|
// (which just emit the existing object). See https://issue.k8s.io/86015 for details.
|
||||||
|
//
|
||||||
|
// Use `NewDeltaFIFOWithOptions(DeltaFIFOOptions{..., EmitDeltaTypeReplaced: true})`
|
||||||
|
// instead to receive a `Replaced` event depending on the type.
|
||||||
|
//
|
||||||
|
// Deprecated: Equivalent to NewDeltaFIFOWithOptions(DeltaFIFOOptions{KeyFunction: keyFunc, KnownObjects: knownObjects})
|
||||||
|
func NewDeltaFIFO(keyFunc KeyFunc, knownObjects KeyListerGetter) *DeltaFIFO {
|
||||||
|
return NewDeltaFIFOWithOptions(DeltaFIFOOptions{
|
||||||
|
KeyFunction: keyFunc,
|
||||||
|
KnownObjects: knownObjects,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDeltaFIFOWithOptions returns a Queue which can be used to process changes to
|
||||||
|
// items. See also the comment on DeltaFIFO.
|
||||||
|
func NewDeltaFIFOWithOptions(opts DeltaFIFOOptions) *DeltaFIFO {
|
||||||
|
if opts.KeyFunction == nil {
|
||||||
|
opts.KeyFunction = MetaNamespaceKeyFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
f := &DeltaFIFO{
|
||||||
|
items: map[string]Deltas{},
|
||||||
|
queue: []string{},
|
||||||
|
keyFunc: opts.KeyFunction,
|
||||||
|
knownObjects: opts.KnownObjects,
|
||||||
|
|
||||||
|
emitDeltaTypeReplaced: opts.EmitDeltaTypeReplaced,
|
||||||
|
}
|
||||||
|
f.cond.L = &f.lock
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ = Queue(&DeltaFIFO{}) // DeltaFIFO is a Queue
|
_ = Queue(&DeltaFIFO{}) // DeltaFIFO is a Queue
|
||||||
)
|
)
|
||||||
@ -673,39 +710,6 @@ type KeyGetter interface {
|
|||||||
GetByKey(key string) (value interface{}, exists bool, err error)
|
GetByKey(key string) (value interface{}, exists bool, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeltaType is the type of a change (addition, deletion, etc)
|
|
||||||
type DeltaType string
|
|
||||||
|
|
||||||
// Change type definition
|
|
||||||
const (
|
|
||||||
Added DeltaType = "Added"
|
|
||||||
Updated DeltaType = "Updated"
|
|
||||||
Deleted DeltaType = "Deleted"
|
|
||||||
// Replaced is emitted when we encountered watch errors and had to do a
|
|
||||||
// relist. We don't know if the replaced object has changed.
|
|
||||||
//
|
|
||||||
// NOTE: Previous versions of DeltaFIFO would use Sync for Replace events
|
|
||||||
// as well. Hence, Replaced is only emitted when the option
|
|
||||||
// EmitDeltaTypeReplaced is true.
|
|
||||||
Replaced DeltaType = "Replaced"
|
|
||||||
// Sync is for synthetic events during a periodic resync.
|
|
||||||
Sync DeltaType = "Sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Delta is the type stored by a DeltaFIFO. It tells you what change
|
|
||||||
// happened, and the object's state after* that change.
|
|
||||||
//
|
|
||||||
// [*] Unless the change is a deletion, and then you'll get the final
|
|
||||||
// state of the object before it was deleted.
|
|
||||||
type Delta struct {
|
|
||||||
Type DeltaType
|
|
||||||
Object interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deltas is a list of one or more 'Delta's to an individual object.
|
|
||||||
// The oldest delta is at index 0, the newest delta is the last one.
|
|
||||||
type Deltas []Delta
|
|
||||||
|
|
||||||
// Oldest is a convenience function that returns the oldest delta, or
|
// Oldest is a convenience function that returns the oldest delta, or
|
||||||
// nil if there are no deltas.
|
// nil if there are no deltas.
|
||||||
func (d Deltas) Oldest() *Delta {
|
func (d Deltas) Oldest() *Delta {
|
||||||
|
Loading…
Reference in New Issue
Block a user