Bladeren bron

Fix deadlock on v1 plugin with activate error

When a plugin has an activation error, it was not being checked in the
`waitActive` loop. This means it will just wait forever for a manifest
to be populated even though it may never come.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
Brian Goff 8 jaren geleden
bovenliggende
commit
f2d384fca6
2 gewijzigde bestanden met toevoegingen van 8 en 1 verwijderingen
  1. 7 0
      pkg/plugins/plugin_test.go
  2. 1 1
      pkg/plugins/plugins.go

+ 7 - 0
pkg/plugins/plugin_test.go

@@ -1,6 +1,7 @@
 package plugins
 
 import (
+	"errors"
 	"path/filepath"
 	"runtime"
 	"sync"
@@ -20,6 +21,12 @@ func TestPluginAddHandler(t *testing.T) {
 	testActive(t, p)
 }
 
+func TestPluginWaitBadPlugin(t *testing.T) {
+	p := &Plugin{activateWait: sync.NewCond(&sync.Mutex{})}
+	p.activateErr = errors.New("some junk happened")
+	testActive(t, p)
+}
+
 func testActive(t *testing.T, p *Plugin) {
 	done := make(chan struct{})
 	go func() {

+ 1 - 1
pkg/plugins/plugins.go

@@ -169,7 +169,7 @@ func (p *Plugin) activateWithLock() error {
 
 func (p *Plugin) waitActive() error {
 	p.activateWait.L.Lock()
-	for !p.activated() {
+	for !p.activated() && p.activateErr == nil {
 		p.activateWait.Wait()
 	}
 	p.activateWait.L.Unlock()