Browse Source

Merge pull request #1474 from prometheus/fabxc/spinfix

Handle closed target provider channel
pull/1475/head
Fabian Reinartz 9 years ago
parent
commit
eb915ec40f
  1. 35
      retrieval/targetmanager.go

35
retrieval/targetmanager.go

@ -274,28 +274,28 @@ func (ts *targetSet) runProviders(ctx context.Context, providers map[string]Targ
updates := make(chan []*config.TargetGroup) updates := make(chan []*config.TargetGroup)
go func(name string, prov TargetProvider) { go func(name string, prov TargetProvider) {
var initial []*config.TargetGroup
select { select {
case <-ctx.Done(): case <-ctx.Done():
wg.Done() case initial, ok := <-updates:
return // Handle the case that a target provider exits and closes the channel
case initial = <-updates: // before the context is done.
if !ok {
break
}
// First set of all targets the provider knows. // First set of all targets the provider knows.
for _, tgroup := range initial {
targets, err := targetsFromGroup(tgroup, ts.config)
if err != nil {
log.With("target_group", tgroup).Errorf("Target update failed: %s", err)
continue
}
ts.tgroups[name+"/"+tgroup.Source] = targets
}
case <-time.After(5 * time.Second): case <-time.After(5 * time.Second):
// Initial set didn't arrive. Act as if it was empty // Initial set didn't arrive. Act as if it was empty
// and wait for updates later on. // and wait for updates later on.
} }
for _, tgroup := range initial {
targets, err := targetsFromGroup(tgroup, ts.config)
if err != nil {
log.With("target_group", tgroup).Errorf("Target update failed: %s", err)
continue
}
ts.tgroups[name+"/"+tgroup.Source] = targets
}
wg.Done() wg.Done()
// Start listening for further updates. // Start listening for further updates.
@ -303,7 +303,12 @@ func (ts *targetSet) runProviders(ctx context.Context, providers map[string]Targ
select { select {
case <-ctx.Done(): case <-ctx.Done():
return return
case tgs := <-updates: case tgs, ok := <-updates:
// Handle the case that a target provider exits and closes the channel
// before the context is done.
if !ok {
return
}
for _, tg := range tgs { for _, tg := range tgs {
if err := ts.update(name, tg); err != nil { if err := ts.update(name, tg); err != nil {
log.With("target_group", tg).Errorf("Target update failed: %s", err) log.With("target_group", tg).Errorf("Target update failed: %s", err)

Loading…
Cancel
Save