From a20565e3290d40d4ffd7b4c2955cd2f5606ef043 Mon Sep 17 00:00:00 2001 From: Ti Chi Robot Date: Thu, 1 Aug 2024 11:07:20 +0800 Subject: [PATCH] mcs: tso server compare address without scheme (#8283) (#8470) close tikv/pd#8284 Signed-off-by: lhy1024 Co-authored-by: ti-chi-bot[bot] <108142056+ti-chi-bot[bot]@users.noreply.github.com> Co-authored-by: lhy1024 --- pkg/keyspace/tso_keyspace_group.go | 2 +- pkg/mcs/tso/server/grpc_service.go | 3 +-- pkg/storage/endpoint/tso_keyspace_group.go | 9 +++++++++ pkg/tso/keyspace_group_manager.go | 8 ++++---- pkg/tso/keyspace_group_manager_test.go | 2 +- server/apiv2/handlers/tso_keyspace_group.go | 2 +- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/pkg/keyspace/tso_keyspace_group.go b/pkg/keyspace/tso_keyspace_group.go index 372356d716c..40d21b4111f 100644 --- a/pkg/keyspace/tso_keyspace_group.go +++ b/pkg/keyspace/tso_keyspace_group.go @@ -876,7 +876,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 member.IsAddressEquivalent(node) { inKeyspaceGroup = true member.Priority = priority } diff --git a/pkg/mcs/tso/server/grpc_service.go b/pkg/mcs/tso/server/grpc_service.go index 31a74f2a688..b9f95be15e0 100644 --- a/pkg/mcs/tso/server/grpc_service.go +++ b/pkg/mcs/tso/server/grpc_service.go @@ -19,7 +19,6 @@ import ( "io" "net/http" "strconv" - "strings" "time" "github.com/pingcap/errors" @@ -164,7 +163,7 @@ func (s *Service) FindGroupByKeyspaceID( Address: member.Address, // TODO: watch the keyspace groups' primary serving address changes // to get the latest primary serving addresses of all keyspace groups. - IsPrimary: strings.EqualFold(member.Address, am.GetLeaderAddr()), + IsPrimary: member.IsAddressEquivalent(am.GetLeaderAddr()), }) } diff --git a/pkg/storage/endpoint/tso_keyspace_group.go b/pkg/storage/endpoint/tso_keyspace_group.go index 39a08afe937..dd3d4f91eb3 100644 --- a/pkg/storage/endpoint/tso_keyspace_group.go +++ b/pkg/storage/endpoint/tso_keyspace_group.go @@ -20,6 +20,7 @@ import ( "github.com/tikv/pd/pkg/slice" "github.com/tikv/pd/pkg/storage/kv" + "github.com/tikv/pd/pkg/utils/typeutil" "go.etcd.io/etcd/clientv3" ) @@ -80,6 +81,14 @@ type KeyspaceGroupMember struct { Priority int `json:"priority"` } +// IsAddressEquivalent compares the address with the given address. +// It compares the address without the scheme. +// Otherwise, it will not work when we update the scheme from http to https. +// Issue: https://github.com/tikv/pd/issues/8284 +func (m *KeyspaceGroupMember) IsAddressEquivalent(addr string) bool { + return typeutil.EqualBaseURLs(m.Address, addr) +} + // SplitState defines the split state of a keyspace group. type SplitState struct { // SplitSource is the current keyspace group ID from which the keyspace group is split. diff --git a/pkg/tso/keyspace_group_manager.go b/pkg/tso/keyspace_group_manager.go index d259ab27a5b..79521e90e8f 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 member.IsAddressEquivalent(localAddress) { localPriority = member.Priority } } @@ -625,7 +625,7 @@ func (kgm *KeyspaceGroupManager) primaryPriorityCheckLoop() { if member != nil { aliveTSONodes := make(map[string]struct{}) kgm.tsoNodes.Range(func(key, _ any) bool { - aliveTSONodes[key.(string)] = struct{}{} + aliveTSONodes[typeutil.TrimScheme(key.(string))] = struct{}{} return true }) if len(aliveTSONodes) == 0 { @@ -638,7 +638,7 @@ func (kgm *KeyspaceGroupManager) primaryPriorityCheckLoop() { if member.Priority <= localPriority { continue } - if _, ok := aliveTSONodes[member.Address]; ok { + if _, ok := aliveTSONodes[typeutil.TrimScheme(member.Address)]; ok { resetLeader = true break } @@ -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 group.Members[i].IsAddressEquivalent(kgm.tsoServiceID.ServiceAddr) }) } diff --git a/pkg/tso/keyspace_group_manager_test.go b/pkg/tso/keyspace_group_manager_test.go index 9fe6da6edc9..4c9c9f44707 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 m.IsAddressEquivalent(kgm.tsoServiceID.ServiceAddr) { ids = append(ids, uint32(i)) break } diff --git a/server/apiv2/handlers/tso_keyspace_group.go b/server/apiv2/handlers/tso_keyspace_group.go index 835b4a5242b..b4149c23f03 100644 --- a/server/apiv2/handlers/tso_keyspace_group.go +++ b/server/apiv2/handlers/tso_keyspace_group.go @@ -520,7 +520,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 members[i].IsAddressEquivalent(node) }) { c.AbortWithStatusJSON(http.StatusBadRequest, "tso node does not exist in the keyspace group") }