@@ -46,6 +46,7 @@ import (
4646 "github.com/tikv/pd/pkg/utils/etcdutil"
4747 "github.com/tikv/pd/pkg/utils/keypath"
4848 "github.com/tikv/pd/pkg/utils/testutil"
49+ "github.com/tikv/pd/pkg/versioninfo/kerneltype"
4950 "github.com/tikv/pd/server/config"
5051)
5152
@@ -89,10 +90,24 @@ func TestGCStateManager(t *testing.T) {
8990type newGCStateManagerForTestOptions struct {
9091 // Nil for generating initial keyspaces by the default preset
9192 // Non-nil (including empty) for generating specified keyspaces
92- specifyInitialKeyspaces []* keyspace.CreateKeyspaceRequest
93+ specifyInitialKeyspaces []* keyspace.CreateKeyspaceByIDRequest
9394 etcdServerCfgModifier func (cfg * embed.Config )
9495}
9596
97+ func (opt * newGCStateManagerForTestOptions ) generateKeyspacesByCount (count int ) {
98+ createTime := time .Now ().Unix ()
99+ for i := range count {
100+ id := new (uint32 )
101+ * id = uint32 (i + 1 )
102+ opt .specifyInitialKeyspaces = append (opt .specifyInitialKeyspaces , & keyspace.CreateKeyspaceByIDRequest {
103+ ID : id ,
104+ Name : fmt .Sprintf ("ks%d" , * id ),
105+ Config : map [string ]string {keyspace .GCManagementType : keyspace .KeyspaceLevelGC },
106+ CreateTime : createTime ,
107+ })
108+ }
109+ }
110+
96111func newGCStateManagerForTest (t testing.TB , opt newGCStateManagerForTestOptions ) (storage * endpoint.StorageEndpoint , provider endpoint.GCStateProvider , gcStateManager * GCStateManager , clean func (), cancel context.CancelFunc ) {
97112 cfg := config .NewConfig ()
98113 re := require .New (t )
@@ -126,31 +141,40 @@ func newGCStateManagerForTest(t testing.TB, opt newGCStateManagerForTestOptions)
126141
127142 // keyspaceID 0 exists automatically after bootstrapping.
128143 if opt .specifyInitialKeyspaces == nil {
129- ks1 , err := keyspaceManager .CreateKeyspace (& keyspace.CreateKeyspaceRequest {
144+ id := new (uint32 )
145+ * id = 1
146+ ks1 , err := keyspaceManager .CreateKeyspaceByID (& keyspace.CreateKeyspaceByIDRequest {
147+ ID : id ,
130148 Name : "ks1" ,
131149 Config : map [string ]string {"gc_management_type" : "unified" },
132150 CreateTime : time .Now ().Unix (),
133151 })
134152 re .NoError (err )
135153 re .Equal (uint32 (1 ), ks1 .Id )
136154
137- ks2 , err := keyspaceManager .CreateKeyspace (& keyspace.CreateKeyspaceRequest {
155+ * id = 2
156+ ks2 , err := keyspaceManager .CreateKeyspaceByID (& keyspace.CreateKeyspaceByIDRequest {
157+ ID : id ,
138158 Name : "ks2" ,
139159 Config : map [string ]string {"gc_management_type" : "keyspace_level" },
140160 CreateTime : time .Now ().Unix (),
141161 })
142162 re .NoError (err )
143163 re .Equal (uint32 (2 ), ks2 .Id )
144164
145- ks3 , err := keyspaceManager .CreateKeyspace (& keyspace.CreateKeyspaceRequest {
165+ * id = 3
166+ ks3 , err := keyspaceManager .CreateKeyspaceByID (& keyspace.CreateKeyspaceByIDRequest {
167+ ID : id ,
146168 Name : "ks3" ,
147169 Config : map [string ]string {},
148170 CreateTime : time .Now ().Unix (),
149171 })
150172 re .NoError (err )
151173 re .Equal (uint32 (3 ), ks3 .Id )
152174
153- ks4 , err := keyspaceManager .CreateKeyspace (& keyspace.CreateKeyspaceRequest {
175+ * id = 4
176+ ks4 , err := keyspaceManager .CreateKeyspaceByID (& keyspace.CreateKeyspaceByIDRequest {
177+ ID : id ,
154178 Name : "ks4" ,
155179 Config : map [string ]string {},
156180 CreateTime : time .Now ().Unix (),
@@ -161,7 +185,7 @@ func newGCStateManagerForTest(t testing.TB, opt newGCStateManagerForTestOptions)
161185 re .Equal (uint32 (4 ), ks4 .Id )
162186 } else {
163187 for _ , req := range opt .specifyInitialKeyspaces {
164- _ , err := keyspaceManager .CreateKeyspace (req )
188+ _ , err := keyspaceManager .CreateKeyspaceByID (req )
165189 re .NoError (err )
166190 }
167191 }
@@ -1839,7 +1863,7 @@ func (s *gcStateManagerTestSuite) TestGetAllKeyspacesMaxTxnSafePoint() {
18391863 var keyspaceID uint32
18401864 err := s .provider .RunInGCStateTransaction (func (wb * endpoint.GCStateWriteBatch ) error {
18411865 var err1 error
1842- txnSafePoint , keyspaceName , keyspaceID , err1 = s .manager .getAllKeyspacesMaxTxnSafePoint (wb )
1866+ txnSafePoint , keyspaceName , keyspaceID , err1 = s .manager .getMaxTxnSafePointAmongAllKeyspaces (wb )
18431867 return err1
18441868 })
18451869 re .NoError (err )
@@ -1854,7 +1878,7 @@ func (s *gcStateManagerTestSuite) TestGetAllKeyspacesMaxTxnSafePoint() {
18541878 }
18551879 err = s .provider .RunInGCStateTransaction (func (wb * endpoint.GCStateWriteBatch ) error {
18561880 var err1 error
1857- txnSafePoint , keyspaceName , keyspaceID , err1 = s .manager .getAllKeyspacesMaxTxnSafePoint (wb )
1881+ txnSafePoint , keyspaceName , keyspaceID , err1 = s .manager .getMaxTxnSafePointAmongAllKeyspaces (wb )
18581882 return err1
18591883 })
18601884 re .NoError (err )
@@ -2030,22 +2054,108 @@ func (s *gcStateManagerTestSuite) TestGetAllKeyspacesGCStatesConcurrentCallShari
20302054 re .Equal (int64 (2 ), executionCount .Load ())
20312055}
20322056
2057+ func TestGetAllKeysapcesGCStatesOnTooManyKeyspaces (t * testing.T ) {
2058+ re := require .New (t )
2059+
2060+ const totalKeyspaces = keyspace .IteratorLoadingBatchSize * 3
2061+
2062+ opt := newGCStateManagerForTestOptions {
2063+ specifyInitialKeyspaces : make ([]* keyspace.CreateKeyspaceByIDRequest , 0 , totalKeyspaces ),
2064+ }
2065+ opt .generateKeyspacesByCount (totalKeyspaces )
2066+
2067+ _ , _ , gcStateManager , clean , cancel := newGCStateManagerForTest (t , opt )
2068+ defer func () {
2069+ cancel ()
2070+ clean ()
2071+ }()
2072+
2073+ gcStates , err := gcStateManager .GetAllKeyspacesGCStates (context .Background ())
2074+ re .Len (gcStates , totalKeyspaces + 2 ) // Including the null keyspace, the default keyspace or the system keyspace.
2075+
2076+ re .NoError (err )
2077+ keyspaceIDs := make ([]uint32 , 0 , len (gcStates ))
2078+ for keyspaceID , gcState := range gcStates {
2079+ re .Equal (keyspaceID , gcState .KeyspaceID )
2080+ keyspaceIDs = append (keyspaceIDs , keyspaceID )
2081+ }
2082+ slices .Sort (keyspaceIDs )
2083+
2084+ expectedKeyspaceIDs := make ([]uint32 , 0 , len (gcStates ))
2085+ if ! kerneltype .IsNextGen () {
2086+ expectedKeyspaceIDs = append (expectedKeyspaceIDs , constant .DefaultKeyspaceID )
2087+ }
2088+ for i := range totalKeyspaces {
2089+ expectedKeyspaceIDs = append (expectedKeyspaceIDs , uint32 (i + 1 ))
2090+ }
2091+ if kerneltype .IsNextGen () {
2092+ expectedKeyspaceIDs = append (expectedKeyspaceIDs , constant .SystemKeyspaceID )
2093+ }
2094+ expectedKeyspaceIDs = append (expectedKeyspaceIDs , constant .NullKeyspaceID )
2095+ re .Equal (expectedKeyspaceIDs , keyspaceIDs )
2096+ }
2097+
2098+ func TestGetMaxTxnSafePointAmongAllKeyspacesOnTooManyKeyspaces (t * testing.T ) {
2099+ re := require .New (t )
2100+
2101+ const totalKeyspaces = keyspace .IteratorLoadingBatchSize * 2
2102+
2103+ opt := newGCStateManagerForTestOptions {
2104+ specifyInitialKeyspaces : make ([]* keyspace.CreateKeyspaceByIDRequest , 0 , totalKeyspaces ),
2105+ }
2106+ opt .generateKeyspacesByCount (totalKeyspaces )
2107+
2108+ _ , _ , gcStateManager , clean , cancel := newGCStateManagerForTest (t , opt )
2109+ defer func () {
2110+ cancel ()
2111+ clean ()
2112+ }()
2113+
2114+ now := time .Now ()
2115+ // Test around the boundary of two loading batches, so that it's likely to detect incorrectness when loading
2116+ // multiple batches.
2117+ for i := keyspace .IteratorLoadingBatchSize - 5 ; i <= keyspace .IteratorLoadingBatchSize + 5 ; i ++ {
2118+ keyspaceID := uint32 (i )
2119+ newTxnSafePoint := uint64 (i )
2120+ res , err := gcStateManager .AdvanceTxnSafePoint (keyspaceID , newTxnSafePoint , now )
2121+ re .NoError (err )
2122+ re .Equal (newTxnSafePoint , res .NewTxnSafePoint )
2123+
2124+ var maxTxnSafePoint uint64
2125+ var keyspaceIDWithMaxTxnSafePoint uint32
2126+ var keyspaceNameWithMaxTxnSafePoint string
2127+ err = gcStateManager .gcMetaStorage .RunInGCStateTransaction (func (wb * endpoint.GCStateWriteBatch ) error {
2128+ var err1 error
2129+ maxTxnSafePoint , keyspaceNameWithMaxTxnSafePoint , keyspaceIDWithMaxTxnSafePoint , err1 = gcStateManager .getMaxTxnSafePointAmongAllKeyspaces (wb )
2130+ return err1
2131+ })
2132+ re .NoError (err )
2133+ re .Equal (newTxnSafePoint , maxTxnSafePoint )
2134+ re .Equal (keyspaceID , keyspaceIDWithMaxTxnSafePoint )
2135+ re .Equal (fmt .Sprintf ("ks%d" , keyspaceID ), keyspaceNameWithMaxTxnSafePoint )
2136+ }
2137+ }
2138+
20332139func benchmarkGetAllKeyspacesGCStatesImpl (b * testing.B , keyspacesCount int , parallelism int ) {
20342140 re := require .New (b )
20352141 fname := testutil .InitTempFileLogger ("info" )
20362142 defer os .Remove (fname )
20372143
20382144 opt := newGCStateManagerForTestOptions {
2039- specifyInitialKeyspaces : make ([]* keyspace.CreateKeyspaceRequest , 0 , keyspacesCount ),
2145+ specifyInitialKeyspaces : make ([]* keyspace.CreateKeyspaceByIDRequest , 0 , keyspacesCount ),
20402146 etcdServerCfgModifier : func (cfg * embed.Config ) {
20412147 cfg .LogOutputs = []string {fname }
20422148 },
20432149 }
2150+ createTime := time .Now ().Unix ()
20442151 for i := range keyspacesCount {
2045- opt .specifyInitialKeyspaces = append (opt .specifyInitialKeyspaces , & keyspace.CreateKeyspaceRequest {
2046- Name : fmt .Sprintf ("ks%d" , i ),
2152+ id := new (uint32 )
2153+ * id = uint32 (i + 1 )
2154+ opt .specifyInitialKeyspaces = append (opt .specifyInitialKeyspaces , & keyspace.CreateKeyspaceByIDRequest {
2155+ ID : id ,
2156+ Name : fmt .Sprintf ("ks%d" , * id ),
20472157 Config : map [string ]string {keyspace .GCManagementType : keyspace .KeyspaceLevelGC },
2048- CreateTime : time . Now (). Unix () ,
2158+ CreateTime : createTime ,
20492159 })
20502160 }
20512161
0 commit comments