1
0
mirror of https://github.com/rancher/norman.git synced 2025-09-05 09:10:31 +00:00

Add ability to add handlers transactionally across controllers

This commit is contained in:
Darren Shepherd
2020-02-05 20:47:25 -07:00
parent 9dd0f76a7e
commit 899cfdf49b
2 changed files with 61 additions and 0 deletions

View File

@@ -123,6 +123,20 @@ func (g *genericController) Enqueue(namespace, name string) {
}
func (g *genericController) AddHandler(ctx context.Context, name string, handler HandlerFunc) {
t := getHandlerTransaction(ctx)
if t == nil {
g.addHandler(ctx, name, handler)
return
}
go func() {
if t.shouldContinue() {
g.addHandler(ctx, name, handler)
}
}()
}
func (g *genericController) addHandler(ctx context.Context, name string, handler HandlerFunc) {
g.Lock()
defer g.Unlock()

47
controller/transaction.go Normal file
View File

@@ -0,0 +1,47 @@
package controller
import (
"context"
)
type hTransactionKey struct{}
type HandlerTransaction struct {
context.Context
parent context.Context
done chan struct{}
result bool
}
func (h *HandlerTransaction) shouldContinue() bool {
select {
case <-h.parent.Done():
return false
case <-h.done:
return h.result
}
}
func (h *HandlerTransaction) Commit() {
h.result = true
close(h.done)
}
func (h *HandlerTransaction) Rollback() {
close(h.done)
}
func NewHandlerTransaction(ctx context.Context) *HandlerTransaction {
ht := &HandlerTransaction{
parent: ctx,
done: make(chan struct{}),
}
ctx = context.WithValue(ctx, hTransactionKey{}, ht)
ht.Context = ctx
return ht
}
func getHandlerTransaction(ctx context.Context) *HandlerTransaction {
v, _ := ctx.Value(hTransactionKey{}).(*HandlerTransaction)
return v
}