From f18dbf4e49b248fc158fcc6392d5158a624a9270 Mon Sep 17 00:00:00 2001 From: Jason Wilder Date: Tue, 14 Apr 2015 14:36:53 -0600 Subject: [PATCH] Use Limit Reader instead of fixed 1MB/1GB slice for DQ Fixes #2243 --- remote_mapper.go | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/remote_mapper.go b/remote_mapper.go index cd56a9909f6..a1b8c9dd4b2 100644 --- a/remote_mapper.go +++ b/remote_mapper.go @@ -4,13 +4,14 @@ import ( "bytes" "encoding/json" "errors" + "io" "net/http" "github.com/influxdb/influxdb/influxql" ) const ( - MAX_MAP_RESPONSE_SIZE = 1024 * 1024 + MAX_MAP_RESPONSE_SIZE = 1024 * 1024 * 1024 ) // RemoteMapper implements the influxql.Mapper interface. The engine uses the remote mapper @@ -21,6 +22,7 @@ type RemoteMapper struct { results chan interface{} unmarshal influxql.UnmarshalFunc complete bool + decoder *json.Decoder Call string `json:",omitempty"` Database string `json:",omitempty"` @@ -83,6 +85,8 @@ func (m *RemoteMapper) Begin(c *influxql.Call, startingTime int64, chunkSize int return err } m.resp = resp + lr := io.LimitReader(m.resp.Body, MAX_MAP_RESPONSE_SIZE) + m.decoder = json.NewDecoder(lr) return nil } @@ -94,19 +98,8 @@ func (m *RemoteMapper) NextInterval() (interface{}, error) { return nil, nil } - // read the chunk - chunk := make([]byte, MAX_MAP_RESPONSE_SIZE, MAX_MAP_RESPONSE_SIZE) - n, err := m.resp.Body.Read(chunk) - if err != nil { - return nil, err - } - if n == 0 { - return nil, nil - } - - // marshal the response mr := &MapResponse{} - err = json.Unmarshal(chunk[:n], mr) + err := m.decoder.Decode(&mr) if err != nil { return nil, err }