diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-05-18 22:36:54 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2023-05-18 22:45:32 +0200 |
commit | 0f2637115c2d37a8646befc778fcbb0d46bce049 (patch) | |
tree | 34d44703199af3357401d84b79b2475a4aa5900a /client | |
parent | 3a88b880f0b6323959dafeeb8e0076a7f515e311 (diff) |
Remove excessive buffering
Diffstat (limited to 'client')
-rw-r--r-- | client/go/internal/vespa/document/document.go | 58 | ||||
-rw-r--r-- | client/go/internal/vespa/document/document_test.go | 2 |
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()) } |