summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-05-18 22:36:54 +0200
committerMartin Polden <mpolden@mpolden.no>2023-05-18 22:45:32 +0200
commit0f2637115c2d37a8646befc778fcbb0d46bce049 (patch)
tree34d44703199af3357401d84b79b2475a4aa5900a /client
parent3a88b880f0b6323959dafeeb8e0076a7f515e311 (diff)
Remove excessive buffering
Diffstat (limited to 'client')
-rw-r--r--client/go/internal/vespa/document/document.go58
-rw-r--r--client/go/internal/vespa/document/document_test.go2
2 files changed, 17 insertions, 43 deletions
diff --git a/client/go/internal/vespa/document/document.go b/client/go/internal/vespa/document/document.go
index a33c4a3c5af..0ee8dae3f60 100644
--- a/client/go/internal/vespa/document/document.go
+++ b/client/go/internal/vespa/document/document.go
@@ -1,7 +1,6 @@
package document
import (
- "bufio"
"bytes"
"fmt"
"io"
@@ -20,8 +19,6 @@ import (
"github.com/go-json-experiment/json"
)
-var asciiSpace = [256]uint8{'\t': 1, '\n': 1, '\v': 1, '\f': 1, '\r': 1, ' ': 1}
-
type Operation int
const (
@@ -117,7 +114,6 @@ type Document struct {
// Decoder decodes documents from a JSON structure which is either an array of objects, or objects separated by newline.
type Decoder struct {
- r *bufio.Reader
dec *json.Decoder
buf bytes.Buffer
@@ -153,29 +149,20 @@ func (d Document) String() string {
}
func (d *Decoder) guessMode() error {
- for !d.array && !d.jsonl {
- b, err := d.r.ReadByte()
- if err != nil {
- return err
- }
- // Skip leading whitespace
- if b < 0x80 && asciiSpace[b] != 0 {
- continue
- }
- switch json.Kind(b) {
- case jsonObjectStart:
- d.jsonl = true
- case jsonArrayStart:
- d.array = true
- default:
- return fmt.Errorf("unexpected token: %q", string(b))
- }
- if err := d.r.UnreadByte(); err != nil {
- return err
- }
- if err := d.readArrayDelim(true); err != nil {
+ if d.array || d.jsonl {
+ return nil
+ }
+ kind := d.dec.PeekKind()
+ switch kind {
+ case jsonArrayStart:
+ if _, err := d.readNext(jsonArrayStart); err != nil {
return err
}
+ d.array = true
+ case jsonObjectStart:
+ d.jsonl = true
+ default:
+ return fmt.Errorf("expected %s or %s, got %s", jsonArrayStart, jsonObjectStart, kind)
}
return nil
}
@@ -191,18 +178,6 @@ func (d *Decoder) readNext(kind json.Kind) (json.Token, error) {
return t, nil
}
-func (d *Decoder) readArrayDelim(open bool) error {
- if !d.array {
- return nil
- }
- kind := jsonArrayEnd
- if open {
- kind = jsonArrayStart
- }
- _, err := d.readNext(kind)
- return err
-}
-
func (d *Decoder) readString() (string, error) {
t, err := d.readNext(jsonString)
if err != nil {
@@ -299,9 +274,9 @@ func (d *Decoder) decode() (Document, error) {
if err := d.guessMode(); err != nil {
return Document{}, err
}
- if d.dec.PeekKind() == jsonArrayEnd {
+ if d.array && d.dec.PeekKind() == jsonArrayEnd {
// Reached end of the array holding document operations
- if err := d.readArrayDelim(false); err != nil {
+ if _, err := d.readNext(jsonArrayEnd); err != nil {
return Document{}, err
}
return Document{}, io.EOF
@@ -333,9 +308,8 @@ loop:
}
func NewDecoder(r io.Reader) *Decoder {
- sz := 1 << 26
- d := &Decoder{r: bufio.NewReaderSize(r, sz)}
- d.dec = json.NewDecoder(io.TeeReader(d.r, &d.buf))
+ d := &Decoder{}
+ d.dec = json.NewDecoder(io.TeeReader(r, &d.buf))
return d
}
diff --git a/client/go/internal/vespa/document/document_test.go b/client/go/internal/vespa/document/document_test.go
index 71400314634..0b9017011dd 100644
--- a/client/go/internal/vespa/document/document_test.go
+++ b/client/go/internal/vespa/document/document_test.go
@@ -185,7 +185,7 @@ func TestDocumentDecoderInvalid(t *testing.T) {
t.Errorf("unexpected error: %s", err)
}
_, err = r.Decode()
- wantErr := "invalid json at byte offset 109: json: invalid character '\\n' within string (expecting non-control character)"
+ wantErr := "invalid json at byte offset 110: json: invalid character '\\n' within string (expecting non-control character)"
if err.Error() != wantErr {
t.Errorf("want error %q, got %q", wantErr, err.Error())
}