@@ -5911,6 +5911,115 @@ func TestLeaseTransferReplicatesLocks(t *testing.T) {
59115911 require .NoError (t , g .Wait ())
59125912}
59135913
5914+ func TestLeaseTransferDropsLocksIfLargerThanCommandSize (t * testing.T ) {
5915+ defer leaktest .AfterTest (t )()
5916+ defer log .Scope (t ).Close (t )
5917+
5918+ require .NoError (t , log .SetVModule ("cmd_lease=2" ))
5919+
5920+ // Test Plan:
5921+ //
5922+ // - Reduce MaxRaftCommandSize
5923+ // - Move scratch range to known location.
5924+ // - Take out a large number of unreplicated locks
5925+ // - Transfer lease without an error
5926+ //
5927+ ctx := context .Background ()
5928+ st := cluster .MakeClusterSettings ()
5929+ concurrency .UnreplicatedLockReliabilityLeaseTransfer .Override (ctx , & st .SV , true )
5930+ kvserverbase .MaxCommandSize .Override (ctx , & st .SV , 1 << 20 )
5931+ // To see the test fail:
5932+ // concurrency.MaxLockFlushSize.Override(ctx, &st.SV, 2<<20)
5933+
5934+ tc := testcluster .StartTestCluster (t , 3 , base.TestClusterArgs {
5935+ ServerArgs : base.TestServerArgs {Settings : st },
5936+ })
5937+ defer tc .Stopper ().Stop (ctx )
5938+
5939+ scratch := tc .ScratchRange (t )
5940+ desc , err := tc .LookupRange (scratch )
5941+ require .NoError (t , err )
5942+
5943+ // Start with the lease on store 1.
5944+ t .Logf ("transfering to s1" )
5945+ require .NoError (t , tc .TransferRangeLease (desc , tc .Target (0 )))
5946+ t .Logf ("done transfering to s1" )
5947+
5948+ mkRandomScratchKey := func () roachpb.Key {
5949+ return append (scratch .Clone (), uuid .MakeV4 ().String ()... )
5950+ }
5951+
5952+ numLocks := 9000
5953+ txn := tc .Server (1 ).DB ().NewTxn (ctx , "test-lots-o-locks" )
5954+ b := txn .NewBatch ()
5955+ for range numLocks {
5956+ b .GetForUpdate (mkRandomScratchKey (), kvpb .BestEffort )
5957+ b .Requests ()[len (b .Requests ())- 1 ].GetGet ().LockNonExisting = true
5958+ }
5959+ require .NoError (t , txn .Run (ctx , b ))
5960+
5961+ t .Log ("transfering lease from s1 -> s2" )
5962+ require .NoError (t , tc .TransferRangeLease (desc , tc .Target (1 )))
5963+ }
5964+
5965+ func TestMergeDropsLocksIfLargerThanMax (t * testing.T ) {
5966+ defer leaktest .AfterTest (t )()
5967+ defer log .Scope (t ).Close (t )
5968+
5969+ require .NoError (t , log .SetVModule ("cmd_subsume=2" ))
5970+
5971+ // Test Plan:
5972+ //
5973+ // - Reduce MaxRaftCommandSize
5974+ // - Move scratch range to known location.
5975+ // - Take out a large number of unreplicated locks
5976+ // - Merge range without an error
5977+ //
5978+ var (
5979+ splitPoint = "b"
5980+ ctx = context .Background ()
5981+ st = cluster .MakeClusterSettings ()
5982+ )
5983+
5984+ concurrency .UnreplicatedLockReliabilityMerge .Override (ctx , & st .SV , true )
5985+ kvserverbase .MaxCommandSize .Override (ctx , & st .SV , 1 << 20 )
5986+ // To see the test fail:
5987+ // concurrency.MaxLockFlushSize.Override(ctx, &st.SV, 2<<20)
5988+
5989+ tc := testcluster .StartTestCluster (t , 1 , base.TestClusterArgs {
5990+ ServerArgs : base.TestServerArgs {Settings : st },
5991+ })
5992+ defer tc .Stopper ().Stop (ctx )
5993+
5994+ scratch := tc .ScratchRange (t )
5995+
5996+ mkKey := func (s string ) roachpb.Key {
5997+ prefix := scratch .Clone ()
5998+ return append (prefix [:len (prefix ):len (prefix )], s ... )
5999+ }
6000+
6001+ splitKey := mkKey (splitPoint )
6002+ tc .SplitRangeOrFatal (t , splitKey )
6003+
6004+ mkRandomScratchKey := func () roachpb.Key {
6005+ return append (mkKey (splitPoint ), uuid .MakeV4 ().String ()... )
6006+ }
6007+
6008+ numLocks := 6000
6009+ txn := tc .Server (0 ).DB ().NewTxn (ctx , "test-lots-o-locks" )
6010+ b := txn .NewBatch ()
6011+ for range numLocks {
6012+ b .GetForUpdate (mkRandomScratchKey (), kvpb .BestEffort )
6013+ b .Requests ()[len (b .Requests ())- 1 ].GetGet ().LockNonExisting = true
6014+ }
6015+ require .NoError (t , txn .Run (ctx , b ))
6016+
6017+ // Merge Range
6018+ t .Logf ("merging range %s" , scratch )
6019+ _ , err := tc .MergeRanges (scratch )
6020+ require .NoError (t , err )
6021+ }
6022+
59146023func TestMergeReplicatesLocks (t * testing.T ) {
59156024 defer leaktest .AfterTest (t )()
59166025 defer log .Scope (t ).Close (t )
0 commit comments