volume controller: Speed up binding by not sorting volumes

The binder sorts all available volumes first, then it filters out volumes
that cannot be bound by processing each volume in a loop and then finds
the smallest matching volume by binary search.

So, if we process every available volume in a loop, we can also remember the
smallest matching one and save us potentially long sorting (and quick binary
search).
This commit is contained in:
Jan Safranek
2016-05-19 14:25:52 +02:00
parent ab10484330
commit c7da3abd5b
2 changed files with 52 additions and 42 deletions

View File

@@ -17,6 +17,7 @@ limitations under the License.
package persistentvolume
import (
"sort"
"testing"
"k8s.io/kubernetes/pkg/api"
@@ -193,7 +194,7 @@ func TestMatchingWithBoundVolumes(t *testing.T) {
}
}
func TestSort(t *testing.T) {
func TestListByAccessModes(t *testing.T) {
volList := newPersistentVolumeOrderedIndex()
for _, pv := range createTestVolumes() {
volList.store.Add(pv)
@@ -203,6 +204,7 @@ func TestSort(t *testing.T) {
if err != nil {
t.Error("Unexpected error retrieving volumes by access modes:", err)
}
sort.Sort(byCapacity{volumes})
for i, expected := range []string{"gce-pd-1", "gce-pd-5", "gce-pd-10"} {
if string(volumes[i].UID) != expected {
@@ -214,6 +216,7 @@ func TestSort(t *testing.T) {
if err != nil {
t.Error("Unexpected error retrieving volumes by access modes:", err)
}
sort.Sort(byCapacity{volumes})
for i, expected := range []string{"nfs-1", "nfs-5", "nfs-10"} {
if string(volumes[i].UID) != expected {
@@ -552,3 +555,20 @@ func TestFindingPreboundVolumes(t *testing.T) {
t.Errorf("Expected %s but got volume %s instead", pv8.Name, volume.Name)
}
}
// byCapacity is used to order volumes by ascending storage size
type byCapacity struct {
volumes []*api.PersistentVolume
}
func (c byCapacity) Less(i, j int) bool {
return matchStorageCapacity(c.volumes[i], c.volumes[j])
}
func (c byCapacity) Swap(i, j int) {
c.volumes[i], c.volumes[j] = c.volumes[j], c.volumes[i]
}
func (c byCapacity) Len() int {
return len(c.volumes)
}