55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package ratio_setting
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
const exposedDataTTL = 30 * time.Second
|
|
|
|
type exposedCache struct {
|
|
data gin.H
|
|
expiresAt time.Time
|
|
}
|
|
|
|
var (
|
|
exposedData atomic.Value
|
|
rebuildMu sync.Mutex
|
|
)
|
|
|
|
func InvalidateExposedDataCache() {
|
|
exposedData.Store((*exposedCache)(nil))
|
|
}
|
|
|
|
func cloneGinH(src gin.H) gin.H {
|
|
dst := make(gin.H, len(src))
|
|
for k, v := range src {
|
|
dst[k] = v
|
|
}
|
|
return dst
|
|
}
|
|
|
|
func GetExposedData() gin.H {
|
|
if c, ok := exposedData.Load().(*exposedCache); ok && c != nil && time.Now().Before(c.expiresAt) {
|
|
return cloneGinH(c.data)
|
|
}
|
|
rebuildMu.Lock()
|
|
defer rebuildMu.Unlock()
|
|
if c, ok := exposedData.Load().(*exposedCache); ok && c != nil && time.Now().Before(c.expiresAt) {
|
|
return cloneGinH(c.data)
|
|
}
|
|
newData := gin.H{
|
|
"model_ratio": GetModelRatioCopy(),
|
|
"completion_ratio": GetCompletionRatioCopy(),
|
|
"cache_ratio": GetCacheRatioCopy(),
|
|
"model_price": GetModelPriceCopy(),
|
|
}
|
|
exposedData.Store(&exposedCache{
|
|
data: newData,
|
|
expiresAt: time.Now().Add(exposedDataTTL),
|
|
})
|
|
return cloneGinH(newData)
|
|
} |