I have the following error with my Django project after doing yum upgrade a few days ago
Traceback (most recent call last):
File "manage.py", line 21, in <module>
main()
File "manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/core/management/__init__.py", line 357, in execute
django.setup()
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/apps/registry.py", line 114, in populate
app_config.import_models()
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/apps/config.py", line 211, in import_models
self.models_module = import_module(models_module_name)
File "/home/joincic/GeoRouting/GeoRouting_2/lib64/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/auth/models.py", line 2, in <module>
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/auth/base_user.py", line 47, in <module>
class AbstractBaseUser(models.Model):
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/models/base.py", line 117, in __new__
new_class.add_to_class('_meta', Options(meta, app_label))
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/models/base.py", line 321, in add_to_class
value.contribute_to_class(cls, name)
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/models/options.py", line 204, in contribute_to_class
self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/__init__.py", line 28, in __getattr__
return getattr(connections[DEFAULT_DB_ALIAS], item)
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/utils.py", line 201, in __getitem__
backend = load_backend(db['ENGINE'])
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/utils.py", line 110, in load_backend
return import_module('%s.base' % backend_name)
File "/home/joincic/GeoRouting/GeoRouting_2/lib64/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/backends/postgis/base.py", line 6, in <module>
from .features import DatabaseFeatures
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/backends/postgis/features.py", line 1, in <module>
from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/backends/base/features.py", line 3, in <module>
from django.contrib.gis.db.models import aggregates
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/models/__init__.py", line 3, in <module>
import django.contrib.gis.db.models.functions # NOQA
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/models/functions.py", line 4, in <module>
from django.contrib.gis.db.models.fields import BaseSpatialField, GeometryField
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/models/fields.py", line 3, in <module>
from django.contrib.gis import forms, gdal
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/forms/__init__.py", line 3, in <module>
from .fields import ( # NOQA
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/forms/fields.py", line 2, in <module>
from django.contrib.gis.gdal import GDALException
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/gdal/__init__.py", line 28, in <module>
from django.contrib.gis.gdal.datasource import DataSource
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/gdal/datasource.py", line 39, in <module>
from django.contrib.gis.gdal.driver import Driver
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/gdal/driver.py", line 5, in <module>
from django.contrib.gis.gdal.prototypes import ds as vcapi, raster as rcapi
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/gdal/prototypes/ds.py", line 9, in <module>
from django.contrib.gis.gdal.libgdal import GDAL_VERSION, lgdal
File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/gdal/libgdal.py", line 47, in <module>
lgdal = CDLL(lib_path)
File "/usr/lib64/python3.6/ctypes/__init__.py", line 343, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /usr/gdal30/lib/libgdal.so.26: undefined symbol: GEOSMakeValid_r
The project worked correctly before the upgrade, and trying to fix the error I installed gdal 3.0.2 but it didn't work
I don't know if you need more information about the project or about the virtual machine if so, you can ask me and I will gladly provide you any info
Any Ideas ?
I had the exact same problem with a customer and researched the cause. So while Iczub's answer is good, I think it worthwhile to explain the cause of the problem.
In my case, the error manifested like this:
test=> SELECT PostGIS_Full_Version();
ERROR: could not load library "/usr/pgsql-10/lib/rtpostgis-2.4.so": /usr/gdal30/lib/libgdal.so.26: undefined symbol: GEOSMakeValid_r
CONTEXT: SQL statement "SELECT public.postgis_gdal_version()"
PL/pgSQL function postgis_full_version() line 33 at SQL statement
The solution is simple:
# yum remove geos37
Explanation of what happened:
This was the consequence of a (minor) upgrade from postgis24_10-2.4.6-3.rhel7.x86_64
to postgis24_10-2.4.8-9.rhel7.x86_64
(repository pgdg10
), which installed gdal30-libs-3.0.4
and geos38-3.8.1-1
as dependencies.
The ultimate cause of the problem is that the version of GEOS that was installed previously didn't get deinstalled:
# rpm -qa | grep geos
geos38-3.8.1-1.rhel7.x86_64
geos37-3.7.0-1.rhel7.x86_64
Now both of these packages have a library libgeos_c.so.1
, installed in different directories:
/usr/geos38/lib64/libgeos_c.so.1
/usr/geos37/lib64/libgeos_c.so.1
Both packages put their directory in the shared library path by adding a configuration file to /etc/ld.so.conf.d
, so we end up with two libraries of the same name on the path.
Unfortunately, the library from GEOS 3.7 happened to be the first one on the search path, so libgdal.so.26
loaded that one by mistake, which leads to the observed error.
Who is at fault?
I think there are two bugs:
The GEOS library libgeos_c
has an ABI break between versions 3.7 and 3.8, but failed to change the library major version.
The PGDG RPM packages fail to implement an incompatibility between these two GEOS packages. They should never be installed at the same time.