diff options
author | Richard van der Hoff <richard@matrix.org> | 2017-10-11 15:05:05 +0100 |
---|---|---|
committer | Richard van der Hoff <richard@matrix.org> | 2017-10-11 15:05:05 +0100 |
commit | 4fad8efbfb1726c72bdd7cbbacc894b8701efec3 (patch) | |
tree | 355ebe6a112915c9028d7ca6296f493cff12320a /tests/util/test_linearizer.py | |
parent | Merge pull request #2517 from matrix-org/rav/fed_server_refactor (diff) | |
download | synapse-4fad8efbfb1726c72bdd7cbbacc894b8701efec3.tar.xz |
Fix stackoverflow and logcontexts from linearizer
1. make it not blow out the stack when there are more than 50 things waiting for a lock. Fixes https://github.com/matrix-org/synapse/issues/2505. 2. Make it not mess up the log contexts.
Diffstat (limited to '')
-rw-r--r-- | tests/util/test_linearizer.py | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/tests/util/test_linearizer.py b/tests/util/test_linearizer.py index afcba482f9..793a88e462 100644 --- a/tests/util/test_linearizer.py +++ b/tests/util/test_linearizer.py @@ -12,8 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - - +from synapse.util import async, logcontext from tests import unittest from twisted.internet import defer @@ -38,7 +37,28 @@ class LinearizerTestCase(unittest.TestCase): with cm1: self.assertFalse(d2.called) - self.assertTrue(d2.called) - with (yield d2): pass + + def test_lots_of_queued_things(self): + # we have one slow thing, and lots of fast things queued up behind it. + # it should *not* explode the stack. + linearizer = Linearizer() + + @defer.inlineCallbacks + def func(i, sleep=False): + with logcontext.LoggingContext("func(%s)" % i) as lc: + with (yield linearizer.queue("")): + self.assertEqual( + logcontext.LoggingContext.current_context(), lc) + if sleep: + yield async.sleep(0) + + self.assertEqual( + logcontext.LoggingContext.current_context(), lc) + + func(0, sleep=True) + for i in xrange(1, 100): + func(i) + + return func(1000) |