Files
opsxdb/server/internal/db/inflight.go
T

47 lines
1.2 KiB
Go

package db
import (
"context"
"sync"
)
// inflightCancels 在执行的请求注册表:requestId → cancel,供 /api/db/cancel 远程取消。
// 请求完成(正常/异常)必须 UnregisterInflight,避免 map 泄漏。
var inflightCancels = struct {
sync.Mutex
m map[string]context.CancelFunc
}{m: make(map[string]context.CancelFunc)}
// RegisterInflight 注册一个可按 requestId 取消的在执行请求。
// requestID 为空或 cancel 为 nil 时忽略。
func RegisterInflight(requestID string, cancel context.CancelFunc) {
if requestID == "" || cancel == nil {
return
}
inflightCancels.Lock()
defer inflightCancels.Unlock()
inflightCancels.m[requestID] = cancel
}
// UnregisterInflight 请求结束时注销(幂等)。
func UnregisterInflight(requestID string) {
inflightCancels.Lock()
defer inflightCancels.Unlock()
delete(inflightCancels.m, requestID)
}
// CancelInflight 按 requestId 取消在执行的请求;不存在则返回 false。
// 取消后即注销,重复取消返回 false。
func CancelInflight(requestID string) bool {
inflightCancels.Lock()
cancel, ok := inflightCancels.m[requestID]
if ok {
delete(inflightCancels.m, requestID)
}
inflightCancels.Unlock()
if ok {
cancel()
}
return ok
}