From 54ce07d239f50caf5d01ab84c503c1a0ff75e91c Mon Sep 17 00:00:00 2001
From: yoheimuta Index is the pool’s index within the (cell,type) pair.
+This field is optional, and defaults to 0.
+Assigning different numbers to this field enables the existence of multiple pools with a specific tablet type in a given cell,
+which can be beneficial for unmanaged tablets. TabletPools specify groups of tablets in a given cell with a certain
tablet type and a shared configuration template. There must be at most one pool in this list for each (cell,type) pair.
+ There must be at most one pool in this list for each (cell,type,index) set.
Each shard must have at least one “replica” pool (in at least one cell)
in order to be able to serve. Index is the pool’s index within the (cell,type) pair.
-This field is optional, and defaults to 0.
-Assigning different numbers to this field enables the existence of multiple pools with a specific tablet type in a given cell,
+ Name is the pool’s unique name within the (cell,type) pair.
+This field is optional, and defaults to an empty.
+Assigning different names to this field enables the existence of multiple pools with a specific tablet type in a given cell,
which can be beneficial for unmanaged tablets. TabletPools specify groups of tablets in a given cell with a certain
tablet type and a shared configuration template. There must be at most one pool in this list for each (cell,type,index) set.
+ There must be at most one pool in this list for each (cell,type,name) set.
Each shard must have at least one “replica” pool (in at least one cell)
in order to be able to serve. Name is the pool’s unique name within the (cell,type) pair.
This field is optional, and defaults to an empty.
Assigning different names to this field enables the existence of multiple pools with a specific tablet type in a given cell,
-which can be beneficial for unmanaged tablets.VitessShardTabletPool
+
+
+index
+
+int32
+
+
+
+
+
replicas
int32
@@ -7329,7 +7343,7 @@ VitessShardTemplate
diff --git a/pkg/apis/planetscale/v2/labels.go b/pkg/apis/planetscale/v2/labels.go
index 869147a0..88655180 100644
--- a/pkg/apis/planetscale/v2/labels.go
+++ b/pkg/apis/planetscale/v2/labels.go
@@ -35,6 +35,8 @@ const (
TabletUidLabel = LabelPrefix + "/" + "tablet-uid"
// TabletTypeLabel is the key for identifying the Vitess target tablet type for a Pod.
TabletTypeLabel = LabelPrefix + "/" + "tablet-type"
+ // TabletTypeLabel is the key for identifying the Vitess target pool index within the (cell,type) pair.
+ TabletPoolIndexLabel = LabelPrefix + "/" + "pool-index"
// TabletIndexLabel is the key for identifying the index of a Vitess tablet within its pool.
TabletIndexLabel = LabelPrefix + "/" + "tablet-index"
diff --git a/pkg/apis/planetscale/v2/vitessshard_methods.go b/pkg/apis/planetscale/v2/vitessshard_methods.go
index 35339544..6605c8c8 100644
--- a/pkg/apis/planetscale/v2/vitessshard_methods.go
+++ b/pkg/apis/planetscale/v2/vitessshard_methods.go
@@ -58,9 +58,9 @@ func (t *VitessTabletPoolType) InitTabletType() string {
}
}
-// IsMatch indicates whether a tablet pool matches another tablet pool's type and cell.
+// IsMatch indicates whether a tablet pool matches another tablet pool's type, cell and index.
func (t *VitessShardTabletPool) IsMatch(inputPool *VitessShardTabletPool) bool {
- return t.Type == inputPool.Type && t.Cell == inputPool.Cell
+ return t.Type == inputPool.Type && t.Cell == inputPool.Cell && t.Index == inputPool.Index
}
// UsingExternalDatastore indicates whether the VitessShard Spec is using
diff --git a/pkg/apis/planetscale/v2/vitessshard_types.go b/pkg/apis/planetscale/v2/vitessshard_types.go
index 2f739d94..e8b0efd0 100644
--- a/pkg/apis/planetscale/v2/vitessshard_types.go
+++ b/pkg/apis/planetscale/v2/vitessshard_types.go
@@ -105,7 +105,7 @@ type VitessShardTemplate struct {
// TabletPools specify groups of tablets in a given cell with a certain
// tablet type and a shared configuration template.
//
- // There must be at most one pool in this list for each (cell,type) pair.
+ // There must be at most one pool in this list for each (cell,type,index) set.
// Each shard must have at least one "replica" pool (in at least one cell)
// in order to be able to serve.
// +patchMergeKey=type
@@ -113,6 +113,7 @@ type VitessShardTemplate struct {
// +listType=map
// +listMapKey=type
// +listMapKey=cell
+ // +listMapKey=index
TabletPools []VitessShardTabletPool `json:"tabletPools,omitempty" patchStrategy:"merge" patchMergeKey:"type"`
// DatabaseInitScriptSecret specifies the init_db.sql script file to use for this shard.
@@ -170,6 +171,14 @@ type VitessShardTabletPool struct {
// +kubebuilder:validation:Enum=replica;rdonly;externalmaster;externalreplica;externalrdonly
Type VitessTabletPoolType `json:"type"`
+ // Index is the pool's index within the (cell,type) pair.
+ // This field is optional, and defaults to 0.
+ // Assigning different numbers to this field enables the existence of multiple pools with a specific tablet type in a given cell,
+ // which can be beneficial for unmanaged tablets.
+ // +kubebuilder:default=0
+ // +kubebuilder:validation:Minimum=0
+ Index int32 `json:"index,omitempty"`
+
// Replicas is the number of tablets to deploy in this pool.
// This field is required, although it may be set to 0,
// which will scale the pool down to 0 tablets.
diff --git a/pkg/controller/vitessshard/reconcile_disk.go b/pkg/controller/vitessshard/reconcile_disk.go
index 3a5c1275..7d95790c 100644
--- a/pkg/controller/vitessshard/reconcile_disk.go
+++ b/pkg/controller/vitessshard/reconcile_disk.go
@@ -53,6 +53,9 @@ func (r *ReconcileVitessShard) reconcileDisk(ctx context.Context, vts *planetsca
continue
}
+ // In cases where there are multiple pools with the same tablet type in a given cell,
+ // there is a possibility of processing the same tablet multiple times.
+ // We permit this to occur as it is practically harmless and simplifies implementation.
poolTablets, err := tabletKeysForPool(vts, tabletPool.Cell, tabletPool.Type)
if err != nil {
return resultBuilder.Error(err)
@@ -129,6 +132,8 @@ func (r *ReconcileVitessShard) claimForTabletPod(ctx context.Context, pod *v1.Po
return pvc, nil
}
+// tabletKeysForPool returns the list of targetKeys for a given pool type and cell.
+// Note that this function does not care about the pool's index assignment.
func tabletKeysForPool(vts *planetscalev2.VitessShard, poolCell string, poolType planetscalev2.VitessTabletPoolType) ([]string, error) {
tabletKeys := vts.Status.TabletAliases()
diff --git a/pkg/controller/vitessshard/reconcile_tablets.go b/pkg/controller/vitessshard/reconcile_tablets.go
index 762e6512..d995fec1 100644
--- a/pkg/controller/vitessshard/reconcile_tablets.go
+++ b/pkg/controller/vitessshard/reconcile_tablets.go
@@ -284,6 +284,11 @@ func vttabletSpecs(vts *planetscalev2.VitessShard, parentLabels map[string]strin
Uid: vttablet.UID(pool.Cell, keyspaceName, vts.Spec.KeyRange, pool.Type, uint32(tabletIndex)),
}
+ // If TabletPools has multiple pools within the same (cell,type) pair, we need to add a pool index to the UID generator.
+ if 0 < pool.Index {
+ tabletAlias.Uid = vttablet.UIDWithPoolIndex(pool.Cell, keyspaceName, vts.Spec.KeyRange, pool.Type, uint32(tabletIndex), uint32(pool.Index))
+ }
+
// Copy parent labels map and add tablet-specific labels.
labels := make(map[string]string, len(parentLabels)+4)
for k, v := range parentLabels {
@@ -292,6 +297,7 @@ func vttabletSpecs(vts *planetscalev2.VitessShard, parentLabels map[string]strin
labels[planetscalev2.CellLabel] = tabletAlias.Cell
labels[planetscalev2.TabletUidLabel] = strconv.FormatUint(uint64(tabletAlias.Uid), 10)
labels[planetscalev2.TabletTypeLabel] = string(pool.Type)
+ labels[planetscalev2.TabletPoolIndexLabel] = strconv.FormatUint(uint64(pool.Index), 10)
labels[planetscalev2.TabletIndexLabel] = strconv.FormatUint(uint64(tabletIndex), 10)
// Merge ExtraVitessFlags into the tablet spec ExtraFlags field.
diff --git a/pkg/operator/vttablet/uid.go b/pkg/operator/vttablet/uid.go
index a768c8dd..690a38e1 100644
--- a/pkg/operator/vttablet/uid.go
+++ b/pkg/operator/vttablet/uid.go
@@ -43,7 +43,8 @@ lead time to develop a smarter way to handle tablet identity and MySQL server
IDs in Vitess itself.
WARNING: DO NOT change the behavior of this function, as that may result in
- the deletion and recreation of all tablets.
+
+ the deletion and recreation of all tablets.
*/
func UID(cellName, keyspaceName string, shardKeyRange planetscalev2.VitessKeyRange, tabletPoolType planetscalev2.VitessTabletPoolType, tabletIndex uint32) uint32 {
h := md5.New()
@@ -51,3 +52,21 @@ func UID(cellName, keyspaceName string, shardKeyRange planetscalev2.VitessKeyRan
sum := h.Sum(nil)
return binary.BigEndian.Uint32(sum[:4])
}
+
+/*
+UIDWithPoolIndex function generates a 32-bit unsigned integer similar to the UID function above.
+
+However, it additionally takes the poolIndex as an input.
+This allows the generation of a unique UID for a tablet that belongs to a different pool
+but shares other common attributes.
+
+To preserve the existing UID, it is recommended to use the UID function instead of this function
+when the poolIndex is set to its default value of 0.
+*/
+func UIDWithPoolIndex(cellName, keyspaceName string, shardKeyRange planetscalev2.VitessKeyRange,
+ tabletPoolType planetscalev2.VitessTabletPoolType, tabletIndex uint32, poolIndex uint32) uint32 {
+ h := md5.New()
+ fmt.Fprintln(h, cellName, keyspaceName, shardKeyRange.String(), string(tabletPoolType), tabletIndex, poolIndex)
+ sum := h.Sum(nil)
+ return binary.BigEndian.Uint32(sum[:4])
+}
diff --git a/pkg/operator/vttablet/uid_test.go b/pkg/operator/vttablet/uid_test.go
index 4a0765df..e3e88938 100644
--- a/pkg/operator/vttablet/uid_test.go
+++ b/pkg/operator/vttablet/uid_test.go
@@ -38,3 +38,21 @@ func TestUIDHash(t *testing.T) {
t.Fatalf("UID() = %v, want %v", got, want)
}
}
+
+// TestUIDWithPoolIndexHash checks that nobody changed the hash function for UIDWithPoolIndex().
+func TestUIDWithPoolIndexHash(t *testing.T) {
+ cell := "cell"
+ keyspace := "keyspace"
+ keyRange := planetscalev2.VitessKeyRange{Start: "10", End: "20"}
+ tabletType := planetscalev2.ReplicaPoolType
+ tabletIndex := uint32(1)
+ poolIndex := uint32(1)
+
+ // DO NOT CHANGE THIS VALUE!
+ // This is intentionally a change-detection test. If it breaks, you messed up.
+ want := uint32(3840445776)
+
+ if got := UIDWithPoolIndex(cell, keyspace, keyRange, tabletType, tabletIndex, poolIndex); got != want {
+ t.Fatalf("UIDWithPoolIndex() = %v, want %v", got, want)
+ }
+}
diff --git a/test/integration/vitesscluster/vitesscluster_test.go b/test/integration/vitesscluster/vitesscluster_test.go
index ac59b19a..abc0dc20 100644
--- a/test/integration/vitesscluster/vitesscluster_test.go
+++ b/test/integration/vitesscluster/vitesscluster_test.go
@@ -66,6 +66,16 @@ spec:
resources:
requests:
storage: 1Gi
+ - cell: cell2
+ type: rdonly
+ index: 1
+ replicas: 3
+ mysqld: {}
+ dataVolumeClaimTemplate:
+ accessModes: [ReadWriteOnce]
+ resources:
+ requests:
+ storage: 1Gi
- equal:
parts: 1
shardTemplate:
@@ -181,9 +191,9 @@ func verifyBasicVitessKeyspace(f *framework.Fixture, ns, cluster, keyspace strin
f.MustGet(ns, names.JoinWithConstraints(names.DefaultConstraints, cluster, keyspace), &planetscalev2.VitessKeyspace{})
// VitessKeyspaces create VitessShards.
- verifyBasicVitessShard(f, ns, cluster, keyspace, "x-80", []int{3, 3, 0})
- verifyBasicVitessShard(f, ns, cluster, keyspace, "80-x", []int{3, 3, 0})
- verifyBasicVitessShard(f, ns, cluster, keyspace, "x-x", []int{0, 0, 3})
+ verifyBasicVitessShard(f, ns, cluster, keyspace, "x-80", []int{3, 3, 3, 0})
+ verifyBasicVitessShard(f, ns, cluster, keyspace, "80-x", []int{3, 3, 3, 0})
+ verifyBasicVitessShard(f, ns, cluster, keyspace, "x-x", []int{0, 0, 0, 3})
}
func verifyBasicVitessShard(f *framework.Fixture, ns, cluster, keyspace, shard string, expectedTabletCount []int) {
@@ -192,16 +202,20 @@ func verifyBasicVitessShard(f *framework.Fixture, ns, cluster, keyspace, shard s
// VitessShard creates vttablet Pods.
cell1Pods := f.ExpectPods(&client.ListOptions{
Namespace: ns,
- LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell1", "replica"),
+ LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell1", "replica", "0"),
}, expectedTabletCount[0])
cell2Pods := f.ExpectPods(&client.ListOptions{
Namespace: ns,
- LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell2", "rdonly"),
+ LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell2", "rdonly", "0"),
}, expectedTabletCount[1])
- cell3Pods := f.ExpectPods(&client.ListOptions{
+ cell2_1_Pods := f.ExpectPods(&client.ListOptions{
Namespace: ns,
- LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell3", "replica"),
+ LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell2", "rdonly", "1"),
}, expectedTabletCount[2])
+ cell3Pods := f.ExpectPods(&client.ListOptions{
+ Namespace: ns,
+ LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell3", "replica", "0"),
+ }, expectedTabletCount[3])
// Each vttablet Pod should have a PVC.
for i := range cell1Pods.Items {
@@ -210,6 +224,9 @@ func verifyBasicVitessShard(f *framework.Fixture, ns, cluster, keyspace, shard s
for i := range cell2Pods.Items {
f.MustGet(ns, cell2Pods.Items[i].Name, &corev1.PersistentVolumeClaim{})
}
+ for i := range cell2_1_Pods.Items {
+ f.MustGet(ns, cell2_1_Pods.Items[i].Name, &corev1.PersistentVolumeClaim{})
+ }
for i := range cell3Pods.Items {
f.MustGet(ns, cell3Pods.Items[i].Name, &corev1.PersistentVolumeClaim{})
}
@@ -219,7 +236,7 @@ func verifyBasicVitessShard(f *framework.Fixture, ns, cluster, keyspace, shard s
f.MustGet(ns, names.JoinWithConstraints(names.DefaultConstraints, cluster, keyspace, shard, "vtbackup", "init"), &corev1.PersistentVolumeClaim{})
}
-func tabletPodSelector(cluster, keyspace, shard, cell, tabletType string) apilabels.Selector {
+func tabletPodSelector(cluster, keyspace, shard, cell, tabletType, poolIndex string) apilabels.Selector {
// This intentionally does NOT use any shared constants because we want the
// test to fail if the labels change, since that's a breaking change.
return apilabels.Set{
@@ -228,5 +245,6 @@ func tabletPodSelector(cluster, keyspace, shard, cell, tabletType string) apilab
"planetscale.com/shard": shard,
"planetscale.com/cell": cell,
"planetscale.com/tablet-type": tabletType,
+ "planetscale.com/pool-index": poolIndex,
}.AsSelector()
}
From a042c49f75c53a2d2d54b975a9a43b59a64d21ce Mon Sep 17 00:00:00 2001
From: Yohei Yoshimuta VitessShardTabletPool
@@ -7343,7 +7343,7 @@
-
index
+name
-int32
+string
-
VitessShardTemplate
diff --git a/pkg/apis/planetscale/v2/labels.go b/pkg/apis/planetscale/v2/labels.go
index 88655180..80b8d28b 100644
--- a/pkg/apis/planetscale/v2/labels.go
+++ b/pkg/apis/planetscale/v2/labels.go
@@ -35,8 +35,8 @@ const (
TabletUidLabel = LabelPrefix + "/" + "tablet-uid"
// TabletTypeLabel is the key for identifying the Vitess target tablet type for a Pod.
TabletTypeLabel = LabelPrefix + "/" + "tablet-type"
- // TabletTypeLabel is the key for identifying the Vitess target pool index within the (cell,type) pair.
- TabletPoolIndexLabel = LabelPrefix + "/" + "pool-index"
+ // TabletPoolNameLabel is the key for identifying the Vitess target pool name within the (cell,type) pair.
+ TabletPoolNameLabel = LabelPrefix + "/" + "pool-name"
// TabletIndexLabel is the key for identifying the index of a Vitess tablet within its pool.
TabletIndexLabel = LabelPrefix + "/" + "tablet-index"
diff --git a/pkg/apis/planetscale/v2/vitessshard_methods.go b/pkg/apis/planetscale/v2/vitessshard_methods.go
index 6605c8c8..2568bac6 100644
--- a/pkg/apis/planetscale/v2/vitessshard_methods.go
+++ b/pkg/apis/planetscale/v2/vitessshard_methods.go
@@ -58,9 +58,9 @@ func (t *VitessTabletPoolType) InitTabletType() string {
}
}
-// IsMatch indicates whether a tablet pool matches another tablet pool's type, cell and index.
+// IsMatch indicates whether a tablet pool matches another tablet pool's type, cell and name.
func (t *VitessShardTabletPool) IsMatch(inputPool *VitessShardTabletPool) bool {
- return t.Type == inputPool.Type && t.Cell == inputPool.Cell && t.Index == inputPool.Index
+ return t.Type == inputPool.Type && t.Cell == inputPool.Cell && t.Name == inputPool.Name
}
// UsingExternalDatastore indicates whether the VitessShard Spec is using
diff --git a/pkg/apis/planetscale/v2/vitessshard_types.go b/pkg/apis/planetscale/v2/vitessshard_types.go
index e8b0efd0..13af1d7b 100644
--- a/pkg/apis/planetscale/v2/vitessshard_types.go
+++ b/pkg/apis/planetscale/v2/vitessshard_types.go
@@ -105,7 +105,7 @@ type VitessShardTemplate struct {
// TabletPools specify groups of tablets in a given cell with a certain
// tablet type and a shared configuration template.
//
- // There must be at most one pool in this list for each (cell,type,index) set.
+ // There must be at most one pool in this list for each (cell,type,name) set.
// Each shard must have at least one "replica" pool (in at least one cell)
// in order to be able to serve.
// +patchMergeKey=type
@@ -113,7 +113,7 @@ type VitessShardTemplate struct {
// +listType=map
// +listMapKey=type
// +listMapKey=cell
- // +listMapKey=index
+ // +listMapKey=name
TabletPools []VitessShardTabletPool `json:"tabletPools,omitempty" patchStrategy:"merge" patchMergeKey:"type"`
// DatabaseInitScriptSecret specifies the init_db.sql script file to use for this shard.
@@ -171,13 +171,12 @@ type VitessShardTabletPool struct {
// +kubebuilder:validation:Enum=replica;rdonly;externalmaster;externalreplica;externalrdonly
Type VitessTabletPoolType `json:"type"`
- // Index is the pool's index within the (cell,type) pair.
- // This field is optional, and defaults to 0.
- // Assigning different numbers to this field enables the existence of multiple pools with a specific tablet type in a given cell,
+ // Name is the pool's unique name within the (cell,type) pair.
+ // This field is optional, and defaults to an empty.
+ // Assigning different names to this field enables the existence of multiple pools with a specific tablet type in a given cell,
// which can be beneficial for unmanaged tablets.
- // +kubebuilder:default=0
- // +kubebuilder:validation:Minimum=0
- Index int32 `json:"index,omitempty"`
+ // +kubebuilder:default=""
+ Name string `json:"name,omitempty"`
// Replicas is the number of tablets to deploy in this pool.
// This field is required, although it may be set to 0,
diff --git a/pkg/controller/vitessshard/reconcile_disk.go b/pkg/controller/vitessshard/reconcile_disk.go
index 7d95790c..9bdd12ea 100644
--- a/pkg/controller/vitessshard/reconcile_disk.go
+++ b/pkg/controller/vitessshard/reconcile_disk.go
@@ -133,7 +133,7 @@ func (r *ReconcileVitessShard) claimForTabletPod(ctx context.Context, pod *v1.Po
}
// tabletKeysForPool returns the list of targetKeys for a given pool type and cell.
-// Note that this function does not care about the pool's index assignment.
+// Note that this function does not care about the pool's name assignment.
func tabletKeysForPool(vts *planetscalev2.VitessShard, poolCell string, poolType planetscalev2.VitessTabletPoolType) ([]string, error) {
tabletKeys := vts.Status.TabletAliases()
diff --git a/pkg/controller/vitessshard/reconcile_tablets.go b/pkg/controller/vitessshard/reconcile_tablets.go
index d995fec1..e8623436 100644
--- a/pkg/controller/vitessshard/reconcile_tablets.go
+++ b/pkg/controller/vitessshard/reconcile_tablets.go
@@ -284,9 +284,9 @@ func vttabletSpecs(vts *planetscalev2.VitessShard, parentLabels map[string]strin
Uid: vttablet.UID(pool.Cell, keyspaceName, vts.Spec.KeyRange, pool.Type, uint32(tabletIndex)),
}
- // If TabletPools has multiple pools within the same (cell,type) pair, we need to add a pool index to the UID generator.
- if 0 < pool.Index {
- tabletAlias.Uid = vttablet.UIDWithPoolIndex(pool.Cell, keyspaceName, vts.Spec.KeyRange, pool.Type, uint32(tabletIndex), uint32(pool.Index))
+ // If TabletPools has multiple pools within the same (cell,type) pair, we need to add a pool name to the UID generator.
+ if 0 < len(pool.Name) {
+ tabletAlias.Uid = vttablet.UIDWithPoolName(pool.Cell, keyspaceName, vts.Spec.KeyRange, pool.Type, uint32(tabletIndex), pool.Name)
}
// Copy parent labels map and add tablet-specific labels.
@@ -297,7 +297,7 @@ func vttabletSpecs(vts *planetscalev2.VitessShard, parentLabels map[string]strin
labels[planetscalev2.CellLabel] = tabletAlias.Cell
labels[planetscalev2.TabletUidLabel] = strconv.FormatUint(uint64(tabletAlias.Uid), 10)
labels[planetscalev2.TabletTypeLabel] = string(pool.Type)
- labels[planetscalev2.TabletPoolIndexLabel] = strconv.FormatUint(uint64(pool.Index), 10)
+ labels[planetscalev2.TabletPoolNameLabel] = pool.Name
labels[planetscalev2.TabletIndexLabel] = strconv.FormatUint(uint64(tabletIndex), 10)
// Merge ExtraVitessFlags into the tablet spec ExtraFlags field.
diff --git a/pkg/operator/vttablet/uid.go b/pkg/operator/vttablet/uid.go
index 690a38e1..589c44ad 100644
--- a/pkg/operator/vttablet/uid.go
+++ b/pkg/operator/vttablet/uid.go
@@ -54,19 +54,19 @@ func UID(cellName, keyspaceName string, shardKeyRange planetscalev2.VitessKeyRan
}
/*
-UIDWithPoolIndex function generates a 32-bit unsigned integer similar to the UID function above.
+UIDWithPoolName function generates a 32-bit unsigned integer similar to the UID function above.
-However, it additionally takes the poolIndex as an input.
+However, it additionally takes the poolName as an input.
This allows the generation of a unique UID for a tablet that belongs to a different pool
but shares other common attributes.
To preserve the existing UID, it is recommended to use the UID function instead of this function
-when the poolIndex is set to its default value of 0.
+when the poolName is set to its default value of an empty string.
*/
-func UIDWithPoolIndex(cellName, keyspaceName string, shardKeyRange planetscalev2.VitessKeyRange,
- tabletPoolType planetscalev2.VitessTabletPoolType, tabletIndex uint32, poolIndex uint32) uint32 {
+func UIDWithPoolName(cellName, keyspaceName string, shardKeyRange planetscalev2.VitessKeyRange,
+ tabletPoolType planetscalev2.VitessTabletPoolType, tabletName uint32, poolName string) uint32 {
h := md5.New()
- fmt.Fprintln(h, cellName, keyspaceName, shardKeyRange.String(), string(tabletPoolType), tabletIndex, poolIndex)
+ fmt.Fprintln(h, cellName, keyspaceName, shardKeyRange.String(), string(tabletPoolType), tabletName, poolName)
sum := h.Sum(nil)
return binary.BigEndian.Uint32(sum[:4])
}
diff --git a/pkg/operator/vttablet/uid_test.go b/pkg/operator/vttablet/uid_test.go
index e3e88938..3e05bfec 100644
--- a/pkg/operator/vttablet/uid_test.go
+++ b/pkg/operator/vttablet/uid_test.go
@@ -39,20 +39,20 @@ func TestUIDHash(t *testing.T) {
}
}
-// TestUIDWithPoolIndexHash checks that nobody changed the hash function for UIDWithPoolIndex().
-func TestUIDWithPoolIndexHash(t *testing.T) {
+// TestUIDWithPoolNameHash checks that nobody changed the hash function for UIDWithPoolName().
+func TestUIDWithPoolNameHash(t *testing.T) {
cell := "cell"
keyspace := "keyspace"
keyRange := planetscalev2.VitessKeyRange{Start: "10", End: "20"}
tabletType := planetscalev2.ReplicaPoolType
- tabletIndex := uint32(1)
- poolIndex := uint32(1)
+ tabletName := uint32(1)
+ poolName := "unmanaged-replica-1"
// DO NOT CHANGE THIS VALUE!
// This is intentionally a change-detection test. If it breaks, you messed up.
- want := uint32(3840445776)
+ want := uint32(6333720)
- if got := UIDWithPoolIndex(cell, keyspace, keyRange, tabletType, tabletIndex, poolIndex); got != want {
- t.Fatalf("UIDWithPoolIndex() = %v, want %v", got, want)
+ if got := UIDWithPoolName(cell, keyspace, keyRange, tabletType, tabletName, poolName); got != want {
+ t.Fatalf("UIDWithPoolName() = %v, want %v", got, want)
}
}
diff --git a/test/integration/vitesscluster/vitesscluster_test.go b/test/integration/vitesscluster/vitesscluster_test.go
index abc0dc20..f508352b 100644
--- a/test/integration/vitesscluster/vitesscluster_test.go
+++ b/test/integration/vitesscluster/vitesscluster_test.go
@@ -68,7 +68,7 @@ spec:
storage: 1Gi
- cell: cell2
type: rdonly
- index: 1
+ name: unmanaged-replica-2
replicas: 3
mysqld: {}
dataVolumeClaimTemplate:
@@ -202,19 +202,19 @@ func verifyBasicVitessShard(f *framework.Fixture, ns, cluster, keyspace, shard s
// VitessShard creates vttablet Pods.
cell1Pods := f.ExpectPods(&client.ListOptions{
Namespace: ns,
- LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell1", "replica", "0"),
+ LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell1", "replica", ""),
}, expectedTabletCount[0])
cell2Pods := f.ExpectPods(&client.ListOptions{
Namespace: ns,
- LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell2", "rdonly", "0"),
+ LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell2", "rdonly", ""),
}, expectedTabletCount[1])
cell2_1_Pods := f.ExpectPods(&client.ListOptions{
Namespace: ns,
- LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell2", "rdonly", "1"),
+ LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell2", "rdonly", "unmanaged-replica-2"),
}, expectedTabletCount[2])
cell3Pods := f.ExpectPods(&client.ListOptions{
Namespace: ns,
- LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell3", "replica", "0"),
+ LabelSelector: tabletPodSelector(cluster, keyspace, shard, "cell3", "replica", ""),
}, expectedTabletCount[3])
// Each vttablet Pod should have a PVC.
@@ -236,7 +236,7 @@ func verifyBasicVitessShard(f *framework.Fixture, ns, cluster, keyspace, shard s
f.MustGet(ns, names.JoinWithConstraints(names.DefaultConstraints, cluster, keyspace, shard, "vtbackup", "init"), &corev1.PersistentVolumeClaim{})
}
-func tabletPodSelector(cluster, keyspace, shard, cell, tabletType, poolIndex string) apilabels.Selector {
+func tabletPodSelector(cluster, keyspace, shard, cell, tabletType, poolName string) apilabels.Selector {
// This intentionally does NOT use any shared constants because we want the
// test to fail if the labels change, since that's a breaking change.
return apilabels.Set{
@@ -245,6 +245,6 @@ func tabletPodSelector(cluster, keyspace, shard, cell, tabletType, poolIndex str
"planetscale.com/shard": shard,
"planetscale.com/cell": cell,
"planetscale.com/tablet-type": tabletType,
- "planetscale.com/pool-index": poolIndex,
+ "planetscale.com/pool-name": poolName,
}.AsSelector()
}
From 36957219fe4b5338e86e027d232ff244f7b38193 Mon Sep 17 00:00:00 2001
From: Yohei Yoshimuta VitessShardTabletPool