mirror of
https://github.com/cubefs/cubefs.git
synced 2026-08-02 02:00:56 +00:00
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:
parent
c577b51612
commit
4867b6ca6d
@ -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
|
||||
|
||||
@ -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) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user