fix(channel): 修复 invalidateCache 存入 typed nil 导致 loadCache panic
invalidateCache 存入 (*channelCache)(nil),类型断言 ok=true 但 指针为 nil,后续 cached.loadedAt 导致 nil pointer dereference。 在 loadCache 双重检查处增加 cached != nil 防御。
This commit is contained in:
@@ -137,7 +137,7 @@ func NewChannelService(repo ChannelRepository, authCacheInvalidator APIKeyAuthCa
|
|||||||
|
|
||||||
// loadCache 加载或返回缓存的渠道数据
|
// loadCache 加载或返回缓存的渠道数据
|
||||||
func (s *ChannelService) loadCache(ctx context.Context) (*channelCache, error) {
|
func (s *ChannelService) loadCache(ctx context.Context) (*channelCache, error) {
|
||||||
if cached, ok := s.cache.Load().(*channelCache); ok {
|
if cached, ok := s.cache.Load().(*channelCache); ok && cached != nil {
|
||||||
if time.Since(cached.loadedAt) < channelCacheTTL {
|
if time.Since(cached.loadedAt) < channelCacheTTL {
|
||||||
return cached, nil
|
return cached, nil
|
||||||
}
|
}
|
||||||
@@ -145,7 +145,7 @@ func (s *ChannelService) loadCache(ctx context.Context) (*channelCache, error) {
|
|||||||
|
|
||||||
result, err, _ := s.cacheSF.Do("channel_cache", func() (any, error) {
|
result, err, _ := s.cacheSF.Do("channel_cache", func() (any, error) {
|
||||||
// 双重检查
|
// 双重检查
|
||||||
if cached, ok := s.cache.Load().(*channelCache); ok {
|
if cached, ok := s.cache.Load().(*channelCache); ok && cached != nil {
|
||||||
if time.Since(cached.loadedAt) < channelCacheTTL {
|
if time.Since(cached.loadedAt) < channelCacheTTL {
|
||||||
return cached, nil
|
return cached, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user