mirror of
https://github.com/cubefs/cubefs.git
synced 2026-08-02 02:00:56 +00:00
fix(proxy): avoid alloc 0 volume from clustermgr
with: #1000217440 Signed-off-by: xiejian <xiejian3@oppo.com>
This commit is contained in:
parent
ebb82972f6
commit
b363b75d99
@ -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,
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user