From 382f79cdafb9e15e413caaaa2ad5204bd7bb9d7f Mon Sep 17 00:00:00 2001 From: Lagovas Date: Tue, 30 Nov 2021 17:00:45 +0200 Subject: [PATCH] control concurrent access to cached queries with mutex to avoid race conditions --- acra-censor/common/logging_logic.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/acra-censor/common/logging_logic.go b/acra-censor/common/logging_logic.go index 2ed84306c..b807e75fd 100644 --- a/acra-censor/common/logging_logic.go +++ b/acra-censor/common/logging_logic.go @@ -90,8 +90,8 @@ func NewFileQueryWriter(filePath string) (*QueryWriter, error) { // WalkQueries walks through each query and perform some action on it func (queryWriter *QueryWriter) WalkQueries(visitor func(query *QueryInfo) error) error { - queryWriter.mutex.Lock() - defer queryWriter.mutex.Unlock() + queryWriter.mutex.RLock() + defer queryWriter.mutex.RUnlock() for _, query := range queryWriter.Queries { if err := visitor(query); err != nil { return err @@ -102,9 +102,9 @@ func (queryWriter *QueryWriter) WalkQueries(visitor func(query *QueryInfo) error // DumpQueries writes all queries into file func (queryWriter *QueryWriter) DumpQueries() error { - queryWriter.mutex.Lock() + queryWriter.mutex.RLock() rawData := queryWriter.serializeQueries(queryWriter.Queries) - queryWriter.mutex.Unlock() + queryWriter.mutex.RUnlock() if err := queryWriter.logStorage.WriteAll(rawData); err != nil { queryWriter.logger.WithError(err).WithField(logging.FieldKeyEventCode, logging.EventCodeErrorCensorIOError).Errorln("Can't dump queries to storage") return err @@ -181,14 +181,16 @@ func (queryWriter *QueryWriter) readStoredQueries() error { queryWriter.logger.WithError(err).WithField(logging.FieldKeyEventCode, logging.EventCodeErrorCensorIOError).Errorln("Can't read stored queries") return err } + queryWriter.mutex.Lock() queryWriter.Queries = q queryWriter.queryIndex = len(q) + queryWriter.mutex.Unlock() return nil } func (queryWriter *QueryWriter) dumpBufferedQueries() error { - queryWriter.mutex.Lock() - defer queryWriter.mutex.Unlock() + queryWriter.mutex.RLock() + defer queryWriter.mutex.RUnlock() if len(queryWriter.Queries) != 0 { partialRawData := queryWriter.serializeQueries(queryWriter.Queries[queryWriter.queryIndex:]) @@ -240,6 +242,8 @@ func (queryWriter *QueryWriter) serializeQueries(queries []*QueryInfo) []byte { } func (queryWriter *QueryWriter) captureQuery(query string) { + queryWriter.mutex.Lock() + defer queryWriter.mutex.Unlock() //skip already captured queries for _, queryInfo := range queryWriter.Queries { if strings.EqualFold(queryInfo.RawQuery, query) {