diff --git a/tests/src/python/providertestbase.py b/tests/src/python/providertestbase.py index 32bd1042a12f..827dc1f00cd3 100644 --- a/tests/src/python/providertestbase.py +++ b/tests/src/python/providertestbase.py @@ -846,3 +846,25 @@ def testStringComparison(self): self.assertEqual(count, 5) self.assertFalse(iterator.compileFailed()) self.disableCompiler() + + def testConcurrency(self): + """ + The connection pool has a maximum of 4 connections defined (+2 spare connections) + Make sure that if we exhaust those 4 connections and force another connection + it is actually using the spare connections and does not freeze. + This situation normally happens when (at least) 4 rendering threads are active + in parallel and one requires an expression to be evaluated. + """ + # Acquire the maximum amount of concurrent connections + iterators = list() + for i in range(QgsApplication.instance().maxConcurrentConnectionsPerPool()): + iterators.append(self.vl.getFeatures()) + + # Run an expression that will also do a request and should use a spare + # connection. It just should not deadlock here. + + feat = next(iterators[0]) + context = QgsExpressionContext() + context.setFeature(feat) + exp = QgsExpression('get_feature(\'{layer}\', \'pk\', 5)'.format(layer=self.vl.id())) + exp.evaluate(context)