skip to Main Content

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 ?

2

Answers


  1. In my case, yum had several enabled pgdg repositories and the gdal lib was installed from a different pg version as Postgis. After reducing the enabled pgdg repositories to just one (the version of interest) and reinstall ( or better erase & install) the effected packages, I was able to use pg with Postgis again.

    How to disable repositories see How to enable or disable repositories in CentOS. Related file was in my case /etc/yum.repos.d/pgdg-redhat-all.repo

    The mixed repository situation already exist before the upgrade and Postgis was working without trouble

    [test@mytest ~]$ yum list installed | grep -i geos
    geos37.x86_64                         3.7.2-2.rhel7                  @pgdg10
    [test@mytest ~]$ yum list installed | grep -i gdal
    gdal-libs.x86_64                      1.11.4-12.rhel7                @pgdg96
    gdal30-libs.x86_64                    3.0.1-4.rhel7                  @pgdg10
    [test@mytest ~]$ yum list installed | grep -i postgis
    postgis24_96.x86_64                   2.4.8-5.rhel7                  @pgdg96
    postgis24_96-client.x86_64            2.4.8-5.rhel7                  @pgdg96
    
    [test@mytest ~]$ yum repolist enabled | grep -i Postgre
    pgdg10/7/x86_64      PostgreSQL 10 for RHEL/CentOS 7 - x86_64              1,306
    pgdg11/7/x86_64      PostgreSQL 11 for RHEL/CentOS 7 - x86_64              1,162
    pgdg12/7/x86_64      PostgreSQL 12 for RHEL/CentOS 7 - x86_64                596
    pgdg96/7/x86_64      PostgreSQL 9.6 for RHEL/CentOS 7 - x86_64             1,354
    
    
    [test@mytest ~]$ psql
    psql (9.6.15)
    
    postgres=# CREATE DATABASE test;
    CREATE DATABASE
    postgres=# connect test
    You are now connected to database "test" as user "test".
    test=# CREATE EXTENSION postgis;
    CREATE EXTENSION
    test=# connect postgres
    You are now connected to database "postgres" as user "test".
    postgres=# DROP DATABASE test;
    DROP DATABASE
    

    After yum update the mixed repository situation was extended and postgis makes trouble. (grep search for pgdg to detect all effected packages)

    [test@mytest ~]$ yum list installed | grep -i pgdg
    CGAL.x86_64                           4.7-1.rhel7.1                  @pgdg11
    SFCGAL.x86_64                         1.3.1-2.rhel7                  @pgdg12
    SFCGAL-libs.x86_64                    1.3.1-2.rhel7                  @pgdg12
    gdal-libs.x86_64                      1.11.4-12.rhel7                @pgdg96
    gdal30-libs.x86_64                    3.0.1-4.rhel7                  @pgdg10
    geos37.x86_64                         3.7.2-2.rhel7                  @pgdg10
    libgeotiff.x86_64                     1.4.0-1.rhel7.1                @pgdg11
    libgeotiff15.x86_64                   1.5.1-2.rhel7                  @pgdg12
    ogdi.x86_64                           3.2.0-4.rhel7.1                @pgdg11
    ogdi41.x86_64                         4.1.0-2.rhel7                  @pgdg10
    pgdg-redhat-repo.noarch               42.0-5                         @pgdg10
    postgis24_96.x86_64                   2.4.8-5.rhel7                  @pgdg96
    ...
    proj62.x86_64                         6.2.0-1.rhel7                  @pgdg10
    [test@mytest ~]$ psql
    ...
    test=# CREATE EXTENSION postgis;
    ERROR:  could not load library "/usr/pgsql-9.6/lib/rtpostgis-2.4.so": /usr/gdal30/lib/libgdal.so.26: undefined symbol: GEOSMakeValid_r
    test=# 
    

    I tried to reinstall Postgis with only only one pgpdg repository enabled. This was not reinstalling the dependent geos, gdal, proj packages. So I removed all effected packages and install them again.

    [test@mytest ~]$ sudo yum erase CGAL geos37 proj62 proj49 ogdi41
    [test@mytest ~]$ sudo yum install postgis24_96
    
    [test@mytest ~]$ yum list installed | grep -i pgdg
    CGAL.x86_64                           4.7-1.rhel7                    @pgdg96
    SFCGAL.x86_64                         1.3.1-1.rhel7                  @pgdg96
    SFCGAL-libs.x86_64                    1.3.1-1.rhel7                  @pgdg96
    gdal30-libs.x86_64                    3.0.4-2.rhel7                  @pgdg96
    geos38.x86_64                         3.8.0-1.rhel7                  @pgdg96
    ...
    postgis24_96.x86_64                   2.4.8-8.rhel7                  @pgdg96
    

    This is a hard system change, ensure to have a backup (e.g. VM snapshot). And also check, if dependent other installations (e.g. python shapely) still works with the changed libraries or requires a reinstall.

    Login or Signup to reply.
  2. 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:

    1. The GEOS library libgeos_c has an ABI break between versions 3.7 and 3.8, but failed to change the library major version.

    2. The PGDG RPM packages fail to implement an incompatibility between these two GEOS packages. They should never be installed at the same time.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search