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"
@@ -2460,3 +2465,50 @@ func TestTxnBufferedWritesOmitAbortSpanChecks(t *testing.T) {
2460
2465
require .Error (t , err )
2461
2466
require .Regexp (t , "TransactionRetryWithProtoRefreshError: .*WriteTooOldError" , err )
2462
2467
}
2468
+
2469
+ // TestTxnTracesSplitQueryIntents verifies that the split out QueryIntent
2470
+ // requests are captured in the verbose tracing of a transaction.
2471
+ func TestTxnTracesSplitQueryIntents (t * testing.T ) {
2472
+ defer leaktest .AfterTest (t )()
2473
+ defer log .Scope (t ).Close (t )
2474
+
2475
+ st := cluster .MakeTestingClusterSettings ()
2476
+ tc := testcluster .StartTestCluster (t , 1 , base.TestClusterArgs {
2477
+ ServerArgs : base.TestServerArgs {
2478
+ Settings : st ,
2479
+ },
2480
+ })
2481
+ ctx := context .Background ()
2482
+ defer tc .Stopper ().Stop (ctx )
2483
+ // NB: Disable buffered writes to ensure writes are pipelined, and therefore
2484
+ // there are QueryIntent requests to split.
2485
+ kvcoord .BufferedWritesEnabled .Override (ctx , & st .SV , false )
2486
+
2487
+ db := tc .Server (0 ).DB ()
2488
+
2489
+ tracer := tracing .NewTracer ()
2490
+ traceCtx , sp := tracer .StartSpanCtx (context .Background (), "test-txn" , tracing .WithRecording (tracingpb .RecordingVerbose ))
2491
+
2492
+ if err := db .Txn (traceCtx , func (ctx context.Context , txn * kv.Txn ) error {
2493
+ if err := txn .CPut (ctx , "a" , "val" , nil ); err != nil {
2494
+ return err
2495
+ }
2496
+ if err := txn .Put (ctx , "c" , "d" ); err != nil {
2497
+ return err
2498
+ }
2499
+ return nil
2500
+ }); err != nil {
2501
+ t .Fatal (err )
2502
+ }
2503
+ collectedSpans := sp .FinishAndGetRecording (tracingpb .RecordingVerbose )
2504
+ dump := collectedSpans .String ()
2505
+ // dump:
2506
+ // 0.275ms 0.171ms sending split out pre-commit QueryIntent batch
2507
+ found , err := regexp .MatchString (
2508
+ // The (?s) makes "." match \n. This makes the test resilient to other log
2509
+ // lines being interspersed.
2510
+ `.*sending split out pre-commit QueryIntent batch` ,
2511
+ dump )
2512
+ require .NoError (t , err )
2513
+ require .True (t , found , "didn't match: %s" , dump )
2514
+ }
0 commit comments