Skip to content

Commit

Permalink
Add concurrency/nesting test for all providers
Browse files Browse the repository at this point in the history
  • Loading branch information
m-kuhn committed Aug 4, 2018
1 parent 56885e1 commit eac43fd
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 26 deletions.
23 changes: 23 additions & 0 deletions tests/src/python/providertestbase.py
Expand Up @@ -17,6 +17,7 @@
__revision__ = '$Format:%H$' __revision__ = '$Format:%H$'


from qgis.core import ( from qgis.core import (
QgsApplication,
QgsRectangle, QgsRectangle,
QgsFeatureRequest, QgsFeatureRequest,
QgsFeature, QgsFeature,
Expand Down Expand Up @@ -886,3 +887,25 @@ def testStringComparison(self):
self.assertEqual(count, 5) self.assertEqual(count, 5)
self.assertFalse(iterator.compileFailed()) self.assertFalse(iterator.compileFailed())
self.disableCompiler() 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(it)
context = QgsExpressionContext()
context.setFeature(feat)
exp = QgsExpression('get_feature(\'{layer}\', \'pk\', 5)'.format(layer=self.vl.id()))
exp.evaluate(context)
26 changes: 0 additions & 26 deletions tests/src/python/test_provider_postgres.py
Expand Up @@ -1143,32 +1143,6 @@ def testCurveToMultipolygon(self):
self.assertEqual(g.childCount(), 1) self.assertEqual(g.childCount(), 1)
self.assertTrue(g.childGeometry(0).vertexCount() > 3) self.assertTrue(g.childGeometry(0).vertexCount() > 3)


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.
"""
vl = QgsVectorLayer('{conn} srid=4326 table="qgis_test".{table} (geom) sql='.format(conn=self.dbconn, table='someData'), "testgeom", "postgres")
self.assertTrue(vl.isValid())
QgsProject.instance().addMapLayer(vl)

# Acquire the maximum amount of concurrent connections
iterators = list()
for i in range(QgsApplication.instance().maxConcurrentConnectionsPerPool()):
iterators.append(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(it)
context = QgsExpressionContext()
context.setFeature(feat)
exp = QgsExpression('get_feature(\'{layer}\', \'pk\', 5)'.format(layer=vl.id()))
exp.evaluate(context)



class TestPyQgsPostgresProviderCompoundKey(unittest.TestCase, ProviderTestCase): class TestPyQgsPostgresProviderCompoundKey(unittest.TestCase, ProviderTestCase):


Expand Down

0 comments on commit eac43fd

Please sign in to comment.