tls: wait for keeping storage clean to finish when stopping

This commit is contained in:
WeidiDeng 2025-08-12 16:54:30 +08:00
parent 4bfc3b95b5
commit d5b7c74c88
No known key found for this signature in database
GPG key ID: 25F87CE1741EC7CD

View file

@ -130,6 +130,7 @@ type TLS struct {
ctx caddy.Context ctx caddy.Context
storageCleanTicker *time.Ticker storageCleanTicker *time.Ticker
storageCleanStop chan struct{} storageCleanStop chan struct{}
storageCleanStopDone chan struct{}
logger *zap.Logger logger *zap.Logger
events *caddyevents.App events *caddyevents.App
@ -439,6 +440,9 @@ func (t *TLS) Stop() error {
if t.storageCleanTicker != nil { if t.storageCleanTicker != nil {
t.storageCleanTicker.Stop() t.storageCleanTicker.Stop()
} }
if t.storageCleanStopDone != nil {
<-t.storageCleanStopDone
}
return nil return nil
} }
@ -788,16 +792,20 @@ func (t *TLS) HasCertificateForSubject(subject string) bool {
func (t *TLS) keepStorageClean() { func (t *TLS) keepStorageClean() {
t.storageCleanTicker = time.NewTicker(t.storageCleanInterval()) t.storageCleanTicker = time.NewTicker(t.storageCleanInterval())
t.storageCleanStop = make(chan struct{}) t.storageCleanStop = make(chan struct{})
t.storageCleanStopDone = make(chan struct{})
go func() { go func() {
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {
log.Printf("[PANIC] storage cleaner: %v\n%s", err, debug.Stack()) log.Printf("[PANIC] storage cleaner: %v\n%s", err, debug.Stack())
// close the channel manually if panicked
close(t.storageCleanStopDone)
} }
}() }()
t.cleanStorageUnits() t.cleanStorageUnits()
for { for {
select { select {
case <-t.storageCleanStop: case <-t.storageCleanStop:
close(t.storageCleanStopDone)
return return
case <-t.storageCleanTicker.C: case <-t.storageCleanTicker.C:
t.cleanStorageUnits() t.cleanStorageUnits()