| 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(), |
| "create_cache_ratio": GetCreateCacheRatioCopy(), |
| "model_price": GetModelPriceCopy(), |
| } |
| exposedData.Store(&exposedCache{ |
| data: newData, |
| expiresAt: time.Now().Add(exposedDataTTL), |
| }) |
| return cloneGinH(newData) |
| } |
|
|