| 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) | |
| } | |