Skip to content

Commit

Permalink
Don't cache non success responses (#109)
Browse files Browse the repository at this point in the history
Don't cache non success responses and debug the body response
  • Loading branch information
mtoader authored and madisonchamberlain committed Apr 27, 2023
1 parent 242beb5 commit 3837679
Showing 1 changed file with 26 additions and 10 deletions.
36 changes: 26 additions & 10 deletions monitoring.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
package gosnowflake

import (
"bytes"
"context"
"database/sql/driver"
"encoding/json"
"fmt"
"io"
"net/url"
"runtime"
"strconv"
Expand Down Expand Up @@ -207,14 +209,13 @@ func (sc *snowflakeConn) getQueryResultResp(
resultPath string,
) (*execResponse, error) {
var cachedResponse *execResponse
cachedResponse = nil
if respd, ok := sc.execRespCache.load(resultPath); ok {
cachedResponse = respd
if res, ok := sc.execRespCache.load(resultPath); ok {
// return the cached response, unless we pass the flag saying to
// bypass the cache
if !shouldSkipCache(ctx) {
return respd, nil
if res.Success && !shouldSkipCache(ctx) {
return res, nil
}
cachedResponse = res
}

headers := getHeaders()
Expand All @@ -237,21 +238,32 @@ func (sc *snowflakeConn) getQueryResultResp(
logger.WithContext(ctx).Errorf("failed to get response. err: %v", err)
return nil, err
}
defer res.Body.Close()
if res.Body != nil {
defer func() { _ = res.Body.Close() }()
}

bodyBytes, err := io.ReadAll(res.Body)
if err != nil {
return nil, err
}

var respd *execResponse
if err = json.NewDecoder(res.Body).Decode(&respd); err != nil {
if err = json.NewDecoder(bytes.NewReader(bodyBytes)).Decode(&respd); err != nil {
logger.WithContext(ctx).Errorf("failed to decode JSON. err: %v", err)
return nil, err
}

if !respd.Success && respd.Code == "" && respd.Message == "" {
logger.WithContext(ctx).Errorf("failed to build a proper exec response. received body: %s", string(bodyBytes))
}

// if we are skipping the cache, log difference between cached and non cached result
if shouldSkipCache(ctx) {
qid := respd.Data.QueryID

// if there was no response in the cache anyway, log that and dont try to log anything else
if cachedResponse == nil {
logger.WithContext(ctx).Errorf("cached queryId: %v did not use cache", qid)

} else {
// log if there are any differences in the arrow encooded first chunk
arrowCached := cachedResponse.Data.RowSetBase64
Expand Down Expand Up @@ -285,7 +297,10 @@ func (sc *snowflakeConn) getQueryResultResp(
}
}

sc.execRespCache.store(resultPath, respd)
if respd.Success {
sc.execRespCache.store(resultPath, respd)
}

return respd, nil
}

Expand Down Expand Up @@ -340,9 +355,10 @@ func (sc *snowflakeConn) waitForCompletedQueryResultResp(

if !response.Success {
logEverything(ctx, qid, response, startTime)
} else {
sc.execRespCache.store(resultPath, response)
}

sc.execRespCache.store(resultPath, response)
return response, nil
}

Expand Down

0 comments on commit 3837679

Please sign in to comment.