From 125f10d8a2193fb82def6bc302fff445d8c0938c Mon Sep 17 00:00:00 2001 From: Pijus Kamandulis Date: Mon, 27 Jan 2025 21:09:37 +0200 Subject: [PATCH] Add more error handling and mutex guards --- api/config/config.go | 10 ++++----- api/router.go | 5 +++++ internal/logger/logger.go | 38 ++++++++++++++++++++++++---------- internal/repositories/state.go | 4 ++-- sharedlibrary/collections.go | 10 +++++++-- sharedlibrary/databases.go | 5 ++++- sharedlibrary/documents.go | 10 +++++++-- sharedlibrary/shared.go | 6 +++--- 8 files changed, 62 insertions(+), 26 deletions(-) diff --git a/api/config/config.go b/api/config/config.go index 1869ae6..676fac1 100644 --- a/api/config/config.go +++ b/api/config/config.go @@ -58,15 +58,15 @@ func (c *ServerConfig) PopulateCalculatedFields() { switch c.LogLevel { case "debug": - logger.LogLevel = logger.LogLevelDebug + logger.SetLogLevel(logger.LogLevelDebug) case "info": - logger.LogLevel = logger.LogLevelInfo + logger.SetLogLevel(logger.LogLevelInfo) case "error": - logger.LogLevel = logger.LogLevelError + logger.SetLogLevel(logger.LogLevelError) case "silent": - logger.LogLevel = logger.LogLevelSilent + logger.SetLogLevel(logger.LogLevelSilent) default: - logger.LogLevel = logger.LogLevelInfo + logger.SetLogLevel(logger.LogLevelInfo) } } diff --git a/api/router.go b/api/router.go index 9701c33..3588c94 100644 --- a/api/router.go +++ b/api/router.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "net/http" + "sync" "github.com/gin-gonic/gin" "github.com/pikami/cosmium/api/handlers" @@ -13,15 +14,19 @@ import ( tlsprovider "github.com/pikami/cosmium/internal/tls_provider" ) +var ginMux sync.Mutex + func (s *ApiServer) CreateRouter(repository *repositories.DataRepository) { routeHandlers := handlers.NewHandlers(repository, s.config) + ginMux.Lock() gin.DefaultWriter = logger.InfoWriter() gin.DefaultErrorWriter = logger.ErrorWriter() if s.config.LogLevel != "debug" { gin.SetMode(gin.ReleaseMode) } + ginMux.Unlock() router := gin.Default(func(e *gin.Engine) { e.RedirectTrailingSlash = false diff --git a/internal/logger/logger.go b/internal/logger/logger.go index 54b2fd9..75d937c 100644 --- a/internal/logger/logger.go +++ b/internal/logger/logger.go @@ -6,6 +6,7 @@ import ( "os" "runtime" "strings" + "sync" ) type LogLevelType int @@ -21,67 +22,68 @@ type LogWriter struct { WriterLevel LogLevelType } -var LogLevel = LogLevelInfo +var logLevelMutex sync.RWMutex +var logLevel = LogLevelInfo var DebugLogger = log.New(os.Stdout, "", log.Ldate|log.Ltime) var InfoLogger = log.New(os.Stdout, "", log.Ldate|log.Ltime) var ErrorLogger = log.New(os.Stderr, "", log.Ldate|log.Ltime) func DebugLn(v ...any) { - if LogLevel <= LogLevelDebug { + if GetLogLevel() <= LogLevelDebug { prefix := getCallerPrefix() DebugLogger.Println(append([]interface{}{prefix}, v...)...) } } func Debug(v ...any) { - if LogLevel <= LogLevelDebug { + if GetLogLevel() <= LogLevelDebug { prefix := getCallerPrefix() DebugLogger.Println(append([]interface{}{prefix}, v...)...) } } func Debugf(format string, v ...any) { - if LogLevel <= LogLevelDebug { + if GetLogLevel() <= LogLevelDebug { prefix := getCallerPrefix() DebugLogger.Printf(prefix+format, v...) } } func InfoLn(v ...any) { - if LogLevel <= LogLevelInfo { + if GetLogLevel() <= LogLevelInfo { InfoLogger.Println(v...) } } func Info(v ...any) { - if LogLevel <= LogLevelInfo { + if GetLogLevel() <= LogLevelInfo { InfoLogger.Print(v...) } } func Infof(format string, v ...any) { - if LogLevel <= LogLevelInfo { + if GetLogLevel() <= LogLevelInfo { InfoLogger.Printf(format, v...) } } func ErrorLn(v ...any) { - if LogLevel <= LogLevelError { + if GetLogLevel() <= LogLevelError { prefix := getCallerPrefix() ErrorLogger.Println(append([]interface{}{prefix}, v...)...) } } func Error(v ...any) { - if LogLevel <= LogLevelError { + if GetLogLevel() <= LogLevelError { prefix := getCallerPrefix() ErrorLogger.Print(append([]interface{}{prefix}, v...)...) } } func Errorf(format string, v ...any) { - if LogLevel <= LogLevelError { + if GetLogLevel() <= LogLevelError { prefix := getCallerPrefix() ErrorLogger.Printf(prefix+format, v...) } @@ -112,11 +114,25 @@ func DebugWriter() *LogWriter { return &LogWriter{WriterLevel: LogLevelDebug} } +func SetLogLevel(level LogLevelType) { + logLevelMutex.Lock() + defer logLevelMutex.Unlock() + logLevel = level +} + +func GetLogLevel() LogLevelType { + logLevelMutex.RLock() + defer logLevelMutex.RUnlock() + return logLevel +} + func getCallerPrefix() string { _, file, line, ok := runtime.Caller(2) if ok { parts := strings.Split(file, "/") - file = parts[len(parts)-1] + if len(parts) > 0 { + file = parts[len(parts)-1] + } return fmt.Sprintf("%s:%d - ", file, line) } diff --git a/internal/repositories/state.go b/internal/repositories/state.go index c4ad8cb..48637b7 100644 --- a/internal/repositories/state.go +++ b/internal/repositories/state.go @@ -46,8 +46,8 @@ func (r *DataRepository) LoadStateFS(filePath string) { } func (r *DataRepository) LoadStateJSON(jsonData string) error { - r.storeState.RLock() - defer r.storeState.RUnlock() + r.storeState.Lock() + defer r.storeState.Unlock() var state repositorymodels.State if err := json.Unmarshal([]byte(jsonData), &state); err != nil { diff --git a/sharedlibrary/collections.go b/sharedlibrary/collections.go index 70ca6f0..b0ef4b3 100644 --- a/sharedlibrary/collections.go +++ b/sharedlibrary/collections.go @@ -47,7 +47,10 @@ func GetCollection(serverName *C.char, databaseId *C.char, collectionId *C.char) return C.CString("") } - collectionJson, _ := json.Marshal(collection) + collectionJson, err := json.Marshal(collection) + if err != nil { + return C.CString("") + } return C.CString(string(collectionJson)) } @@ -67,7 +70,10 @@ func GetAllCollections(serverName *C.char, databaseId *C.char) *C.char { return C.CString("") } - collectionsJson, _ := json.Marshal(collections) + collectionsJson, err := json.Marshal(collections) + if err != nil { + return C.CString("") + } return C.CString(string(collectionsJson)) } diff --git a/sharedlibrary/databases.go b/sharedlibrary/databases.go index 2ad557f..804e9b8 100644 --- a/sharedlibrary/databases.go +++ b/sharedlibrary/databases.go @@ -45,7 +45,10 @@ func GetDatabase(serverName *C.char, databaseId *C.char) *C.char { return C.CString("") } - databaseJson, _ := json.Marshal(database) + databaseJson, err := json.Marshal(database) + if err != nil { + return C.CString("") + } return C.CString(string(databaseJson)) } diff --git a/sharedlibrary/documents.go b/sharedlibrary/documents.go index 995d59f..c88404f 100644 --- a/sharedlibrary/documents.go +++ b/sharedlibrary/documents.go @@ -49,7 +49,10 @@ func GetDocument(serverName *C.char, databaseId *C.char, collectionId *C.char, d return C.CString("") } - documentJson, _ := json.Marshal(document) + documentJson, err := json.Marshal(document) + if err != nil { + return C.CString("") + } return C.CString(string(documentJson)) } @@ -70,7 +73,10 @@ func GetAllDocuments(serverName *C.char, databaseId *C.char, collectionId *C.cha return C.CString("") } - documentsJson, _ := json.Marshal(documents) + documentsJson, err := json.Marshal(documents) + if err != nil { + return C.CString("") + } return C.CString(string(documentsJson)) } diff --git a/sharedlibrary/shared.go b/sharedlibrary/shared.go index 9dfcbf0..1faed8b 100644 --- a/sharedlibrary/shared.go +++ b/sharedlibrary/shared.go @@ -14,7 +14,7 @@ type ServerInstance struct { } var serverInstances map[string]*ServerInstance -var mutex sync.RWMutex +var mutex sync.Mutex const ( ResponseSuccess = 0 @@ -32,8 +32,8 @@ const ( ) func getInstance(serverName string) (*ServerInstance, bool) { - mutex.RLock() - defer mutex.RUnlock() + mutex.Lock() + defer mutex.Unlock() if serverInstances == nil { serverInstances = make(map[string]*ServerInstance)