Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert "Don't cache non success responses" #111

Merged
merged 1 commit into from
Dec 29, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 9 additions & 26 deletions monitoring.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,10 @@
package gosnowflake

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

headers := getHeaders()
Expand All @@ -229,32 +228,20 @@ func (sc *snowflakeConn) getQueryResultResp(
logger.WithContext(ctx).Errorf("failed to get response. err: %v", err)
return nil, err
}
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(bytes.NewReader(bodyBytes)).Decode(&respd); err != nil {
if err = json.NewDecoder(res.Body).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 @@ -288,10 +275,7 @@ func (sc *snowflakeConn) getQueryResultResp(
}
}

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

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

Expand Down Expand Up @@ -346,10 +330,9 @@ 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