fix(CurrentRecipePointer): 🐛 Fix "set from cache" bug
Add validator to check if current recipe pointer is set-able or not
This commit is contained in:
parent
64a98cea51
commit
4219c1cb43
3 changed files with 90 additions and 16 deletions
|
|
@ -338,6 +338,9 @@ func (d *Data) GetRecipe(countryID, filename string) *models.Recipe {
|
|||
return d.CurrentRecipe[countryID]
|
||||
}
|
||||
|
||||
// add validate flag
|
||||
needValidate := false
|
||||
|
||||
// do check if match the current pointer
|
||||
if d.CurrentFile[countryID] == filename {
|
||||
d.taoLogger.Log.Debug("GetRecipe",
|
||||
|
|
@ -352,11 +355,13 @@ func (d *Data) GetRecipe(countryID, filename string) *models.Recipe {
|
|||
// get requested version
|
||||
requestedConfig, _ := strconv.Atoi(strings.Split(strings.Split(filename, "_")[1], ".")[0])
|
||||
if currentConfig != requestedConfig {
|
||||
// TODO: from `/dashboard`, this already checked the version if matched,
|
||||
d.taoLogger.Log.Debug("GetRecipe", zap.Any("ActualFileNotMatch", "Skip this!"))
|
||||
needValidate = true
|
||||
} else {
|
||||
|
||||
// detect patches, return original
|
||||
var cached_original_recipe models.Recipe
|
||||
var cached_original_recipe *models.Recipe = &models.Recipe{}
|
||||
err := d.redisClient.GetKeyTo(filename, &cached_original_recipe)
|
||||
|
||||
// for index, v := range cached_original_recipe.Recipe01 {
|
||||
|
|
@ -365,7 +370,7 @@ func (d *Data) GetRecipe(countryID, filename string) *models.Recipe {
|
|||
|
||||
if err == nil && d.redisClient.HealthCheck() == nil {
|
||||
d.taoLogger.Log.Debug("GetRecipe.NoReturnUpdated", zap.Any("target", filename))
|
||||
return &cached_original_recipe
|
||||
return cached_original_recipe
|
||||
}
|
||||
|
||||
// if equal, OK
|
||||
|
|
@ -390,12 +395,12 @@ func (d *Data) GetRecipe(countryID, filename string) *models.Recipe {
|
|||
|
||||
// detect patches, return original
|
||||
|
||||
var cached_original_recipe models.Recipe
|
||||
var cached_original_recipe *models.Recipe = &models.Recipe{}
|
||||
err := d.redisClient.GetKeyTo(filename, &cached_original_recipe)
|
||||
|
||||
if err == nil && d.redisClient.HealthCheck() == nil {
|
||||
d.taoLogger.Log.Debug("GetRecipe.NoReturnUpdated", zap.Any("target", filename))
|
||||
return &cached_original_recipe
|
||||
return cached_original_recipe
|
||||
}
|
||||
|
||||
d.taoLogger.Log.Debug("GetRecipe.ReturnDefault", zap.Any("error_cache_recipe", err))
|
||||
|
|
@ -408,9 +413,30 @@ func (d *Data) GetRecipe(countryID, filename string) *models.Recipe {
|
|||
// change current version and read new recipe
|
||||
|
||||
if filename == "default" {
|
||||
filename = d.CurrentFile[countryID]
|
||||
// use redis cache
|
||||
if d.redisClient.HealthCheck() == nil {
|
||||
d.taoLogger.Log.Debug("GetRecipe", zap.Any("RedisOffline", "return default recipe"))
|
||||
// var defaultFileName string
|
||||
|
||||
d.taoLogger.Log.Debug("GetRcipe.TryGetDefaultFromRedis", zap.Any("ByCountry", countryID))
|
||||
var cached_default_recipe *models.Recipe = &models.Recipe{}
|
||||
err := d.redisClient.GetKeyTo(countryID, cached_default_recipe)
|
||||
if err != nil {
|
||||
filename = d.CurrentFile[countryID]
|
||||
d.taoLogger.Log.Debug("GetRecipe.ReplaceDefaultCase2", zap.Any("RedisGetKeyFail+getFromServerMem", filename), zap.Any("Error", err))
|
||||
} else {
|
||||
// filename = defaultFileName
|
||||
d.taoLogger.Log.Debug("GetRecipe.ReplaceDefaultCase3", zap.Any("Case3+RedisOK,do check if matched", filename))
|
||||
return cached_default_recipe
|
||||
}
|
||||
} else {
|
||||
filename = d.CurrentFile[countryID]
|
||||
d.taoLogger.Log.Debug("GetRecipe.ReplaceDefaultCase1", zap.Any("RedisOffline+getFromServerMem", filename))
|
||||
}
|
||||
}
|
||||
|
||||
d.taoLogger.Log.Debug("GetRecipe.ReplaceDefault", zap.Any("Filename", filename), zap.Any("Conflict", needValidate))
|
||||
|
||||
// var recipe *models.Recipe = &models.Recipe{}
|
||||
|
||||
// do check if redis contains the recipe
|
||||
|
|
@ -457,7 +483,12 @@ func (d *Data) GetRecipe(countryID, filename string) *models.Recipe {
|
|||
return_recipe = cached_recipe
|
||||
} else {
|
||||
d.taoLogger.Log.Debug("GetRecipeCached", zap.Any("cached_recipe", "no"))
|
||||
// d.CurrentRecipe[countryID] = recipe
|
||||
// TODO: handle country and recipe not match
|
||||
isFound, index := d.ValidateUpdateCurrentRecipePointer(countryID, filename)
|
||||
if isFound && index != -1 {
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
}
|
||||
|
||||
return_recipe = recipe
|
||||
}
|
||||
|
||||
|
|
@ -659,7 +690,11 @@ func (d *Data) GetRecipe01ByProductCode(filename, countryID, productCode string)
|
|||
|
||||
d.taoLogger.Log.Debug("GetRecipe01ByProductCode", zap.Any("productCode", productCode), zap.Any("version", recipe.MachineSetting.ConfigNumber))
|
||||
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
// TODO: handle country and recipe not match
|
||||
isFound, index := d.ValidateUpdateCurrentRecipePointer(countryID, filename)
|
||||
if isFound && index != -1 {
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
}
|
||||
|
||||
// save to map
|
||||
if len(d.recipeMap) > 5 { // limit keep in memory 5 version
|
||||
|
|
@ -879,7 +914,11 @@ func (d *Data) GetMaterialSetting(countryID, filename string) []models.MaterialS
|
|||
|
||||
// d.taoLogger.Log.Debug("GetMaterialSetting", zap.Any("recipe", recipe.MaterialSetting))
|
||||
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
// TODO: handle country and recipe not match
|
||||
isFound, index := d.ValidateUpdateCurrentRecipePointer(countryID, filename)
|
||||
if isFound && index != -1 {
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
}
|
||||
|
||||
// save to map
|
||||
if len(d.recipeMap) > 5 { // limit keep in memory 5 version
|
||||
|
|
@ -925,7 +964,11 @@ func (d *Data) GetAllToppingGroups(countryID, filename string) []models.ToppingG
|
|||
}
|
||||
recipe := d.GetRecipe(countryID, filename)
|
||||
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
// TODO: handle country and recipe not match
|
||||
isFound, index := d.ValidateUpdateCurrentRecipePointer(countryID, filename)
|
||||
if isFound && index != -1 {
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
}
|
||||
|
||||
if len(d.recipeMap) > 5 { // limit keep in memory 5 version
|
||||
// remove oldest version
|
||||
|
|
@ -1015,7 +1058,11 @@ func (d *Data) GetMaterialCode(ids []uint64, countryID, filename string) []model
|
|||
// return d.CurrentRecipe[countryID].MaterialCode
|
||||
// }
|
||||
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
// TODO: handle country and recipe not match
|
||||
isFound, index := d.ValidateUpdateCurrentRecipePointer(countryID, filename)
|
||||
if isFound && index != -1 {
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
}
|
||||
|
||||
// save to map
|
||||
if len(d.recipeMap) > 5 { // limit keep in memory 5 version
|
||||
|
|
@ -1069,15 +1116,19 @@ func (d *Data) GetToppings(countryID, filename string) models.Topping {
|
|||
return recipe.Recipe[countryID].Topping
|
||||
}
|
||||
|
||||
if filename == "default" {
|
||||
filename = d.CurrentFile[countryID]
|
||||
}
|
||||
// if filename == "default" {
|
||||
// filename = d.CurrentFile[countryID]
|
||||
// }
|
||||
|
||||
// d.CurrentFile[countryID] = filename
|
||||
// d.CurrentCountryID[countryID] = countryID
|
||||
recipe := d.GetRecipe(countryID, filename)
|
||||
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
// TODO: handle country and recipe not match
|
||||
isFound, index := d.ValidateUpdateCurrentRecipePointer(countryID, filename)
|
||||
if isFound && index != -1 {
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
}
|
||||
|
||||
return recipe.Topping
|
||||
}
|
||||
|
|
@ -1346,7 +1397,11 @@ func (d *Data) SortRecipe(countryID, filename string, sort_by string, ascending
|
|||
}
|
||||
fmt.Println("set to server mem")
|
||||
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
// TODO: handle country and recipe not match
|
||||
isFound, index := d.ValidateUpdateCurrentRecipePointer(countryID, filename)
|
||||
if isFound && index != -1 {
|
||||
d.CurrentRecipe[countryID] = recipe
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1511,3 +1566,18 @@ func (d *Data) finalizedVersion(country string, sourceRecipe *models.Recipe) (st
|
|||
|
||||
return updatedFilename, nil
|
||||
}
|
||||
|
||||
func (d *Data) ValidateUpdateCurrentRecipePointer(countryID, filename string) (bool, int) {
|
||||
found := false
|
||||
idx := -1
|
||||
for index, file := range d.AllRecipeFiles[countryID] {
|
||||
if file.Name == filename {
|
||||
found = true
|
||||
idx = index
|
||||
}
|
||||
}
|
||||
|
||||
d.taoLogger.Log.Debug("ValidateUpdateCurrentRecipePointer", zap.Any("args", []string{countryID, filename}), zap.Any("pass", found))
|
||||
|
||||
return found, idx
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@ import (
|
|||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
const VERSION = "1.0.1b"
|
||||
|
||||
type Server struct {
|
||||
server *http.Server
|
||||
data *data.Data
|
||||
|
|
@ -63,6 +65,7 @@ func (s *Server) Run() error {
|
|||
s.createHandler()
|
||||
// log.Printf("Server running on %s", s.server.Addr)
|
||||
s.taoLogger.Log.Info("Server running", zap.String("addr", s.server.Addr))
|
||||
s.taoLogger.Log.Info("Version", zap.String("version", VERSION))
|
||||
|
||||
defer func(Log *zap.Logger) {
|
||||
err := Log.Sync()
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package logger
|
|||
import (
|
||||
"os"
|
||||
"recipe-manager/config"
|
||||
"time"
|
||||
|
||||
"github.com/natefinch/lumberjack"
|
||||
"go.uber.org/zap"
|
||||
|
|
@ -30,7 +31,7 @@ func (tl *TaoLogger) initConfig() *zap.Logger {
|
|||
MessageKey: "message",
|
||||
StacktraceKey: "error",
|
||||
EncodeLevel: zapcore.LowercaseLevelEncoder,
|
||||
EncodeTime: zapcore.ISO8601TimeEncoder,
|
||||
EncodeTime: zapcore.TimeEncoderOfLayout(time.DateTime),
|
||||
}), zapcore.AddSync(&lumberjack.Logger{
|
||||
Filename: "services/logger/serverlog.log",
|
||||
MaxSize: 5, // megabytes
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue