Skip to content

Commit a35c1ae

Browse files
committed
kvclient: fix read-your-own-writes bug in txnWriteBuffer
Previously, we were inadvertently mutating the overlap scan bounds when merging Scan responses with the buffer. This meant that we could miss keys that we should've otherwise seen. Put differently, it was possible for us to miss reading our own writes. I'm surprised we didn't see this before, but I think it's because the b-tree needs to be large enough for us to hit this. Either way, this is now fixed. Epic: none Release note: None
1 parent c78cb00 commit a35c1ae

File tree

2 files changed

+124
-0
lines changed

2 files changed

+124
-0
lines changed

pkg/kv/kvclient/kvcoord/txn_interceptor_write_buffer.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,6 +923,10 @@ func (twb *txnWriteBuffer) mergeBufferAndResp(
923923
it.FirstOverlap(seek)
924924
}
925925
bufferNext := func() {
926+
// NB: we must reset seek before every use, as it's shared across multiple
927+
// methods on the txnWriteBuffer. In particular, it's used by
928+
// maybeServeRead, which we may call below.
929+
seek = twb.seekItemForSpan(respIter.startKey(), respIter.endKey())
926930
if reverse {
927931
it.PrevOverlap(seek)
928932
} else {

pkg/sql/logictest/testdata/logic_test/buffered_writes

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,3 +319,123 @@ Put /Table/114/3/3/2/0 -> /BYTES/
319319

320320
statement ok
321321
RESET vectorize
322+
323+
statement ok
324+
CREATE TABLE uvw (
325+
u INT,
326+
v INT,
327+
w INT
328+
)
329+
330+
statement ok
331+
BEGIN;
332+
INSERT INTO uvw SELECT u, v, w FROM
333+
generate_series(0, 3) AS u,
334+
generate_series(0, 3) AS v,
335+
generate_series(0, 3) AS w;
336+
337+
query I
338+
SELECT count(*) FROM uvw
339+
----
340+
64
341+
342+
statement ok
343+
COMMIT
344+
345+
statement ok
346+
DROP TABLE uvw
347+
348+
statement ok
349+
CREATE TABLE uvw (
350+
u INT,
351+
v INT,
352+
w INT,
353+
INDEX (u,v,w)
354+
)
355+
356+
statement ok
357+
BEGIN;
358+
INSERT INTO uvw SELECT u, v, w FROM
359+
generate_series(0, 3) AS u,
360+
generate_series(0, 3) AS v,
361+
generate_series(0, 3) AS w;
362+
UPDATE uvw SET u = NULL WHERE u = 0;
363+
UPDATE uvw SET v = NULL WHERE v = 0;
364+
UPDATE uvw SET w = NULL WHERE w = 0
365+
366+
query III colnames
367+
SELECT * FROM uvw ORDER BY u, v, w
368+
----
369+
u v w
370+
NULL NULL NULL
371+
NULL NULL 1
372+
NULL NULL 2
373+
NULL NULL 3
374+
NULL 1 NULL
375+
NULL 1 1
376+
NULL 1 2
377+
NULL 1 3
378+
NULL 2 NULL
379+
NULL 2 1
380+
NULL 2 2
381+
NULL 2 3
382+
NULL 3 NULL
383+
NULL 3 1
384+
NULL 3 2
385+
NULL 3 3
386+
1 NULL NULL
387+
1 NULL 1
388+
1 NULL 2
389+
1 NULL 3
390+
1 1 NULL
391+
1 1 1
392+
1 1 2
393+
1 1 3
394+
1 2 NULL
395+
1 2 1
396+
1 2 2
397+
1 2 3
398+
1 3 NULL
399+
1 3 1
400+
1 3 2
401+
1 3 3
402+
2 NULL NULL
403+
2 NULL 1
404+
2 NULL 2
405+
2 NULL 3
406+
2 1 NULL
407+
2 1 1
408+
2 1 2
409+
2 1 3
410+
2 2 NULL
411+
2 2 1
412+
2 2 2
413+
2 2 3
414+
2 3 NULL
415+
2 3 1
416+
2 3 2
417+
2 3 3
418+
3 NULL NULL
419+
3 NULL 1
420+
3 NULL 2
421+
3 NULL 3
422+
3 1 NULL
423+
3 1 1
424+
3 1 2
425+
3 1 3
426+
3 2 NULL
427+
3 2 1
428+
3 2 2
429+
3 2 3
430+
3 3 NULL
431+
3 3 1
432+
3 3 2
433+
3 3 3
434+
435+
statement ok
436+
COMMIT
437+
438+
query I
439+
SELECT count(*) FROM uvw
440+
----
441+
64

0 commit comments

Comments
 (0)