fix(bssdk): old leader disk is broken, choose new leader from the old units

with: #1000022240

Signed-off-by: mawei029 <mawei2@oppo.com>
This commit is contained in:
mawei029 2025-03-26 10:53:12 +08:00 committed by slasher
parent c577b51612
commit 4867b6ca6d
2 changed files with 28 additions and 3 deletions

View File

@ -254,16 +254,16 @@ func (s *shardControllerImpl) UpdateShard(ctx context.Context, sd shardnode.Shar
s.Lock()
defer s.Unlock()
// skip old route version
// shard exist
oldShard, exist := s.getShardNoLock(sd.Suid.ShardID())
if !exist {
span.Warnf("dont need update shard, exist:%t, current shard:%+v, replace shard:%+v", exist, oldShard, sd)
return nil, errcode.ErrAccessNotFoundShard
}
// only update leader diskID/suid ; may be sd.LeaderDiskID is not in units
// only update leader diskID/suid ; sd.LeaderDiskID must is in units
// don't need to judge or change RouteVersion, when switch the primary shardNode. only update version in cm GetCatalogChanges
if sd.LeaderSuid.Epoch() > oldShard.units[sd.LeaderSuid.Index()].Suid.Epoch() {
if sd.LeaderSuid.Epoch() >= oldShard.units[sd.LeaderSuid.Index()].Suid.Epoch() {
oldShard.leaderDiskID = sd.LeaderDiskID
oldShard.leaderSuid = sd.LeaderSuid
return nil, nil

View File

@ -206,6 +206,31 @@ func TestShardController(t *testing.T) {
require.True(t, ok)
require.Equal(t, newShard, *si)
}
{
// switch leader: oldLeader 4 -> leader 2, units[1,2,4]
si, ok := svr.getShardByID(1)
require.True(t, ok)
require.Equal(t, proto.ShardID(1), si.shardID)
newShard := *si
newShard.leaderDiskID = 2
newShard.leaderSuid = si.units[1].Suid // disk 2 old suid proto.EncodeSuid(newShard.shardID, 1, 0)
err = svr.UpdateShard(ctx, shardnode.ShardStats{
Suid: newShard.units[2].Suid,
LeaderDiskID: newShard.leaderDiskID,
LeaderSuid: newShard.leaderSuid,
RouteVersion: newShard.version,
})
require.NoError(t, err)
require.Equal(t, newShard.leaderDiskID, si.leaderDiskID)
require.Equal(t, newShard.leaderSuid, si.leaderSuid)
si, ok = svr.getShardByID(1)
require.True(t, ok)
require.Equal(t, newShard, *si)
}
}
func TestShardUpdate(t *testing.T) {