File "/home/valentin/dev/backend/arkindex/documents/serializers/elements.py", line 478, in create zone = Zone \ File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get raise self.model.DoesNotExist(arkindex.images.models.Zone.DoesNotExist: Zone matching query does not exist.During handling of the above exception, another exception occurred:Traceback (most recent call last): File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute return self.cursor.execute(sql, params)psycopg2.errors.CheckViolation: new row for relation "images_zone" violates check constraint "zone_polygon_size"DETAIL: Failing row contains (5a530085-2135-4137-8afa-bf3f6feffc20, 2021-04-19 11:31:15.206287+00, 2021-04-19 11:31:15.206306+00, f5aa2125-017b-4f29-bdca-81de75f8c03a, 0102000000A60000000000000000F9B3400000000000E49E40000000000003B4...).The above exception was the direct cause of the following exception:Traceback (most recent call last): File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/contrib/staticfiles/handlers.py", line 76, in __call__ return self.application(environ, start_response) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/core/handlers/wsgi.py", line 133, in __call__ response = self.get_response(request) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/core/handlers/base.py", line 130, in get_response response = self._middleware_chain(request) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/core/handlers/exception.py", line 49, in inner response = response_for_exception(request, exc) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/core/handlers/exception.py", line 103, in response_for_exception response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info()) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/core/handlers/exception.py", line 138, in handle_uncaught_exception return debug.technical_500_response(request, *exc_info) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django_extensions/management/technical_response.py", line 40, in null_technical_500_response raise exc_value.with_traceback(tb) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner response = get_response(request) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view return view_func(*args, **kwargs) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view return self.dispatch(request, *args, **kwargs) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch response = self.handle_exception(exc) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception self.raise_uncaught_exception(exc) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception raise exc File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch response = handler(request, *args, **kwargs) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/drf_spectacular/utils.py", line 369, in wrapped_method return method(self, request, *args, **kwargs) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/rest_framework/generics.py", line 190, in post return self.create(request, *args, **kwargs) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/rest_framework/mixins.py", line 19, in create self.perform_create(serializer) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/rest_framework/mixins.py", line 24, in perform_create serializer.save() File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/rest_framework/serializers.py", line 205, in save self.instance = self.create(validated_data) File "/home/valentin/dev/backend/arkindex/documents/serializers/elements.py", line 488, in create zone = image.zones.create(polygon=polygon) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 677, in create return super(RelatedManager, self.db_manager(db)).create(**kwargs) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create obj.save(force_insert=True, using=self.db) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/models/base.py", line 753, in save self.save_base(using=using, force_insert=force_insert, File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/models/base.py", line 790, in save_base updated = self._save_table( File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/models/base.py", line 895, in _save_table results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/models/base.py", line 933, in _do_insert return manager._insert( File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/models/query.py", line 1254, in _insert return query.get_compiler(using=using).execute_sql(returning_fields) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1397, in execute_sql cursor.execute(sql, params) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/debug_toolbar/panels/sql/tracking.py", line 198, in execute return self._record(self.cursor.execute, sql, params) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/debug_toolbar/panels/sql/tracking.py", line 133, in _record return method(sql, params) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django_extensions/management/debug_cursor.py", line 48, in execute return utils.CursorWrapper.execute(self, sql, params) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers return executor(sql, params, many, context) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute return self.cursor.execute(sql, params) File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "/home/valentin/.virtualenvs/backend/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute return self.cursor.execute(sql, params)django.db.utils.IntegrityError: new row for relation "images_zone" violates check constraint "zone_polygon_size"DETAIL: Failing row contains (5a530085-2135-4137-8afa-bf3f6feffc20, 2021-04-19 11:31:15.206287+00, 2021-04-19 11:31:15.206306+00, f5aa2125-017b-4f29-bdca-81de75f8c03a, 0102000000A60000000000000000F9B3400000000000E49E40000000000003B4...).
After a lot of investigation with @vrigal & @erwanrouchet we are faced with the prod database behaving differently on the same polygon (inserted now, vs already in the DB):
arkindex_prod=# select id, pg_column_size(polygon), st_memsize(ST_normalize(polygon)), st_summary(polygon), st_memsize(polygon), st_memsize(st_geomfromtext(st_astext(polygon))) from images_zone where id in ('628f3404-946a-4eb5-86c5-f91294b507c8', 'a43f6d05-235f-45f6-9379-00b5ea2361de'); id | pg_column_size | st_memsize | st_summary | st_memsize | st_memsize--------------------------------------+----------------+------------+-------------------------------+------------+------------ 628f3404-946a-4eb5-86c5-f91294b507c8 | 770 | 2656 | LineString[B] with 164 points | 2664 | 2656 a43f6d05-235f-45f6-9379-00b5ea2361de | 769 | 2656 | LineString[B] with 164 points | 2656 | 2656(2 rows)
The memory size detected by postgis is 2664 instead of 2656 (8 extra bytes).
As we can't find a reasonable way to detect this behaviour (nor its source), we have to lower the maximum number of points for new polygons to 164, without touching the existing constraints: this will give us a bit more of error margin.