@@ -45,27 +45,29 @@ type OperatorConfig struct {
4545}
4646
4747type Operator struct {
48- ctx context.Context
49- mgr manager.Manager
50- gwConfC , dpC , gwC , rouC , nodeC controllers.Controller
51- renderCh , operatorCh , updaterCh , configCh chan event.Event
52- manager manager.Manager
53- tracker * config.ProgressTracker
54- progressReporters []config.ProgressReporter
55- finalizer bool
56- gen , lastAckedGen int
57- ackLock sync.RWMutex
58- log , logger logr.Logger
48+ ctx context.Context
49+ mgr manager.Manager
50+ gwConfC , dpC , gwC , rouC , nodeC controllers.Controller
51+ operatorCh event.EventChannel
52+ renderCh , updaterCh , configCh chan event.Event
53+ manager manager.Manager
54+ tracker * config.ProgressTracker
55+ progressReporters []config.ProgressReporter
56+ finalizer bool
57+ gen , lastAckedGen int
58+ ackLock sync.RWMutex
59+ log , logger logr.Logger
5960}
6061
6162// NewOperator creates a new Operator
6263func NewOperator (cfg OperatorConfig ) * Operator {
6364 config .ControllerName = cfg .ControllerName
6465
66+ opCh := make (chan event.Event , channelBufferSize )
6567 return & Operator {
6668 mgr : cfg .Manager ,
6769 renderCh : cfg .RenderCh ,
68- operatorCh : make ( chan event.Event , channelBufferSize ),
70+ operatorCh : event .NewEventChannel ( opCh ),
6971 updaterCh : cfg .UpdaterCh ,
7072 configCh : cfg .ConfigCh ,
7173 tracker : config .NewProgressTracker (),
@@ -89,6 +91,9 @@ func (o *Operator) Start(ctx context.Context, cancel context.CancelFunc) error {
8991 return fmt .Errorf ("Controller runtime manager uninitialized" )
9092 }
9193
94+ // increment the refcount on our operator channel
95+ o .operatorCh .Get ()
96+
9297 log .V (3 ).Info ("Starting GatewayConfig controller" )
9398 c , err := controllers .NewGatewayConfigController (o .mgr , o .operatorCh , o .logger )
9499 if err != nil {
@@ -130,7 +135,7 @@ func (o *Operator) Start(ctx context.Context, cancel context.CancelFunc) error {
130135}
131136
132137func (o * Operator ) eventLoop (ctx context.Context , cancel context.CancelFunc ) {
133- defer close ( o .operatorCh )
138+ defer o .operatorCh . Close ( )
134139
135140 throttler := time .NewTicker (config .ThrottleTimeout )
136141 throttler .Stop ()
@@ -139,7 +144,7 @@ func (o *Operator) eventLoop(ctx context.Context, cancel context.CancelFunc) {
139144 for {
140145 select {
141146
142- case e := <- o .operatorCh :
147+ case e := <- o .operatorCh . Channel () :
143148 switch e .GetType () {
144149 case event .EventTypeUpdate :
145150 // pass through to the updater
@@ -221,6 +226,9 @@ func (o *Operator) Terminate() {
221226 if o .finalizer {
222227 o .Finalize ()
223228 }
229+
230+ // release our channel
231+ o .operatorCh .Put ()
224232}
225233
226234// Finalize invalidates the status on all the managed resources. Note that Finalize must be called
@@ -239,7 +247,7 @@ func (o *Operator) Finalize() {
239247 "last-acked-generation" , lastGen )
240248
241249 // event loop is blocked: we must handle message passing ourselves
242- u := <- o .operatorCh
250+ u := <- o .operatorCh . Channel ()
243251
244252 o .log .V (2 ).Info ("Renderer ready, initiating the updater" , "event" , u .String ())
245253
@@ -254,7 +262,7 @@ func (o *Operator) Finalize() {
254262 timeout := time .After (2 * time .Second )
255263 for {
256264 select {
257- case <- o .operatorCh :
265+ case <- o .operatorCh . Channel () :
258266 if o .GetLastAckedGeneration () != finalGen {
259267 o .log .V (2 ).Info ("Update ready, exiting finalizer" ,
260268 "gen" , o .gen , "last-acked-generation" , lastGen )
0 commit comments