adding trace to reflector initialization

Kubernetes-commit: 4e4d380b32105c3ff7641661120da876bca060de
This commit is contained in:
Krzysztof Siedlecki 2019-01-24 16:30:47 +01:00 committed by Kubernetes Publisher
parent cce357d054
commit 57d4daeaf4

View File

@ -41,6 +41,7 @@ import (
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
"k8s.io/klog" "k8s.io/klog"
"k8s.io/utils/trace"
) )
// Reflector watches a specified resource and causes all changes to be reflected in the given store. // Reflector watches a specified resource and causes all changes to be reflected in the given store.
@ -176,45 +177,56 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error {
r.metrics.numberOfLists.Inc() r.metrics.numberOfLists.Inc()
start := r.clock.Now() start := r.clock.Now()
var list runtime.Object if err := func() error {
var err error initTrace := trace.New("Reflector " + r.name + " ListAndWatch")
listCh := make(chan struct{}, 1) defer initTrace.LogIfLong(10 * time.Second)
panicCh := make(chan interface{}, 1) var list runtime.Object
go func() { var err error
defer func() { listCh := make(chan struct{}, 1)
if r := recover(); r != nil { panicCh := make(chan interface{}, 1)
panicCh <- r go func() {
} defer func() {
if r := recover(); r != nil {
panicCh <- r
}
}()
list, err = r.listerWatcher.List(options)
close(listCh)
}() }()
list, err = r.listerWatcher.List(options) select {
close(listCh) case <-stopCh:
}() return nil
select { case r := <-panicCh:
case <-stopCh: panic(r)
case <-listCh:
}
if err != nil {
return fmt.Errorf("%s: Failed to list %v: %v", r.name, r.expectedType, err)
}
initTrace.Step("Objects listed")
r.metrics.listDuration.Observe(time.Since(start).Seconds())
listMetaInterface, err := meta.ListAccessor(list)
if err != nil {
return fmt.Errorf("%s: Unable to understand list result %#v: %v", r.name, list, err)
}
resourceVersion = listMetaInterface.GetResourceVersion()
initTrace.Step("Resource version extracted")
items, err := meta.ExtractList(list)
if err != nil {
return fmt.Errorf("%s: Unable to understand list result %#v (%v)", r.name, list, err)
}
initTrace.Step("Objects extracted")
r.metrics.numberOfItemsInList.Observe(float64(len(items)))
if err := r.syncWith(items, resourceVersion); err != nil {
return fmt.Errorf("%s: Unable to sync list result: %v", r.name, err)
}
initTrace.Step("SyncWith done")
r.setLastSyncResourceVersion(resourceVersion)
initTrace.Step("Resource version updated")
return nil return nil
case r := <-panicCh: }(); err != nil {
panic(r) return err
case <-listCh:
} }
if err != nil {
return fmt.Errorf("%s: Failed to list %v: %v", r.name, r.expectedType, err)
}
r.metrics.listDuration.Observe(time.Since(start).Seconds())
listMetaInterface, err := meta.ListAccessor(list)
if err != nil {
return fmt.Errorf("%s: Unable to understand list result %#v: %v", r.name, list, err)
}
resourceVersion = listMetaInterface.GetResourceVersion()
items, err := meta.ExtractList(list)
if err != nil {
return fmt.Errorf("%s: Unable to understand list result %#v (%v)", r.name, list, err)
}
r.metrics.numberOfItemsInList.Observe(float64(len(items)))
if err := r.syncWith(items, resourceVersion); err != nil {
return fmt.Errorf("%s: Unable to sync list result: %v", r.name, err)
}
r.setLastSyncResourceVersion(resourceVersion)
resyncerrc := make(chan error, 1) resyncerrc := make(chan error, 1)
cancelCh := make(chan struct{}) cancelCh := make(chan struct{})