summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Burke <tim.burke@gmail.com>2019-06-17 15:30:40 -0700
committerTim Burke <tim.burke@gmail.com>2019-07-29 12:11:34 -0700
commitc19d09f60b2d501698b741a123cc6b8203969016 (patch)
tree87ea844850feabc46890c180971482d959214476
parent6a1b2de6bbb6e8e3f7632f857b4ac5f2dcb662d0 (diff)
downloadswift-c19d09f60b2d501698b741a123cc6b8203969016.tar.gz
Give ECAppIter greenthreads a chance to wrap up
Otherwise, we can hit a "generator already executing" error in test/functional/test_slo.py:TestSlo.test_slo_multi_ranged_get Also, set a *slightly* newer lower-bound for greenlet (from 2011 instead of 2010) so the sleep() doesn't cause us to lose exception state. Change-Id: Id458fc0a43fd71aab9f6edbacc1f0b370c9f7537
-rw-r--r--lower-constraints.txt2
-rw-r--r--requirements.txt2
-rw-r--r--swift/proxy/controllers/obj.py3
3 files changed, 4 insertions, 3 deletions
diff --git a/lower-constraints.txt b/lower-constraints.txt
index 24e0e1b5b..536e8b61e 100644
--- a/lower-constraints.txt
+++ b/lower-constraints.txt
@@ -25,7 +25,7 @@ flake8==2.5.5
future==0.16.0
gitdb2==2.0.3
GitPython==2.1.8
-greenlet==0.3.1
+greenlet==0.3.2
hacking==0.11.0
idna==2.6
imagesize==1.0.0
diff --git a/requirements.txt b/requirements.txt
index 04f2af2c1..d4c994af2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,7 +4,7 @@
dnspython>=1.15.0;python_version=='2.7' # http://www.dnspython.org/LICENSE
eventlet>=0.25.0 # MIT
-greenlet>=0.3.1
+greenlet>=0.3.2
netifaces>=0.8,!=0.10.0,!=0.10.1
PasteDeploy>=1.3.3
lxml>=3.4.1
diff --git a/swift/proxy/controllers/obj.py b/swift/proxy/controllers/obj.py
index 8e6c47546..3015362c9 100644
--- a/swift/proxy/controllers/obj.py
+++ b/swift/proxy/controllers/obj.py
@@ -38,7 +38,7 @@ from hashlib import md5
from swift import gettext_ as _
from greenlet import GreenletExit
-from eventlet import GreenPile
+from eventlet import GreenPile, sleep
from eventlet.queue import Queue
from eventlet.timeout import Timeout
@@ -1066,6 +1066,7 @@ class ECAppIter(object):
# executing the internal_parts_iters.
if self.stashed_iter:
self.stashed_iter.close()
+ sleep() # Give the per-frag threads a chance to clean up
for it in self.internal_parts_iters:
close_if_possible(it)