Bug report #20298
Invalid layer not freed when added to the registry
|Affected QGIS version:||2.18.25||Regression?:||No|
|Operating System:||Linux and Windows||Easy fix?:||No|
|Pull Request or Patch supplied:||No||Resolution:||end of life|
|Crashes QGIS or corrupts data:||No||Copied to github as #:||28119|
This simple code
l = QgsVectorLayer("mydb.sqlite|layername=invalid_layer", "l", "ogr") QgsMapLayerRegistry.instance().addMapLayer(l)
where l points to a valid SQLite file, but an invalid table name will result in l being not valid (l.isValid() == false).
Adding this layer to the registry will keep the connection to the SQLite opened forever. Which may lead to concurrency problems (especially under Windows).
The problem seems similar with the spatialite provider.
I can't find yet where it comes from (sip bindings ? the connection pool registry ? )
QGIS 3 not affected
#1 Updated by Alessandro Pasotti over 2 years ago
Hi Hugo, maybe totally unrelated, but just a quick note to make sure you are aware of the ongoing work on QGIS 3 bad layer handling: the basic concept is that a layer can become invalid at any time and the layer store can contain both valid and invalid layers.
#2 Updated by Hugo Mercier over 2 years ago
Hi Alessandro, thanks for the information about the new behaviour in QGIS 3. But if I'm correct, this is unrelated to the problem here :)
And in order to complete the report, I forgot to mention the problem is that the layer is not freed even after calling QgsMapLayerRegistry.instance().removeAllMapLayers() and after making sure all local variables are destroyed.
It can be tested by running (under linux) something like 'lsof -c "qgis" | grep "t.sqlite"' and see that the opened sqlite file is still opened.
Maybe it is due to the "/Transfer/" keyword on qgsmaplayeregistry.sip ? in case the passed layer is actually not added to the registry, Python's ref count still gets a +1 and never gets a -1 ?
#6 Updated by Giovanni Manghi over 2 years ago
- Resolution set to end of life
- Status changed from Feedback to Closed
End of life notice: QGIS 2.18 LTR
QGIS 3.4 has recently become our new Long Term Release (LTR) version. This is a major step in our history – a long term release version based on the massive updates, library upgrades and improvements that we carried out in the course of the 2.x to 3x upgrade cycle.
We strongly encourage all users who are currently using QGIS 2.18 LTR as their preferred QGIS release to migrate to QGIS 3.4. This new LTR version will receive regular bugfixes for at least one year. It also includes hundreds of new functions, usability improvements, bugfixes, and other goodies. See the relevant changelogs for a good sampling of all the new features that have gone into version 3.4
Most plugins have been either migrated or incorporated into the core QGIS code base.
We strongly discourage the continued use of QGIS 2.18 LTR as it is now officially unsupported, which means we’ll not provide any bug fix releases for it.
You should also note that we intend to close all bug tickets referring to the now obsolete LTR version. Original reporters will receive a notification of the ticket closure and are encouraged to check whether the issue persists in the new LTR, in which case they should reopen the ticket.
If you would like to better understand the QGIS release roadmap, check out our roadmap page! It outlines the schedule for upcoming releases and will help you plan your deployment of QGIS into an operational environment.
The development of QGIS 3.4 LTR has been made possible by the work of hundreds of volunteers, by the investments of companies, professionals, and administrations, and by continuous donations and financial support from many of you. We sincerely thank you all and encourage you to collaborate and support the project even more, for the long term improvement and sustainability of the QGIS project.