mirror of
https://github.com/foomo/keel.git
synced 2025-10-16 12:35:34 +00:00
fix: closed race condition
This commit is contained in:
parent
d30495d2a2
commit
17c41a7dbe
@ -21,7 +21,8 @@ type ServiceEnabler struct {
|
|||||||
syncEnabled bool
|
syncEnabled bool
|
||||||
syncEnabledLock sync.RWMutex
|
syncEnabledLock sync.RWMutex
|
||||||
enabledFn func() bool
|
enabledFn func() bool
|
||||||
closed bool
|
syncClosed bool
|
||||||
|
syncClosedLock sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServiceEnabler(l *zap.Logger, name string, serviceFn ServiceFunc, enabledFn func() bool) *ServiceEnabler {
|
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
|
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 {
|
func (w *ServiceEnabler) enabled() bool {
|
||||||
w.syncEnabledLock.RLock()
|
w.syncEnabledLock.RLock()
|
||||||
defer w.syncEnabledLock.RUnlock()
|
defer w.syncEnabledLock.RUnlock()
|
||||||
@ -66,7 +105,7 @@ func (w *ServiceEnabler) disable(ctx context.Context) error {
|
|||||||
func (w *ServiceEnabler) watch() {
|
func (w *ServiceEnabler) watch() {
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
if w.closed {
|
if w.closed() {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
time.Sleep(time.Second)
|
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
|
|
||||||
}
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user