From 1f572c0f528b73bb5f55e09f9990b568b1f2d7a7 Mon Sep 17 00:00:00 2001 From: Jordan Lewis Date: Sat, 29 May 2021 15:11:57 -0300 Subject: [PATCH] row: release memory more eagerly in txnKVFetcher Previously, we could leave some dangling references to batch responses around in the txnKVFetcher when we were fetching more than one batch at a time. This would cause a delay in reclamation of memory for the lifetime of a given query. Release note (bug fix): use less memory in some queries, primarily lookup joins. --- pkg/sql/row/kv_batch_fetcher.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/sql/row/kv_batch_fetcher.go b/pkg/sql/row/kv_batch_fetcher.go index ba2ecb975397..204b74af8d44 100644 --- a/pkg/sql/row/kv_batch_fetcher.go +++ b/pkg/sql/row/kv_batch_fetcher.go @@ -525,13 +525,16 @@ func (f *txnKVFetcher) nextBatch( ) (ok bool, kvs []roachpb.KeyValue, batchResponse []byte, origSpan roachpb.Span, err error) { if len(f.remainingBatches) > 0 { batch := f.remainingBatches[0] + f.remainingBatches[0] = nil f.remainingBatches = f.remainingBatches[1:] return true, nil, batch, f.origSpan, nil } for len(f.responses) > 0 { reply := f.responses[0].GetInner() + f.responses[0] = roachpb.ResponseUnion{} f.responses = f.responses[1:] origSpan := f.requestSpans[0] + f.requestSpans[0] = roachpb.Span{} f.requestSpans = f.requestSpans[1:] var batchResp []byte switch t := reply.(type) { @@ -539,12 +542,16 @@ func (f *txnKVFetcher) nextBatch( if len(t.BatchResponses) > 0 { batchResp = t.BatchResponses[0] f.remainingBatches = t.BatchResponses[1:] + t.BatchResponses[0] = nil + t.BatchResponses = nil } return true, t.Rows, batchResp, origSpan, nil case *roachpb.ReverseScanResponse: if len(t.BatchResponses) > 0 { batchResp = t.BatchResponses[0] f.remainingBatches = t.BatchResponses[1:] + t.BatchResponses[0] = nil + t.BatchResponses = nil } return true, t.Rows, batchResp, origSpan, nil case *roachpb.GetResponse: @@ -571,5 +578,7 @@ func (f *txnKVFetcher) nextBatch( // close releases the resources of this txnKVFetcher. func (f *txnKVFetcher) close(ctx context.Context) { + f.responses = nil + f.remainingBatches = nil f.acc.Close(ctx) }