diff --git a/pkg/keyspace/tso_keyspace_group.go b/pkg/keyspace/tso_keyspace_group.go index 5ed9747e9234..a9b5f2d23062 100644 --- a/pkg/keyspace/tso_keyspace_group.go +++ b/pkg/keyspace/tso_keyspace_group.go @@ -36,6 +36,7 @@ import ( "github.com/tikv/pd/pkg/utils/etcdutil" "github.com/tikv/pd/pkg/utils/logutil" "github.com/tikv/pd/pkg/utils/syncutil" + "github.com/tikv/pd/pkg/utils/typeutil" "go.etcd.io/etcd/clientv3" "go.etcd.io/etcd/mvcc/mvccpb" "go.uber.org/zap" @@ -874,7 +875,7 @@ func (m *GroupManager) SetPriorityForKeyspaceGroup(id uint32, node string, prior inKeyspaceGroup := false members := make([]endpoint.KeyspaceGroupMember, 0, len(kg.Members)) for _, member := range kg.Members { - if member.Address == node { + if typeutil.CompareURLsWithoutScheme(member.Address, node) { inKeyspaceGroup = true member.Priority = priority } diff --git a/pkg/tso/keyspace_group_manager.go b/pkg/tso/keyspace_group_manager.go index b2af48f08da1..5645407dcfde 100644 --- a/pkg/tso/keyspace_group_manager.go +++ b/pkg/tso/keyspace_group_manager.go @@ -290,7 +290,7 @@ func (s *state) getNextPrimaryToReset( if member.Priority > maxPriority { maxPriority = member.Priority } - if member.Address == localAddress { + if typeutil.CompareURLsWithoutScheme(member.Address, localAddress) { localPriority = member.Priority } } @@ -667,7 +667,7 @@ func (kgm *KeyspaceGroupManager) primaryPriorityCheckLoop() { func (kgm *KeyspaceGroupManager) isAssignedToMe(group *endpoint.KeyspaceGroup) bool { return slice.AnyOf(group.Members, func(i int) bool { - return group.Members[i].Address == kgm.tsoServiceID.ServiceAddr + return typeutil.CompareURLsWithoutScheme(group.Members[i].Address, kgm.tsoServiceID.ServiceAddr) }) } diff --git a/pkg/tso/keyspace_group_manager_test.go b/pkg/tso/keyspace_group_manager_test.go index ad67c49fa5ef..a8c798401bae 100644 --- a/pkg/tso/keyspace_group_manager_test.go +++ b/pkg/tso/keyspace_group_manager_test.go @@ -891,7 +891,7 @@ func collectAssignedKeyspaceGroupIDs(re *require.Assertions, kgm *KeyspaceGroupM re.Equal(i, int(am.kgID)) re.Equal(i, int(kg.ID)) for _, m := range kg.Members { - if m.Address == kgm.tsoServiceID.ServiceAddr { + if typeutil.CompareURLsWithoutScheme(m.Address, kgm.tsoServiceID.ServiceAddr) { ids = append(ids, uint32(i)) break } diff --git a/pkg/utils/typeutil/comparison.go b/pkg/utils/typeutil/comparison.go index c976ac471021..9ae9d4b16999 100644 --- a/pkg/utils/typeutil/comparison.go +++ b/pkg/utils/typeutil/comparison.go @@ -17,6 +17,7 @@ package typeutil import ( "math" "sort" + "strings" "time" ) @@ -78,3 +79,17 @@ func AreStringSlicesEquivalent(a, b []string) bool { func Float64Equal(a, b float64) bool { return math.Abs(a-b) <= 1e-6 } + +// CompareURLsWithoutScheme compares two URLs without scheme. +func CompareURLsWithoutScheme(url1, url2 string) bool { + trimScheme := func(url string) string { + if strings.HasPrefix(url, "http://") { + return strings.TrimPrefix(url, "http://") + } else if strings.HasPrefix(url, "https://") { + return strings.TrimPrefix(url, "https://") + } + return url + } + + return trimScheme(url1) == trimScheme(url2) +} diff --git a/pkg/utils/typeutil/comparison_test.go b/pkg/utils/typeutil/comparison_test.go index b53e961b4eea..5d103a3eb55e 100644 --- a/pkg/utils/typeutil/comparison_test.go +++ b/pkg/utils/typeutil/comparison_test.go @@ -66,3 +66,11 @@ func TestAreStringSlicesEquivalent(t *testing.T) { re.False(AreStringSlicesEquivalent([]string{}, []string{"a", "b"})) re.False(AreStringSlicesEquivalent([]string{"a", "b"}, []string{})) } + +func TestCompareURLsWithoutScheme(t *testing.T) { + re := require.New(t) + re.True(CompareURLsWithoutScheme("", "")) + re.True(CompareURLsWithoutScheme("http://127.0.0.1", "http://127.0.0.1")) + re.True(CompareURLsWithoutScheme("http://127.0.0.1", "https://127.0.0.1")) + re.True(CompareURLsWithoutScheme("127.0.0.1", "http://127.0.0.1")) +} diff --git a/server/apiv2/handlers/tso_keyspace_group.go b/server/apiv2/handlers/tso_keyspace_group.go index 835bda9d7bb5..d1b435eca3af 100644 --- a/server/apiv2/handlers/tso_keyspace_group.go +++ b/server/apiv2/handlers/tso_keyspace_group.go @@ -26,6 +26,7 @@ import ( "github.com/tikv/pd/pkg/slice" "github.com/tikv/pd/pkg/storage/endpoint" "github.com/tikv/pd/pkg/utils/syncutil" + "github.com/tikv/pd/pkg/utils/typeutil" "github.com/tikv/pd/server" "github.com/tikv/pd/server/apiv2/middlewares" ) @@ -507,7 +508,7 @@ func SetPriorityForKeyspaceGroup(c *gin.Context) { // check if node exists members := kg.Members if slice.NoneOf(members, func(i int) bool { - return members[i].Address == node + return typeutil.CompareURLsWithoutScheme(members[i].Address, node) }) { c.AbortWithStatusJSON(http.StatusBadRequest, "tso node does not exist in the keyspace group") }