fix: closed race condition

This commit is contained in:
Kevin Franklin Kim 2023-10-03 11:16:33 +02:00
parent d30495d2a2
commit 17c41a7dbe
No known key found for this signature in database

View File

@ -21,7 +21,8 @@ type ServiceEnabler struct {
syncEnabled bool
syncEnabledLock sync.RWMutex
enabledFn func() bool
closed bool
syncClosed bool
syncClosedLock sync.RWMutex
}
func NewServiceEnabler(l *zap.Logger, name string, serviceFn ServiceFunc, enabledFn func() bool) *ServiceEnabler {
@ -38,6 +39,44 @@ func (w *ServiceEnabler) Name() string {
return w.name
}
func (w *ServiceEnabler) Start(ctx context.Context) error {
w.watch()
w.ctx = ctx
if w.enabled() {
if err := w.enable(w.ctx); err != nil {
return err
}
} else {
w.l.Info("skipping disabled dynamic service")
}
return nil
}
func (w *ServiceEnabler) Close(ctx context.Context) error {
l := log.WithServiceName(w.l, w.Name())
w.setClosed(true)
if w.enabled() {
if err := w.disable(w.ctx); err != nil {
return err
}
} else {
l.Info("skipping disabled dynamic service")
}
return nil
}
func (w *ServiceEnabler) closed() bool {
w.syncClosedLock.RLock()
defer w.syncClosedLock.RUnlock()
return w.syncClosed
}
func (w *ServiceEnabler) setClosed(v bool) {
w.syncClosedLock.Lock()
defer w.syncClosedLock.Unlock()
w.syncClosed = v
}
func (w *ServiceEnabler) enabled() bool {
w.syncEnabledLock.RLock()
defer w.syncEnabledLock.RUnlock()
@ -66,7 +105,7 @@ func (w *ServiceEnabler) disable(ctx context.Context) error {
func (w *ServiceEnabler) watch() {
go func() {
for {
if w.closed {
if w.closed() {
break
}
time.Sleep(time.Second)
@ -86,29 +125,3 @@ func (w *ServiceEnabler) watch() {
}
}()
}
func (w *ServiceEnabler) Start(ctx context.Context) error {
w.watch()
w.ctx = ctx
if w.enabled() {
if err := w.enable(w.ctx); err != nil {
return err
}
} else {
w.l.Info("skipping disabled dynamic service")
}
return nil
}
func (w *ServiceEnabler) Close(ctx context.Context) error {
l := log.WithServiceName(w.l, w.Name())
w.closed = true
if w.enabled() {
if err := w.disable(w.ctx); err != nil {
return err
}
} else {
l.Info("skipping disabled dynamic service")
}
return nil
}