Fix panic when choosing zone or zones for volume

pull/8/head
Pengfei Ni 2018-08-23 10:46:41 +08:00
parent 687553a47a
commit 8e4ab129e9
2 changed files with 33 additions and 1 deletions

View File

@ -520,6 +520,11 @@ func GetPath(mounter volume.Mounter) (string, error) {
// This means that a StatefulSet's volumes (`claimname-statefulsetname-id`) will spread across available zones,
// assuming the id values are consecutive.
func ChooseZoneForVolume(zones sets.String, pvcName string) string {
// No zones available, return empty string.
if zones.Len() == 0 {
return ""
}
// We create the volume in a zone determined by the name
// Eventually the scheduler will coordinate placement into an available zone
hash, index := getPVCNameHashAndIndexOffset(pvcName)
@ -541,6 +546,12 @@ func ChooseZoneForVolume(zones sets.String, pvcName string) string {
// ChooseZonesForVolume is identical to ChooseZoneForVolume, but selects a multiple zones, for multi-zone disks.
func ChooseZonesForVolume(zones sets.String, pvcName string, numZones uint32) sets.String {
// No zones available, return empty set.
replicaZones := sets.NewString()
if zones.Len() == 0 {
return replicaZones
}
// We create the volume in a zone determined by the name
// Eventually the scheduler will coordinate placement into an available zone
hash, index := getPVCNameHashAndIndexOffset(pvcName)
@ -554,7 +565,6 @@ func ChooseZonesForVolume(zones sets.String, pvcName string, numZones uint32) se
// PVC placement (which could also e.g. avoid putting volumes in overloaded or
// unhealthy zones)
zoneSlice := zones.List()
replicaZones := sets.NewString()
startingIndex := index * numZones
for index = startingIndex; index < startingIndex+numZones; index++ {

View File

@ -647,6 +647,17 @@ func TestChooseZoneForVolume(t *testing.T) {
VolumeName: "medium-henley--4",
Expected: "c", // hash("") + 4 == 2 mod 3
},
// Test for no zones
{
Zones: sets.NewString(),
VolumeName: "medium-henley--1",
Expected: "",
},
{
Zones: nil,
VolumeName: "medium-henley--2",
Expected: "",
},
}
for _, test := range tests {
@ -992,6 +1003,17 @@ func TestChooseZonesForVolume(t *testing.T) {
NumZones: 3,
Expected: sets.NewString("a" /* hash("henley") == 0 + 3 + 6(startingIndex) */, "b", "c"),
},
// Test for no zones
{
Zones: sets.NewString(),
VolumeName: "henley-1",
Expected: sets.NewString(),
},
{
Zones: nil,
VolumeName: "henley-2",
Expected: sets.NewString(),
},
}
for _, test := range tests {