9
9
"bytes"
10
10
"context"
11
11
"fmt"
12
+ "regexp"
12
13
"sort"
13
14
"sync/atomic"
14
15
"testing"
@@ -26,19 +27,23 @@ import (
26
27
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverbase"
27
28
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/tscache"
28
29
"github.com/cockroachdb/cockroach/pkg/roachpb"
30
+ "github.com/cockroachdb/cockroach/pkg/settings/cluster"
29
31
"github.com/cockroachdb/cockroach/pkg/storage"
30
32
"github.com/cockroachdb/cockroach/pkg/storage/enginepb"
31
33
"github.com/cockroachdb/cockroach/pkg/storage/mvccencoding"
32
34
"github.com/cockroachdb/cockroach/pkg/testutils"
33
35
"github.com/cockroachdb/cockroach/pkg/testutils/kvclientutils"
34
36
"github.com/cockroachdb/cockroach/pkg/testutils/localtestcluster"
35
37
"github.com/cockroachdb/cockroach/pkg/testutils/serverutils"
38
+ "github.com/cockroachdb/cockroach/pkg/testutils/testcluster"
36
39
"github.com/cockroachdb/cockroach/pkg/util/admission/admissionpb"
37
40
"github.com/cockroachdb/cockroach/pkg/util/hlc"
38
41
"github.com/cockroachdb/cockroach/pkg/util/leaktest"
39
42
"github.com/cockroachdb/cockroach/pkg/util/log"
40
43
"github.com/cockroachdb/cockroach/pkg/util/randutil"
41
44
"github.com/cockroachdb/cockroach/pkg/util/syncutil"
45
+ "github.com/cockroachdb/cockroach/pkg/util/tracing"
46
+ "github.com/cockroachdb/cockroach/pkg/util/tracing/tracingpb"
42
47
"github.com/cockroachdb/cockroach/pkg/util/uuid"
43
48
"github.com/cockroachdb/errors"
44
49
"github.com/stretchr/testify/require"
@@ -2469,3 +2474,50 @@ func TestTxnBufferedWritesOmitAbortSpanChecks(t *testing.T) {
2469
2474
require .Error (t , err )
2470
2475
require .Regexp (t , "TransactionRetryWithProtoRefreshError: .*WriteTooOldError" , err )
2471
2476
}
2477
+
2478
+ // TestTxnTracesSplitQueryIntents verifies that the split out QueryIntent
2479
+ // requests are captured in the verbose tracing of a transaction.
2480
+ func TestTxnTracesSplitQueryIntents (t * testing.T ) {
2481
+ defer leaktest .AfterTest (t )()
2482
+ defer log .Scope (t ).Close (t )
2483
+
2484
+ st := cluster .MakeTestingClusterSettings ()
2485
+ tc := testcluster .StartTestCluster (t , 1 , base.TestClusterArgs {
2486
+ ServerArgs : base.TestServerArgs {
2487
+ Settings : st ,
2488
+ },
2489
+ })
2490
+ ctx := context .Background ()
2491
+ defer tc .Stopper ().Stop (ctx )
2492
+ // NB: Disable buffered writes to ensure writes are pipelined, and therefore
2493
+ // there are QueryIntent requests to split.
2494
+ kvcoord .BufferedWritesEnabled .Override (ctx , & st .SV , false )
2495
+
2496
+ db := tc .Server (0 ).DB ()
2497
+
2498
+ tracer := tracing .NewTracer ()
2499
+ traceCtx , sp := tracer .StartSpanCtx (context .Background (), "test-txn" , tracing .WithRecording (tracingpb .RecordingVerbose ))
2500
+
2501
+ if err := db .Txn (traceCtx , func (ctx context.Context , txn * kv.Txn ) error {
2502
+ if err := txn .CPut (ctx , "a" , "val" , nil ); err != nil {
2503
+ return err
2504
+ }
2505
+ if err := txn .Put (ctx , "c" , "d" ); err != nil {
2506
+ return err
2507
+ }
2508
+ return nil
2509
+ }); err != nil {
2510
+ t .Fatal (err )
2511
+ }
2512
+ collectedSpans := sp .FinishAndGetRecording (tracingpb .RecordingVerbose )
2513
+ dump := collectedSpans .String ()
2514
+ // dump:
2515
+ // 0.275ms 0.171ms sending split out pre-commit QueryIntent batch
2516
+ found , err := regexp .MatchString (
2517
+ // The (?s) makes "." match \n. This makes the test resilient to other log
2518
+ // lines being interspersed.
2519
+ `.*sending split out pre-commit QueryIntent batch` ,
2520
+ dump )
2521
+ require .NoError (t , err )
2522
+ require .True (t , found , "didn't match: %s" , dump )
2523
+ }
0 commit comments