From 42170f9b8e83738aa72ac11152ca7a84eeb5bdff Mon Sep 17 00:00:00 2001 From: Lukasz Raczylo Date: Tue, 14 May 2024 11:30:42 +0100 Subject: [PATCH] fixup! Revamp the query compilation process. --- cache/cache.go | 6 +++--- execute_query.go | 27 ++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/cache/cache.go b/cache/cache.go index 955146d..b2025fb 100644 --- a/cache/cache.go +++ b/cache/cache.go @@ -14,11 +14,11 @@ type CacheEntry struct { } type Cache struct { - entries sync.Map - globalTTL time.Duration compressPool sync.Pool decompressPool sync.Pool - sync.RWMutex // Reintroduced to provide lock methods + entries sync.Map + globalTTL time.Duration + sync.RWMutex } func New(globalTTL time.Duration) *Cache { diff --git a/execute_query.go b/execute_query.go index b6c2d52..cb96295 100644 --- a/execute_query.go +++ b/execute_query.go @@ -7,14 +7,32 @@ import ( "fmt" "io" "net/http" + "sync" "time" "github.com/avast/retry-go/v4" "github.com/goccy/go-json" ) +var bufferPool = sync.Pool{ + New: func() interface{} { + return new(bytes.Buffer) + }, +} + func (qe *QueryExecutor) executeQuery() ([]byte, error) { - httpRequest, err := http.NewRequest(http.MethodPost, qe.endpoint, bytes.NewBuffer(qe.Query)) + // Reuse buffer from pool to avoid allocations + buf := bufferPool.Get().(*bytes.Buffer) + defer bufferPool.Put(buf) + buf.Reset() + + _, err := buf.Write(qe.Query) + if err != nil { + qe.Logger.Error("Can't write to buffer", map[string]interface{}{"error": err}) + return nil, err + } + + httpRequest, err := http.NewRequest(http.MethodPost, qe.endpoint, buf) if err != nil { qe.Logger.Error("Can't create HTTP request", map[string]interface{}{"error": err}) return nil, err @@ -54,15 +72,14 @@ func (qe *QueryExecutor) executeQuery() ([]byte, error) { var reader io.ReadCloser encoding := httpResponse.Header.Get("Content-Encoding") - switch encoding { - case "gzip": + if encoding == "gzip" { reader, err = gzip.NewReader(httpResponse.Body) if err != nil { qe.Logger.Debug("Error creating gzip reader", map[string]interface{}{"error": err.Error()}) return fmt.Errorf("error creating gzip reader: %w", err) } defer reader.Close() - default: + } else { reader = httpResponse.Body } @@ -81,7 +98,7 @@ func (qe *QueryExecutor) executeQuery() ([]byte, error) { return nil }, retry.OnRetry(func(n uint, err error) { - qe.Logger.Warning("Retrying query", map[string]interface{}{"error": err.Error(), "attempt": n}) + qe.Logger.Warning("Retrying query", map[string]interface{}{"error": err.Error(), "attempt": n + 1}) }), retry.Attempts(uint(retriesMax)), retry.DelayType(retry.BackOffDelay),