fix(proxy): avoid alloc 0 volume from clustermgr

with: #1000217440

Signed-off-by: xiejian <xiejian3@oppo.com>
This commit is contained in:
xiejian 2025-07-07 19:30:31 +08:00 committed by slasher
parent ebb82972f6
commit b363b75d99
2 changed files with 109 additions and 2 deletions

View File

@ -503,8 +503,9 @@ func (v *volumeMgr) getAvailableVols(ctx context.Context, args *proxy.AllocVolsA
return nil, errcode.ErrNoCodemodeVolume
}
if info.backup.Len() < v.DefaultAllocVolsNum {
v.allocNotify(ctx, args.CodeMode, v.DefaultAllocVolsNum-info.backup.Len(), true)
backupLen := info.backup.Len()
if backupLen < v.DefaultAllocVolsNum {
v.allocNotify(ctx, args.CodeMode, v.DefaultAllocVolsNum-backupLen, true)
}
span.Debugf("codeMode: %v, info.currentTotalFree: %v, info.totalThreshold: %v", args.CodeMode,
@ -553,6 +554,9 @@ func (v *volumeMgr) allocVolumeLoop(mode codemode.CodeMode) {
args := <-v.allocChs[mode]
span, ctx := trace.StartSpanFromContext(context.Background(), "")
requireCount := args.count
if requireCount < 1 {
continue
}
for {
allocArg := &clustermgr.AllocVolumeArgs{
IsInit: args.isInit,

View File

@ -738,3 +738,106 @@ func TestAllocFillBackupFirstTime(t *testing.T) {
a := <-v.allocChs[codemode.EC6P6]
require.True(t, true, a.isBackup)
}
func TestAllocAvoidAllocZeroVolFromCM(t *testing.T) {
cmcli := mock.ProxyMockClusterMgrCli(t)
v := &volumeMgr{
BlobConfig: BlobConfig{},
VolConfig: VolConfig{
VolumeReserveSize: 1024,
DefaultAllocVolsNum: 2,
},
BidMgr: nil,
clusterMgr: cmcli,
modeInfos: make(map[codemode.CodeMode]*modeInfo),
allocChs: make(map[codemode.CodeMode]chan *allocArgs),
closeCh: nil,
}
v.allocChs[codemode.EC6P6] = make(chan *allocArgs, 1)
info := &modeInfo{
current: &volumes{},
backup: &volumes{},
totalThreshold: 2 * 1024 * 1024 * 1024,
totalVolNumThreshold: 0,
}
backupTmp := &volumes{}
for i := 1; i <= 7; i++ {
volInfo := cm.AllocVolumeInfo{
VolumeInfo: cm.VolumeInfo{
VolumeInfoBase: cm.VolumeInfoBase{
Vid: proto.Vid(i),
CodeMode: codemode.EC6P6,
Free: uint64(1 << 30),
},
},
ExpireTime: 100,
}
info.Put(&volume{
AllocVolumeInfo: volInfo,
}, false)
if i > 5 {
backupTmp.Put(&volume{
AllocVolumeInfo: volInfo,
})
}
}
v.modeInfos[codemode.EC6P6] = info
done1 := make(chan struct{})
go func() {
for {
select {
case <-done1:
return
default:
}
args := &proxy.AllocVolsArgs{
Fsize: 1,
CodeMode: codemode.EC6P6,
BidCount: 1,
Excludes: nil,
Discards: nil,
}
ctx := context.Background()
_, err := v.getAvailableVols(ctx, args)
require.NoError(t, err)
}
}()
done2 := make(chan struct{})
go func() {
i := 0
for {
select {
case <-done2:
return
default:
}
v.modeInfos[codemode.EC6P6].lock.Lock()
if i%2 == 0 {
v.modeInfos[codemode.EC6P6].backup = &volumes{}
} else {
v.modeInfos[codemode.EC6P6].backup = backupTmp
}
v.modeInfos[codemode.EC6P6].lock.Unlock()
time.Sleep(100 * time.Millisecond)
i++
}
}()
ticker := time.NewTicker(3 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
close(done1)
close(done2)
return
default:
}
a := <-v.allocChs[codemode.EC6P6]
require.True(t, true, a.count > 0)
}
}