@@ -64,6 +64,8 @@ type TemplateStorage struct {
6464 provider coder.ClientProvider
6565 tableConvertor rest.TableConvertor
6666 broadcaster * watch.Broadcaster
67+ watchEvents chan watch.Event
68+ watchEventsWG sync.WaitGroup
6769 destroyOnce sync.Once
6870}
6971
@@ -73,11 +75,16 @@ func NewTemplateStorage(provider coder.ClientProvider) *TemplateStorage {
7375 panic ("assertion failed: template client provider must not be nil" )
7476 }
7577
76- return & TemplateStorage {
78+ storage := & TemplateStorage {
7779 provider : provider ,
7880 tableConvertor : rest .NewDefaultTableConvertor (aggregationv1alpha1 .Resource ("codertemplates" )),
7981 broadcaster : watch .NewBroadcaster (watchBroadcasterQueueLen , watch .WaitIfChannelFull ),
82+ watchEvents : make (chan watch.Event , watchBroadcasterQueueLen ),
8083 }
84+ storage .watchEventsWG .Add (1 )
85+ go storage .dispatchWatchEvents ()
86+
87+ return storage
8188}
8289
8390// New returns an empty CoderTemplate object.
@@ -92,6 +99,12 @@ func (s *TemplateStorage) Destroy() {
9299 }
93100
94101 s .destroyOnce .Do (func () {
102+ if s .watchEvents == nil {
103+ panic ("assertion failed: template watch event queue must not be nil" )
104+ }
105+ close (s .watchEvents )
106+ s .watchEventsWG .Wait ()
107+
95108 if s .broadcaster != nil {
96109 s .broadcaster .Shutdown ()
97110 }
@@ -366,7 +379,7 @@ func (s *TemplateStorage) Create(
366379 return nil , fmt .Errorf ("assertion failed: converted template must not be nil" )
367380 }
368381
369- broadcastEventAsync ( s . broadcaster , watch .Added , result .DeepCopy ())
382+ s . enqueueWatchEvent ( watch .Added , result .DeepCopy ())
370383
371384 return result , nil
372385 }
@@ -386,7 +399,7 @@ func (s *TemplateStorage) Create(
386399 return nil , fmt .Errorf ("assertion failed: converted template must not be nil" )
387400 }
388401
389- broadcastEventAsync ( s . broadcaster , watch .Added , result .DeepCopy ())
402+ s . enqueueWatchEvent ( watch .Added , result .DeepCopy ())
390403
391404 return result , nil
392405}
@@ -633,7 +646,7 @@ func (s *TemplateStorage) Update(
633646 return nil , false , fmt .Errorf ("assertion failed: refreshed template must not be nil" )
634647 }
635648
636- broadcastEventAsync ( s . broadcaster , watch .Modified , result .DeepCopy ())
649+ s . enqueueWatchEvent ( watch .Modified , result .DeepCopy ())
637650
638651 return result , false , nil
639652}
@@ -699,11 +712,33 @@ func (s *TemplateStorage) Delete(
699712 }
700713
701714 // Emit a Deleted event with the last-known template state.
702- broadcastEventAsync ( s . broadcaster , watch .Deleted , templateObj .DeepCopy ())
715+ s . enqueueWatchEvent ( watch .Deleted , templateObj .DeepCopy ())
703716
704717 return & metav1.Status {Status : metav1 .StatusSuccess }, true , nil
705718}
706719
720+ func (s * TemplateStorage ) dispatchWatchEvents () {
721+ defer s .watchEventsWG .Done ()
722+
723+ for event := range s .watchEvents {
724+ _ = s .broadcaster .Action (event .Type , event .Object )
725+ }
726+ }
727+
728+ func (s * TemplateStorage ) enqueueWatchEvent (action watch.EventType , obj runtime.Object ) {
729+ if s == nil {
730+ panic ("assertion failed: template storage must not be nil" )
731+ }
732+ if s .watchEvents == nil {
733+ panic ("assertion failed: template watch event queue must not be nil" )
734+ }
735+ if obj == nil {
736+ panic ("assertion failed: template watch event object must not be nil" )
737+ }
738+
739+ s .watchEvents <- watch.Event {Type : action , Object : obj }
740+ }
741+
707742// ConvertToTable converts a template object or list into kubectl table output.
708743func (s * TemplateStorage ) ConvertToTable (ctx context.Context , object , tableOptions runtime.Object ) (* metav1.Table , error ) {
709744 if s == nil {
0 commit comments