From 70c4fbb69a961bfc22f8770fff7ac4ba30aa9781 Mon Sep 17 00:00:00 2001 From: Preston Vasquez Date: Wed, 16 Apr 2025 15:36:25 -0600 Subject: [PATCH 01/11] GODRIVER-3533 Optimize value reader and writer --- bson/marshal.go | 5 +++- bson/unmarshal.go | 2 ++ bson/value_reader.go | 71 ++++++++++++++++++++++++++++++++++---------- bson/value_writer.go | 10 +++++++ 4 files changed, 72 insertions(+), 16 deletions(-) diff --git a/bson/marshal.go b/bson/marshal.go index 21631d8156..f36ad45219 100644 --- a/bson/marshal.go +++ b/bson/marshal.go @@ -74,7 +74,10 @@ func Marshal(val interface{}) ([]byte, error) { } }() sw.Reset() - vw := NewDocumentWriter(sw) + + vw := getValueWriter(sw) + defer putValueWriter(vw) + enc := encPool.Get().(*Encoder) defer encPool.Put(enc) enc.Reset(vw) diff --git a/bson/unmarshal.go b/bson/unmarshal.go index 72870c10ab..bf97da23b1 100644 --- a/bson/unmarshal.go +++ b/bson/unmarshal.go @@ -43,6 +43,8 @@ type ValueUnmarshaler interface { // pointer, the pointer is set to nil without calling UnmarshalBSONValue. func Unmarshal(data []byte, val interface{}) error { vr := newDocumentReader(bytes.NewReader(data)) + defer releaseDocumentReader(vr) + if l, err := vr.peekLength(); err != nil { return err } else if int(l) != len(data) { diff --git a/bson/value_reader.go b/bson/value_reader.go index 678c47b106..04275c95a1 100644 --- a/bson/value_reader.go +++ b/bson/value_reader.go @@ -13,6 +13,7 @@ import ( "fmt" "io" "math" + "sync" ) var _ ValueReader = &valueReader{} @@ -29,13 +30,30 @@ type vrState struct { end int64 } +var bufioReaderPool = sync.Pool{ + New: func() interface{} { + return bufio.NewReader(nil) + }, +} + +var vrPool = sync.Pool{ + New: func() interface{} { + return &valueReader{ + stack: make([]vrState, 1, 5), + } + }, +} + // valueReader is for reading BSON values. type valueReader struct { - r *bufio.Reader - offset int64 + r *bufio.Reader + ra io.ReaderAt // The underlying reader - stack []vrState - frame int64 + poolReader bool // Set if r is from bufioReaderPool + + offset int64 + stack []vrState + frame int64 } // NewDocumentReader returns a ValueReader using b for the underlying BSON @@ -57,14 +75,33 @@ func newValueReader(t Type, r io.Reader) ValueReader { } func newDocumentReader(r io.Reader) *valueReader { - stack := make([]vrState, 1, 5) - stack[0] = vrState{ - mode: mTopLevel, - } - return &valueReader{ - r: bufio.NewReader(r), - stack: stack, + vr := vrPool.Get().(*valueReader) + + vr.offset = 0 + vr.frame = 0 + vr.poolReader = true + + vr.stack = vr.stack[:1] + vr.stack[0].mode = mTopLevel + + br := bufioReaderPool.Get().(*bufio.Reader) + br.Reset(r) + vr.r = br + + return vr +} + +func releaseDocumentReader(vr *valueReader) { + if !vr.poolReader { + return } + + bufioReaderPool.Put(vr.r) + vr.r = nil + vr.poolReader = false + + vr.ra = nil + vrPool.Put(vr) } func (vr *valueReader) advanceFrame() { @@ -253,14 +290,18 @@ func (vr *valueReader) appendNextElement(dst []byte) ([]byte, error) { return nil, err } - buf := make([]byte, length) - _, err = io.ReadFull(vr.r, buf) + buf, err := vr.r.Peek(int(length)) if err != nil { return nil, err } + dst = append(dst, buf...) - vr.offset += int64(len(buf)) - return dst, err + if _, err = vr.r.Discard(int(length)); err != nil { + return nil, err + } + + vr.offset += int64(length) + return dst, nil } func (vr *valueReader) readValueBytes(dst []byte) (Type, []byte, error) { diff --git a/bson/value_writer.go b/bson/value_writer.go index 57334a925d..cf6f1b292d 100644 --- a/bson/value_writer.go +++ b/bson/value_writer.go @@ -26,6 +26,16 @@ var vwPool = sync.Pool{ }, } +func getValueWriter(w io.Writer) *valueWriter { + vw := vwPool.Get().(*valueWriter) + + vw.reset(vw.buf) + vw.buf = vw.buf[:0] + vw.w = w + + return vw +} + func putValueWriter(vw *valueWriter) { if vw != nil { vw.w = nil // don't leak the writer From 20145ad6f73ed50d31db10181552f26261730e08 Mon Sep 17 00:00:00 2001 From: Preston Vasquez Date: Wed, 16 Apr 2025 15:50:51 -0600 Subject: [PATCH 02/11] GODRIVER-3533 Remove uncessary additions to vr --- bson/mem.prof | Bin 0 -> 13829 bytes bson/value_reader.go | 12 +----------- 2 files changed, 1 insertion(+), 11 deletions(-) create mode 100644 bson/mem.prof diff --git a/bson/mem.prof b/bson/mem.prof new file mode 100644 index 0000000000000000000000000000000000000000..9890e4d60971f92fc0a9327104ca3331123b52b8 GIT binary patch literal 13829 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ⅆNC|5B-XZ7aJI_8ot7+Z>TLQ@2vi$WEmHHnzA2}_`G zG!do!>{f1%JKJ+t&3sLX6;i?~ZM|lj|=Y6wxkUJ z>E&1G%8LWBrSM9)5py``7s{X71NARk(M-JxcSMv<#1v}5wL+<@&3+4uPiONt77{*qwZ zK)@Sa#=+Rs{zu_8wwhIQ(Zw6cw{r@7`GvfgFNXhneFcw~RFWd%e6bp$(jjYmZ*D)k zx!c)i)XWgvs>$u0%ak}rT_^^tpuyLPbeUgux8m#;Vrxfqvj=p|_eZupHT9#Se81kZ z1k@fUCjaNd`t|{TFxbOe5b$)ancgZ*9L=g13LHv#?19~V_Wj;LQ67R$VsB7+_t?en z&Fdb}wvEv$>>4^6L|mgXk(ly9WzzBceL>3! zHFEN>PU5maf{Iw~Qs~c022`VN6$7 zqs>CTG!)TnY>|pRt-1iQ+VE^wx+qVKFj_S}L>wWeI!P~UJJN}8aAVvcv*^+Nd5#?l z*@2FMK#m=H&<^-xQ@oWKRCv4qn)6w2yPWRbVl%Zy)X`AYC9&lPD>K*c%WIpL=b%O} z8)_PN)+|sl&EDR;yg)^^?GlT>R#9Qw!otoWyC}#`*dxS>4B1Z4z;o9{Q|sz2j%2-F zet%9se?Z@Z&AymGr`7wv4Rj98SQkl!mv>QtE`lCYpsS+ap56gD>Yl68vXc&CPG(V0 zkIm1j%zXB=cgAAR%6USo!45?4Z8>W-wv5BvI0ptb`!OY* zn;niSQ>c=i^9ll?L0$a0kJ)*#?d#8TfkUfGFYp)>Tg6RIUC48fSa&^wHL!nA?|{hS zcHAze(-qcKROi(Qq(yGfojDh1UC0DM`Zpl?AgqiGAYs6iu)=|wM%=qoVMvNWa}7~I3T z+aAPRc#so+k^NYZD;=8=(^Zl(m8TaxO!PQg>g$yuk)C&!ykXM zl&23doMQpKS^~kSUShgltG=>uSkr+nFzA27kG=s`iJzF$hQrP|H093Dj_tsSt#@8B z+^vo_?u&EzYEY5waq+&1Z&C9-YdfGmVl)46C3Jke#9J6!KB>-+lS-YK)WV&8z1tJp zMGL0XUbp151J-zB%x%4>v$TwLO|Tze+oL6;-5i7dxb}JJ% zcdl|OreiAEsxVz~4?AG1D+ZqHV)3*pG~6CfdL+g2bpq8~JLhLD&Q(_h!0n!DUr;b| z^>=p!`~%LuC#8dzO0dn{UT(x)_}Z1m;c3shcBO|La_S(_bA^i6m9BYJfzi!R&sBd2 z6x};}8dQagRxYu10?xWZ$7@4H-`Ij%6kp-+%HRdY|5p0g!}Eusl=~Upklmb%9WF!k zjgb}?h11qID7ITaK6Mkcm%knFcv1U$(4BAla*7KJLY|b!8~tYu{588KtNS{4w&&VE z6xg};-oqQ}=kCED5}fY3vZV^`V35!8yaE0a;*Sc|D4tVc zD$}aq?eVnyBg~4A-}4Ik_EmMK9k6}5w&ySBsh2KNZuM0He_YS>)embSrpvQV#qJb{ z7w2|-GyDR@eZcPz<%H~F&lS%9BS7s(?SaM3-JJ@2PTtBX>7zcokIh3>5nE|J*8Brc z{(OrS6=T=7^8MQ8`hT2IiH#bzrz7{r2L$+%nEr-g2MBB?nk}-y*asof@0?$mMSqCIUZkR2lDNnB|baH4(T%4 zbFMG*HFTEWXY;o(Ebk@yRaF8WioEqcW_S15J-k6pG@I)IURmx+Bm6n6ddDHFpfG|E z1?^fARF@d|fA8_fn`Pbt|F3rF{$lnpC1aXX>A3U!oqYwNbAIRPfMgX1{OUvSROf|* zeITYcTtO$EqZ6)_~_uleI9K& zxOia8K`r>d{Nk)$+>=n7$W|?{Yt`cV?AEQb`m|_~oz*Ak_qjuMF!X-`00960XnLOT HS%UxoFh(#J literal 0 HcmV?d00001 diff --git a/bson/value_reader.go b/bson/value_reader.go index 04275c95a1..047b0a3a9b 100644 --- a/bson/value_reader.go +++ b/bson/value_reader.go @@ -46,10 +46,7 @@ var vrPool = sync.Pool{ // valueReader is for reading BSON values. type valueReader struct { - r *bufio.Reader - ra io.ReaderAt // The underlying reader - - poolReader bool // Set if r is from bufioReaderPool + r *bufio.Reader offset int64 stack []vrState @@ -79,7 +76,6 @@ func newDocumentReader(r io.Reader) *valueReader { vr.offset = 0 vr.frame = 0 - vr.poolReader = true vr.stack = vr.stack[:1] vr.stack[0].mode = mTopLevel @@ -92,15 +88,9 @@ func newDocumentReader(r io.Reader) *valueReader { } func releaseDocumentReader(vr *valueReader) { - if !vr.poolReader { - return - } - bufioReaderPool.Put(vr.r) vr.r = nil - vr.poolReader = false - vr.ra = nil vrPool.Put(vr) } From e0f81a077a3951ac1f32cfecc337e387ccb61162 Mon Sep 17 00:00:00 2001 From: Preston Vasquez Date: Wed, 16 Apr 2025 16:47:15 -0600 Subject: [PATCH 03/11] GODRIVER-3533 Account for full buffer in appending next ele --- bson/value_reader.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bson/value_reader.go b/bson/value_reader.go index 047b0a3a9b..214f4c63bb 100644 --- a/bson/value_reader.go +++ b/bson/value_reader.go @@ -282,6 +282,16 @@ func (vr *valueReader) appendNextElement(dst []byte) ([]byte, error) { buf, err := vr.r.Peek(int(length)) if err != nil { + if err == bufio.ErrBufferFull { + temp := make([]byte, length) + if _, err = io.ReadFull(vr.r, temp); err != nil { + return nil, err + } + dst = append(dst, temp...) + vr.offset += int64(len(temp)) + return dst, nil + } + return nil, err } From 8848df38388663efbe841759c8eb653592eae7f1 Mon Sep 17 00:00:00 2001 From: Preston Vasquez Date: Wed, 16 Apr 2025 17:18:53 -0600 Subject: [PATCH 04/11] GODRIVER-3533 Revert valueReader struct changes --- bson/value_reader.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bson/value_reader.go b/bson/value_reader.go index 214f4c63bb..7c26c41411 100644 --- a/bson/value_reader.go +++ b/bson/value_reader.go @@ -46,11 +46,11 @@ var vrPool = sync.Pool{ // valueReader is for reading BSON values. type valueReader struct { - r *bufio.Reader - + r *bufio.Reader offset int64 - stack []vrState - frame int64 + + stack []vrState + frame int64 } // NewDocumentReader returns a ValueReader using b for the underlying BSON From 3afc6f817ba8f63802117d2bf089b09f136e210a Mon Sep 17 00:00:00 2001 From: Preston Vasquez Date: Wed, 16 Apr 2025 17:25:39 -0600 Subject: [PATCH 05/11] GODRIVER-3533 Use document-specific pool for encoding --- bson/marshal.go | 4 ++-- bson/value_writer.go | 21 +++++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/bson/marshal.go b/bson/marshal.go index f36ad45219..88a85c0ffb 100644 --- a/bson/marshal.go +++ b/bson/marshal.go @@ -75,8 +75,8 @@ func Marshal(val interface{}) ([]byte, error) { }() sw.Reset() - vw := getValueWriter(sw) - defer putValueWriter(vw) + vw := getDocumentWriter(sw) + defer putDocumentWriter(vw) enc := encPool.Get().(*Encoder) defer encPool.Put(enc) diff --git a/bson/value_writer.go b/bson/value_writer.go index cf6f1b292d..74921e4183 100644 --- a/bson/value_writer.go +++ b/bson/value_writer.go @@ -26,8 +26,21 @@ var vwPool = sync.Pool{ }, } -func getValueWriter(w io.Writer) *valueWriter { - vw := vwPool.Get().(*valueWriter) +func putValueWriter(vw *valueWriter) { + if vw != nil { + vw.w = nil // don't leak the writer + vwPool.Put(vw) + } +} + +var documentWriterPool = sync.Pool{ + New: func() interface{} { + return NewDocumentWriter(nil) + }, +} + +func getDocumentWriter(w io.Writer) *valueWriter { + vw := documentWriterPool.Get().(*valueWriter) vw.reset(vw.buf) vw.buf = vw.buf[:0] @@ -36,10 +49,10 @@ func getValueWriter(w io.Writer) *valueWriter { return vw } -func putValueWriter(vw *valueWriter) { +func putDocumentWriter(vw *valueWriter) { if vw != nil { vw.w = nil // don't leak the writer - vwPool.Put(vw) + documentWriterPool.Put(vw) } } From ecb98ce039a1f89dce1e6e76f5c5b2a1d26c9114 Mon Sep 17 00:00:00 2001 From: Preston Vasquez Date: Thu, 17 Apr 2025 16:39:11 -0600 Subject: [PATCH 06/11] GODRIVER-3533 Remove mem.perf file --- bson/mem.prof | Bin 13829 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 bson/mem.prof diff --git a/bson/mem.prof b/bson/mem.prof deleted file mode 100644 index 9890e4d60971f92fc0a9327104ca3331123b52b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13829 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ⅆNC|5B-XZ7aJI_8ot7+Z>TLQ@2vi$WEmHHnzA2}_`G zG!do!>{f1%JKJ+t&3sLX6;i?~ZM|lj|=Y6wxkUJ z>E&1G%8LWBrSM9)5py``7s{X71NARk(M-JxcSMv<#1v}5wL+<@&3+4uPiONt77{*qwZ zK)@Sa#=+Rs{zu_8wwhIQ(Zw6cw{r@7`GvfgFNXhneFcw~RFWd%e6bp$(jjYmZ*D)k zx!c)i)XWgvs>$u0%ak}rT_^^tpuyLPbeUgux8m#;Vrxfqvj=p|_eZupHT9#Se81kZ z1k@fUCjaNd`t|{TFxbOe5b$)ancgZ*9L=g13LHv#?19~V_Wj;LQ67R$VsB7+_t?en z&Fdb}wvEv$>>4^6L|mgXk(ly9WzzBceL>3! zHFEN>PU5maf{Iw~Qs~c022`VN6$7 zqs>CTG!)TnY>|pRt-1iQ+VE^wx+qVKFj_S}L>wWeI!P~UJJN}8aAVvcv*^+Nd5#?l z*@2FMK#m=H&<^-xQ@oWKRCv4qn)6w2yPWRbVl%Zy)X`AYC9&lPD>K*c%WIpL=b%O} z8)_PN)+|sl&EDR;yg)^^?GlT>R#9Qw!otoWyC}#`*dxS>4B1Z4z;o9{Q|sz2j%2-F zet%9se?Z@Z&AymGr`7wv4Rj98SQkl!mv>QtE`lCYpsS+ap56gD>Yl68vXc&CPG(V0 zkIm1j%zXB=cgAAR%6USo!45?4Z8>W-wv5BvI0ptb`!OY* zn;niSQ>c=i^9ll?L0$a0kJ)*#?d#8TfkUfGFYp)>Tg6RIUC48fSa&^wHL!nA?|{hS zcHAze(-qcKROi(Qq(yGfojDh1UC0DM`Zpl?AgqiGAYs6iu)=|wM%=qoVMvNWa}7~I3T z+aAPRc#so+k^NYZD;=8=(^Zl(m8TaxO!PQg>g$yuk)C&!ykXM zl&23doMQpKS^~kSUShgltG=>uSkr+nFzA27kG=s`iJzF$hQrP|H093Dj_tsSt#@8B z+^vo_?u&EzYEY5waq+&1Z&C9-YdfGmVl)46C3Jke#9J6!KB>-+lS-YK)WV&8z1tJp zMGL0XUbp151J-zB%x%4>v$TwLO|Tze+oL6;-5i7dxb}JJ% zcdl|OreiAEsxVz~4?AG1D+ZqHV)3*pG~6CfdL+g2bpq8~JLhLD&Q(_h!0n!DUr;b| z^>=p!`~%LuC#8dzO0dn{UT(x)_}Z1m;c3shcBO|La_S(_bA^i6m9BYJfzi!R&sBd2 z6x};}8dQagRxYu10?xWZ$7@4H-`Ij%6kp-+%HRdY|5p0g!}Eusl=~Upklmb%9WF!k zjgb}?h11qID7ITaK6Mkcm%knFcv1U$(4BAla*7KJLY|b!8~tYu{588KtNS{4w&&VE z6xg};-oqQ}=kCED5}fY3vZV^`V35!8yaE0a;*Sc|D4tVc zD$}aq?eVnyBg~4A-}4Ik_EmMK9k6}5w&ySBsh2KNZuM0He_YS>)embSrpvQV#qJb{ z7w2|-GyDR@eZcPz<%H~F&lS%9BS7s(?SaM3-JJ@2PTtBX>7zcokIh3>5nE|J*8Brc z{(OrS6=T=7^8MQ8`hT2IiH#bzrz7{r2L$+%nEr-g2MBB?nk}-y*asof@0?$mMSqCIUZkR2lDNnB|baH4(T%4 zbFMG*HFTEWXY;o(Ebk@yRaF8WioEqcW_S15J-k6pG@I)IURmx+Bm6n6ddDHFpfG|E z1?^fARF@d|fA8_fn`Pbt|F3rF{$lnpC1aXX>A3U!oqYwNbAIRPfMgX1{OUvSROf|* zeITYcTtO$EqZ6)_~_uleI9K& zxOia8K`r>d{Nk)$+>=n7$W|?{Yt`cV?AEQb`m|_~oz*Ak_qjuMF!X-`00960XnLOT HS%UxoFh(#J From d6bdec4a89ac3b3375f63485ff8f8eb7c756edfe Mon Sep 17 00:00:00 2001 From: Preston Vasquez Date: Mon, 21 Apr 2025 10:52:48 -0600 Subject: [PATCH 07/11] GODRIVER-3533 use newDocumentWriter in documentWriterPool --- bson/value_writer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bson/value_writer.go b/bson/value_writer.go index 74921e4183..2748696fbe 100644 --- a/bson/value_writer.go +++ b/bson/value_writer.go @@ -35,7 +35,7 @@ func putValueWriter(vw *valueWriter) { var documentWriterPool = sync.Pool{ New: func() interface{} { - return NewDocumentWriter(nil) + return newDocumentWriter(nil) }, } From 2797876cee475fe9707bea3127a3d980261e4a12 Mon Sep 17 00:00:00 2001 From: Preston Vasquez Date: Thu, 24 Apr 2025 11:16:52 -0600 Subject: [PATCH 08/11] GODRIVER-3533 Use vaueWriter constructor --- bson/value_writer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bson/value_writer.go b/bson/value_writer.go index 74921e4183..2748696fbe 100644 --- a/bson/value_writer.go +++ b/bson/value_writer.go @@ -35,7 +35,7 @@ func putValueWriter(vw *valueWriter) { var documentWriterPool = sync.Pool{ New: func() interface{} { - return NewDocumentWriter(nil) + return newDocumentWriter(nil) }, } From c97c5cc3d547ce54d2c7e11731ddec140532882b Mon Sep 17 00:00:00 2001 From: Preston Vasquez Date: Tue, 29 Apr 2025 16:44:05 -0600 Subject: [PATCH 09/11] GODRIVER-3533 Add get/pug for reader cache --- bson/unmarshal.go | 4 +-- bson/value_reader.go | 55 ++++++++++++++++++++++++++--------------- testdata/specifications | 2 +- 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/bson/unmarshal.go b/bson/unmarshal.go index bf97da23b1..52bd94fed7 100644 --- a/bson/unmarshal.go +++ b/bson/unmarshal.go @@ -42,8 +42,8 @@ type ValueUnmarshaler interface { // When unmarshaling BSON, if the BSON value is null and the Go value is a // pointer, the pointer is set to nil without calling UnmarshalBSONValue. func Unmarshal(data []byte, val interface{}) error { - vr := newDocumentReader(bytes.NewReader(data)) - defer releaseDocumentReader(vr) + vr := getDocumentReader(bytes.NewReader(data)) + defer putDocumentReader(vr) if l, err := vr.peekLength(); err != nil { return err diff --git a/bson/value_reader.go b/bson/value_reader.go index 7c26c41411..237da7ef59 100644 --- a/bson/value_reader.go +++ b/bson/value_reader.go @@ -53,25 +53,7 @@ type valueReader struct { frame int64 } -// NewDocumentReader returns a ValueReader using b for the underlying BSON -// representation. -func NewDocumentReader(r io.Reader) ValueReader { - return newDocumentReader(r) -} - -// newValueReader returns a ValueReader that starts in the Value mode instead of in top -// level document mode. This enables the creation of a ValueReader for a single BSON value. -func newValueReader(t Type, r io.Reader) ValueReader { - vr := newDocumentReader(r) - if len(vr.stack) == 0 { - vr.stack = make([]vrState, 1, 5) - } - vr.stack[0].mode = mValue - vr.stack[0].vType = t - return vr -} - -func newDocumentReader(r io.Reader) *valueReader { +func getDocumentReader(r io.Reader) *valueReader { vr := vrPool.Get().(*valueReader) vr.offset = 0 @@ -87,13 +69,46 @@ func newDocumentReader(r io.Reader) *valueReader { return vr } -func releaseDocumentReader(vr *valueReader) { +func putDocumentReader(vr *valueReader) { + if vr == nil { + return + } + bufioReaderPool.Put(vr.r) vr.r = nil vrPool.Put(vr) } +// NewDocumentReader returns a ValueReader using b for the underlying BSON +// representation. +func NewDocumentReader(r io.Reader) ValueReader { + return newDocumentReader(r) +} + +// newValueReader returns a ValueReader that starts in the Value mode instead of in top +// level document mode. This enables the creation of a ValueReader for a single BSON value. +func newValueReader(t Type, r io.Reader) ValueReader { + vr := newDocumentReader(r) + if len(vr.stack) == 0 { + vr.stack = make([]vrState, 1, 5) + } + vr.stack[0].mode = mValue + vr.stack[0].vType = t + return vr +} + +func newDocumentReader(r io.Reader) *valueReader { + stack := make([]vrState, 1, 5) + stack[0] = vrState{ + mode: mTopLevel, + } + return &valueReader{ + r: bufio.NewReader(r), + stack: stack, + } +} + func (vr *valueReader) advanceFrame() { if vr.frame+1 >= int64(len(vr.stack)) { // We need to grow the stack length := len(vr.stack) diff --git a/testdata/specifications b/testdata/specifications index 43d2c7bacd..6118debee4 160000 --- a/testdata/specifications +++ b/testdata/specifications @@ -1 +1 @@ -Subproject commit 43d2c7bacd62249de8d2173bf8ee39e6fd7a686e +Subproject commit 6118debee41cfd1bca197b315bd1f10ad95f66ae From 5eba4a7ca084764bf5f96f078ac5748221ea331a Mon Sep 17 00:00:00 2001 From: Preston Vasquez Date: Wed, 30 Apr 2025 16:14:24 -0600 Subject: [PATCH 10/11] GODRIVER-3533 reinit entire state --- bson/value_reader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bson/value_reader.go b/bson/value_reader.go index 237da7ef59..d713e669a9 100644 --- a/bson/value_reader.go +++ b/bson/value_reader.go @@ -60,7 +60,7 @@ func getDocumentReader(r io.Reader) *valueReader { vr.frame = 0 vr.stack = vr.stack[:1] - vr.stack[0].mode = mTopLevel + vr.stack[0] = vrState{mode: mTopLevel} br := bufioReaderPool.Get().(*bufio.Reader) br.Reset(r) From d00dd6c7e113bdbb7b33b95a8ddad94961d6c755 Mon Sep 17 00:00:00 2001 From: Preston Vasquez Date: Thu, 1 May 2025 09:00:37 -0600 Subject: [PATCH 11/11] GODRIVER-3533 roll back spec sha --- testdata/specifications | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testdata/specifications b/testdata/specifications index 6118debee4..43d2c7bacd 160000 --- a/testdata/specifications +++ b/testdata/specifications @@ -1 +1 @@ -Subproject commit 6118debee41cfd1bca197b315bd1f10ad95f66ae +Subproject commit 43d2c7bacd62249de8d2173bf8ee39e6fd7a686e