From 2e20e70e1430b1f05a98616ba47464829e764390 Mon Sep 17 00:00:00 2001
From: Victor Stinner <vstinner@redhat.com>
Date: Thu, 1 Oct 2015 18:04:30 +0200
Subject: [PATCH] Fix volume throttling to Python 3

BlkioCgroup._set_limits(): sort devices before iterating on them to
have a reliable behaviour.

The devs variable is a dictionary. On Python 3, the hash function is
now randomized, so iterating on a dictionary gives items in a random
order. Use sorted() to iterate on the list of sorted devices instead.

tox.ini: add cinder.tests.unit.test_volume_throttling to Python 3.

Blueprint cinder-python3
Partial-Bug: #1348818
Change-Id: Icf7141f772397c7ac08f0f1e21ad74cb86a06351
---
 cinder/volume/throttling.py | 2 +-
 tox.ini                     | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/cinder/volume/throttling.py b/cinder/volume/throttling.py
index 21c19956e16..b8ce5705ab0 100644
--- a/cinder/volume/throttling.py
+++ b/cinder/volume/throttling.py
@@ -90,7 +90,7 @@ class BlkioCgroup(Throttle):
 
     def _set_limits(self, rw, devs):
         total = sum(devs.values())
-        for dev in devs:
+        for dev in sorted(devs):
             self._limit_bps(rw, dev, self.bps_limit * devs[dev] / total)
 
     @utils.synchronized('BlkioCgroup')
diff --git a/tox.ini b/tox.ini
index 720d1449275..d86012f2008 100644
--- a/tox.ini
+++ b/tox.ini
@@ -103,6 +103,7 @@ commands =
     cinder.tests.unit.test_volume_configuration \
     cinder.tests.unit.test_volume_glance_metadata \
     cinder.tests.unit.test_volume_rpcapi \
+    cinder.tests.unit.test_volume_throttling \
     cinder.tests.unit.test_volume_transfer \
     cinder.tests.unit.test_volume_types \
     cinder.tests.unit.test_volume_types_extra_specs \