mirror of
https://github.com/rancher/norman.git
synced 2025-09-06 09:41:01 +00:00
Update controller to allow adding handlers after controller is running
This commit is contained in:
@@ -124,26 +124,37 @@ func (g *genericController) Enqueue(namespace, name string) {
|
|||||||
|
|
||||||
func (g *genericController) AddHandler(ctx context.Context, name string, handler HandlerFunc) {
|
func (g *genericController) AddHandler(ctx context.Context, name string, handler HandlerFunc) {
|
||||||
g.Lock()
|
g.Lock()
|
||||||
|
defer g.Unlock()
|
||||||
|
|
||||||
|
g.generation++
|
||||||
h := &handlerDef{
|
h := &handlerDef{
|
||||||
name: name,
|
name: name,
|
||||||
generation: g.generation,
|
generation: g.generation,
|
||||||
handler: handler,
|
handler: handler,
|
||||||
}
|
}
|
||||||
g.handlers = append(g.handlers, h)
|
|
||||||
g.Unlock()
|
|
||||||
|
|
||||||
go func() {
|
go func(gen int) {
|
||||||
<-ctx.Done()
|
<-ctx.Done()
|
||||||
g.Lock()
|
g.Lock()
|
||||||
var handlers []*handlerDef
|
defer g.Unlock()
|
||||||
|
var newHandlers []*handlerDef
|
||||||
for _, handler := range g.handlers {
|
for _, handler := range g.handlers {
|
||||||
if handler != h {
|
if handler.generation == gen {
|
||||||
handlers = append(handlers, h)
|
continue
|
||||||
|
}
|
||||||
|
newHandlers = append(newHandlers, handler)
|
||||||
|
}
|
||||||
|
g.handlers = newHandlers
|
||||||
|
}(h.generation)
|
||||||
|
|
||||||
|
g.handlers = append(g.handlers, h)
|
||||||
|
|
||||||
|
if g.synced {
|
||||||
|
for _, key := range g.informer.GetStore().ListKeys() {
|
||||||
|
g.queue.AddRateLimited(key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g.handlers = handlers
|
|
||||||
g.Unlock()
|
|
||||||
}()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *genericController) Sync(ctx context.Context) error {
|
func (g *genericController) Sync(ctx context.Context) error {
|
||||||
@@ -214,25 +225,9 @@ func (g *genericController) Start(ctx context.Context, threadiness int) error {
|
|||||||
threadiness = g.threadinessOverride
|
threadiness = g.threadinessOverride
|
||||||
}
|
}
|
||||||
go g.run(ctx, threadiness)
|
go g.run(ctx, threadiness)
|
||||||
}
|
|
||||||
|
|
||||||
if g.running {
|
|
||||||
for _, h := range g.handlers {
|
|
||||||
if h.generation != g.generation {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for _, key := range g.informer.GetStore().ListKeys() {
|
|
||||||
g.queueObject(generationKey{
|
|
||||||
generation: g.generation,
|
|
||||||
key: key,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
g.generation++
|
|
||||||
g.running = true
|
g.running = true
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user