fix(bssdk): fix update shard catalog suid info, when catalog change item is not leader

with: #23028809

Signed-off-by: mawei029 <mawei2@oppo.com>
This commit is contained in:
mawei029 2025-02-10 16:51:04 +08:00 committed by slasher
parent c9ab48ba83
commit f90f00efa6
2 changed files with 63 additions and 6 deletions

View File

@ -459,14 +459,9 @@ func (s *shardControllerImpl) setShardByID(shardID proto.ShardID, val *clustermg
return false
}
// update version, leaderDiskID, units
info.version = val.RouteVersion
info.leaderDiskID = val.Unit.LeaderDiskID
for _, unit := range info.units {
if info.leaderDiskID == unit.DiskID {
info.leaderSuid = val.Unit.Suid
break
}
}
// info.rangeExt = val.Unit.Range // todo: will update range next version
idx := val.Unit.Suid.Index()
@ -475,6 +470,14 @@ func (s *shardControllerImpl) setShardByID(shardID proto.ShardID, val *clustermg
DiskID: val.Unit.DiskID,
Learner: val.Unit.Learner, // most time, $learner is false
}
// update leader suid
for _, unit := range info.units {
if info.leaderDiskID == unit.DiskID {
info.leaderSuid = unit.Suid
break
}
}
return true
}

View File

@ -372,6 +372,60 @@ func TestShardUpdate(t *testing.T) {
require.Equal(t, 2, len(svr.shards))
}
{
rv := svr.version + 1
shardID := proto.ShardID(9)
oldShard, exist := svr.getShardNoLock(shardID)
require.True(t, exist)
val := clustermgr.CatalogChangeShardUpdate{
ShardID: shardID,
RouteVersion: rv,
Unit: clustermgr.ShardUnitInfo{
Suid: proto.EncodeSuid(shardID, 2, 1),
DiskID: 3,
LeaderDiskID: 2,
Range: *ranges[8],
RouteVersion: rv,
Host: "testHost3",
Learner: false,
},
}
data, err := val.Marshal()
require.NoError(t, err)
item := clustermgr.CatalogChangeItem{
RouteVersion: svr.version + 1,
Type: proto.CatalogChangeItemUpdateShard,
Item: &types.Any{
TypeUrl: "",
Value: data,
},
}
svr.handleShardUpdate(ctx, item)
sd, exist := svr.getShardNoLock(shardID)
require.True(t, exist)
expect := shard{
shardID: oldShard.shardID,
leaderDiskID: 2,
leaderSuid: proto.EncodeSuid(shardID, 1, 0),
version: rv,
rangeExt: oldShard.rangeExt,
units: oldShard.units,
punishCtrl: oldShard.punishCtrl,
}
idx := val.Unit.Suid.Index()
expect.units[idx] = clustermgr.ShardUnit{
Suid: val.Unit.Suid,
DiskID: val.Unit.DiskID,
Learner: val.Unit.Learner,
}
require.Equal(t, expect, *sd)
}
}
func TestShardGetShard(t *testing.T) {