diff --git a/pkg/keyspace/keyspace.go b/pkg/keyspace/keyspace.go index 6645d249b15..350b46733fb 100644 --- a/pkg/keyspace/keyspace.go +++ b/pkg/keyspace/keyspace.go @@ -39,6 +39,7 @@ import ( "github.com/tikv/pd/pkg/utils/keypath" "github.com/tikv/pd/pkg/utils/logutil" "github.com/tikv/pd/pkg/utils/syncutil" + "github.com/tikv/pd/pkg/versioninfo/kerneltype" ) const ( @@ -233,6 +234,12 @@ func (manager *Manager) CreateKeyspace(request *CreateKeyspaceRequest) (*keyspac request.Config[UserKindKey] = config[UserKindKey] } } + // Set default value of GCManagementType to KeyspaceLevelGC for NextGen + if kerneltype.IsNextGen() { + if v, ok := request.Config[GCManagementType]; !ok || len(v) == 0 { + request.Config[GCManagementType] = KeyspaceLevelGC + } + } // Create a disabled keyspace meta for tikv-server to get the config on keyspace split. keyspace := &keyspacepb.KeyspaceMeta{ Id: newID, diff --git a/pkg/keyspace/keyspace_test.go b/pkg/keyspace/keyspace_test.go index 1492256ab73..4bea0b4ec91 100644 --- a/pkg/keyspace/keyspace_test.go +++ b/pkg/keyspace/keyspace_test.go @@ -149,6 +149,48 @@ func (suite *keyspaceTestSuite) TestCreateKeyspace() { re.Error(err) } +func (suite *keyspaceTestSuite) TestGCManagementTypeDefaultValue() { + re := suite.Require() + manager := suite.manager + + now := time.Now().Unix() + const classic = `return(false)` + const nextGen = `return(true)` + + type testCase struct { + nextGenFlag string + gcManagementType string + expect string + } + + cases := []testCase{ + {classic, "", ""}, + {classic, UnifiedGC, UnifiedGC}, + {classic, KeyspaceLevelGC, KeyspaceLevelGC}, + {nextGen, "", KeyspaceLevelGC}, + {nextGen, UnifiedGC, UnifiedGC}, + {classic, KeyspaceLevelGC, KeyspaceLevelGC}, + } + defer failpoint.Disable("github.com/tikv/pd/pkg/versioninfo/kerneltype/mockNextGenBuildFlag") + for idx, tc := range cases { + failpoint.Enable("github.com/tikv/pd/pkg/versioninfo/kerneltype/mockNextGenBuildFlag", tc.nextGenFlag) + cfg := make(map[string]string) + if tc.gcManagementType != "" { + cfg[GCManagementType] = tc.gcManagementType + } + req := &CreateKeyspaceRequest{ + Name: fmt.Sprintf("test_gc_management_type_%d", idx), + CreateTime: now, + Config: cfg, + } + created, err := manager.CreateKeyspace(req) + re.NoError(err) + loaded, err := manager.LoadKeyspaceByID(created.Id) + re.NoError(err) + re.Equal(tc.expect, loaded.Config[GCManagementType]) + } +} + func makeCreateKeyspaceByIDRequests(count int) []*CreateKeyspaceByIDRequest { now := time.Now().Unix() requests := make([]*CreateKeyspaceByIDRequest, count) diff --git a/pkg/versioninfo/kerneltype/classic.go b/pkg/versioninfo/kerneltype/classic.go index c96a3012015..35a779c372a 100644 --- a/pkg/versioninfo/kerneltype/classic.go +++ b/pkg/versioninfo/kerneltype/classic.go @@ -16,6 +16,10 @@ package kerneltype +import ( + "github.com/pingcap/failpoint" +) + var ( // KernelType is the current kernel type, which is Classic in this case. KernelType = "Classic" @@ -23,5 +27,10 @@ var ( // IsNextGen returns true if the current kernel type is NextGen. func IsNextGen() bool { + failpoint.Inject("mockNextGenBuildFlag", func(val failpoint.Value) { + if v, ok := val.(bool); ok { + failpoint.Return(v) + } + }) return false } diff --git a/pkg/versioninfo/kerneltype/nextgen.go b/pkg/versioninfo/kerneltype/nextgen.go index d59ced98306..0f5418f7ff8 100644 --- a/pkg/versioninfo/kerneltype/nextgen.go +++ b/pkg/versioninfo/kerneltype/nextgen.go @@ -16,6 +16,10 @@ package kerneltype +import ( + "github.com/pingcap/failpoint" +) + var ( // KernelType is the current kernel type, which is Next Generation in this case. KernelType = "Next Generation" @@ -24,5 +28,10 @@ var ( // IsNextGen returns true if the current kernel type is Next Generation. // see doc.go for more info. func IsNextGen() bool { + failpoint.Inject("mockNextGenBuildFlag", func(val failpoint.Value) { + if v, ok := val.(bool); ok { + failpoint.Return(v) + } + }) return true }