mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-03-30 11:51:20 +00:00
* feat: 引入通用 HTTP BodyStorage/DiskCache 缓存配置与管理 - 新增 common/body_storage.go 提供 HTTP 请求体存储抽象和文件缓存能力 - 增加 common/disk_cache_config.go 支持全局磁盘缓存配置 - main.go 挂载缓存初始化流程 - 新增和补充 controller/performance.go (及 unix/windows) 用于缓存性能监控接口 - middleware/body_cleanup.go 自动清理缓存文件 - router 挂载相关接口 - 前端 settings 页面新增性能监控设置 PerformanceSetting - 优化缓存开关状态和模块热插拔能力 - 其他相关文件同步适配缓存扩展 * fix: 修复 BodyStorage 并发安全和错误处理问题 - 修复 diskStorage.Close() 竞态条件,先获取锁再执行 CAS - 为 memoryStorage 添加互斥锁和 closed 状态检查 - 修复 CreateBodyStorageFromReader 在磁盘存储失败时的回退逻辑 - 添加缓存命中统计调用 (IncrementDiskCacheHits/IncrementMemoryCacheHits) - 修复 gin.go 中 Seek 错误被忽略的问题 - 在 api-router 添加 BodyStorageCleanup 中间件 - 修复前端 formatBytes 对异常值的处理 Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
53 lines
1.0 KiB
Go
53 lines
1.0 KiB
Go
//go:build windows
|
|
|
|
package controller
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
"unsafe"
|
|
|
|
"github.com/QuantumNous/new-api/common"
|
|
)
|
|
|
|
// getDiskSpaceInfo 获取缓存目录所在磁盘的空间信息 (Windows)
|
|
func getDiskSpaceInfo() DiskSpaceInfo {
|
|
cachePath := common.GetDiskCachePath()
|
|
if cachePath == "" {
|
|
cachePath = os.TempDir()
|
|
}
|
|
|
|
info := DiskSpaceInfo{}
|
|
|
|
kernel32 := syscall.NewLazyDLL("kernel32.dll")
|
|
getDiskFreeSpaceEx := kernel32.NewProc("GetDiskFreeSpaceExW")
|
|
|
|
var freeBytesAvailable, totalBytes, totalFreeBytes uint64
|
|
|
|
pathPtr, err := syscall.UTF16PtrFromString(cachePath)
|
|
if err != nil {
|
|
return info
|
|
}
|
|
|
|
ret, _, _ := getDiskFreeSpaceEx.Call(
|
|
uintptr(unsafe.Pointer(pathPtr)),
|
|
uintptr(unsafe.Pointer(&freeBytesAvailable)),
|
|
uintptr(unsafe.Pointer(&totalBytes)),
|
|
uintptr(unsafe.Pointer(&totalFreeBytes)),
|
|
)
|
|
|
|
if ret == 0 {
|
|
return info
|
|
}
|
|
|
|
info.Total = totalBytes
|
|
info.Free = freeBytesAvailable
|
|
info.Used = totalBytes - totalFreeBytes
|
|
|
|
if info.Total > 0 {
|
|
info.UsedPercent = float64(info.Used) / float64(info.Total) * 100
|
|
}
|
|
|
|
return info
|
|
}
|