github.com/whtcorpsinc/milevadb-prod@v0.0.0-20211104133533-f57f4be3b597/causetstore/milevadb-server/2pc_slow_test.go (about)

     1  // Copyright 2020 WHTCORPS INC, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  //go:build !race
    15  // +build !race
    16  
    17  package einsteindb
    18  
    19  import (
    20  	"context"
    21  	"sync/atomic"
    22  
    23  	. "github.com/whtcorpsinc/check"
    24  	"github.com/whtcorpsinc/milevadb/ekv"
    25  )
    26  
    27  // TestCommitMultipleRegions tests commit multiple regions.
    28  // The test takes too long under the race detector.
    29  func (s *testCommitterSuite) TestCommitMultipleRegions(c *C) {
    30  	m := make(map[string]string)
    31  	for i := 0; i < 100; i++ {
    32  		k, v := randKV(10, 10)
    33  		m[k] = v
    34  	}
    35  	s.mustCommit(c, m)
    36  
    37  	// Test big values.
    38  	m = make(map[string]string)
    39  	for i := 0; i < 50; i++ {
    40  		k, v := randKV(11, txnCommitBatchSize/7)
    41  		m[k] = v
    42  	}
    43  	s.mustCommit(c, m)
    44  }
    45  
    46  func (s *testTiclientSuite) TestSplitRegionIn2PC(c *C) {
    47  	if *WithEinsteinDB {
    48  		c.Skip("scatter will timeout with single node EinsteinDB")
    49  	}
    50  	const preSplitThresholdInTest = 500
    51  	old := atomic.LoadUint32(&preSplitDetectThreshold)
    52  	defer atomic.StoreUint32(&preSplitDetectThreshold, old)
    53  	atomic.StoreUint32(&preSplitDetectThreshold, preSplitThresholdInTest)
    54  
    55  	old = atomic.LoadUint32(&preSplitSizeThreshold)
    56  	defer atomic.StoreUint32(&preSplitSizeThreshold, old)
    57  	atomic.StoreUint32(&preSplitSizeThreshold, 5000)
    58  
    59  	bo := NewBackofferWithVars(context.Background(), 1, nil)
    60  	checkKeyRegion := func(bo *Backoffer, start, end []byte, checker Checker) {
    61  		// Check regions after split.
    62  		loc1, err := s.causetstore.regionCache.LocateKey(bo, start)
    63  		c.Assert(err, IsNil)
    64  		loc2, err := s.causetstore.regionCache.LocateKey(bo, end)
    65  		c.Assert(err, IsNil)
    66  		c.Assert(loc1.Region.id, checker, loc2.Region.id)
    67  	}
    68  	mode := []string{"optimistic", "pessimistic"}
    69  	var (
    70  		startKey []byte
    71  		endKey   []byte
    72  	)
    73  	ctx := context.Background()
    74  	for _, m := range mode {
    75  		if m == "optimistic" {
    76  			startKey = encodeKey(s.prefix, s08d("key", 0))
    77  			endKey = encodeKey(s.prefix, s08d("key", preSplitThresholdInTest))
    78  		} else {
    79  			startKey = encodeKey(s.prefix, s08d("pkey", 0))
    80  			endKey = encodeKey(s.prefix, s08d("pkey", preSplitThresholdInTest))
    81  		}
    82  		// Check before test.
    83  		checkKeyRegion(bo, startKey, endKey, Equals)
    84  		txn := s.beginTxn(c)
    85  		if m == "pessimistic" {
    86  			txn.SetOption(ekv.Pessimistic, true)
    87  			lockCtx := &ekv.LockCtx{}
    88  			lockCtx.ForUFIDelateTS = txn.startTS
    89  			keys := make([]ekv.Key, 0, preSplitThresholdInTest)
    90  			for i := 0; i < preSplitThresholdInTest; i++ {
    91  				keys = append(keys, encodeKey(s.prefix, s08d("pkey", i)))
    92  			}
    93  			err := txn.LockKeys(ctx, lockCtx, keys...)
    94  			c.Assert(err, IsNil)
    95  			checkKeyRegion(bo, startKey, endKey, Not(Equals))
    96  		}
    97  		var err error
    98  		for i := 0; i < preSplitThresholdInTest; i++ {
    99  			if m == "optimistic" {
   100  				err = txn.Set(encodeKey(s.prefix, s08d("key", i)), valueBytes(i))
   101  			} else {
   102  				err = txn.Set(encodeKey(s.prefix, s08d("pkey", i)), valueBytes(i))
   103  			}
   104  			c.Assert(err, IsNil)
   105  		}
   106  		err = txn.Commit(context.Background())
   107  		c.Assert(err, IsNil)
   108  		// Check region split after test.
   109  		checkKeyRegion(bo, startKey, endKey, Not(Equals))
   110  	}
   111  }