From 2975f34140285bb4358a29474f8d4e01860d38a0 Mon Sep 17 00:00:00 2001
From: Igor Drozdov <idrozdov@gitlab.com>
Date: Fri, 18 Sep 2020 11:21:06 +0300
Subject: [PATCH] Increase LSIF scanner buffer

Sometimes we receive bufio.Scanner: token too long is the parsed
string is too long

Let's increase the buffer size
---
 .../unreleased/id-increase-lsif-scanner-buffer.yml    |  5 +++++
 internal/lsif_transformer/parser/docs.go              |  4 ++++
 internal/lsif_transformer/parser/docs_test.go         | 11 +++++++++++
 3 files changed, 20 insertions(+)
 create mode 100644 changelogs/unreleased/id-increase-lsif-scanner-buffer.yml

diff --git a/changelogs/unreleased/id-increase-lsif-scanner-buffer.yml b/changelogs/unreleased/id-increase-lsif-scanner-buffer.yml
new file mode 100644
index 0000000000000..5d6ecf1418663
--- /dev/null
+++ b/changelogs/unreleased/id-increase-lsif-scanner-buffer.yml
@@ -0,0 +1,5 @@
+---
+title: Increase LSIF scanner buffer
+merge_request: 609
+author:
+type: fixed
diff --git a/internal/lsif_transformer/parser/docs.go b/internal/lsif_transformer/parser/docs.go
index 3b293a1eecb53..6e1138eaf29ae 100644
--- a/internal/lsif_transformer/parser/docs.go
+++ b/internal/lsif_transformer/parser/docs.go
@@ -8,6 +8,8 @@ import (
 	"strings"
 )
 
+const maxScanTokenSize = 1024 * 1024
+
 type Line struct {
 	Type string `json:"label"`
 }
@@ -49,6 +51,8 @@ func NewDocs(config Config) (*Docs, error) {
 
 func (d *Docs) Parse(r io.Reader) error {
 	scanner := bufio.NewScanner(r)
+	buf := make([]byte, 0, bufio.MaxScanTokenSize)
+	scanner.Buffer(buf, maxScanTokenSize)
 
 	for scanner.Scan() {
 		if err := d.process(scanner.Bytes()); err != nil {
diff --git a/internal/lsif_transformer/parser/docs_test.go b/internal/lsif_transformer/parser/docs_test.go
index 1d0154c40ffba..b8b1072cabb65 100644
--- a/internal/lsif_transformer/parser/docs_test.go
+++ b/internal/lsif_transformer/parser/docs_test.go
@@ -3,6 +3,7 @@ package parser
 import (
 	"bytes"
 	"fmt"
+	"strings"
 	"testing"
 
 	"github.com/stretchr/testify/require"
@@ -40,3 +41,13 @@ func TestParseContainsLine(t *testing.T) {
 
 	require.Equal(t, []Id{2, 3}, d.DocRanges[1])
 }
+
+func TestParsingVeryLongLine(t *testing.T) {
+	d, err := NewDocs(Config{})
+	require.NoError(t, err)
+	defer d.Close()
+
+	line := []byte(`{"id": "` + strings.Repeat("a", 64*1024) + `"}`)
+
+	require.NoError(t, d.Parse(bytes.NewReader(line)))
+}
-- 
GitLab