排查CI环境PostGIS触发器偶发transform错误(代码4096)
偶发PostGIS触发器ST_Transform错误排查思路
问题背景
我们在PostgreSQL中配置了触发器,当行内的eastings和northings值插入或更新时触发。触发器函数通过PostGIS将浮点型的eastings和northings转换为点值并缓存存储,以支持地理空间查询。
在CI测试中,该触发器出现偶发失败问题,本地环境无法复现。CI运行时有时失败有时正常,且失败的测试用例不固定,报错为transform未知错误(代码4096),对应ST_Transform操作,但本地执行相同参数的ST_Transform未出现错误。
环境版本
本地开发环境
SELECT version(); -- 'PostgreSQL 15.8 (Debian 15.8-1.pgdg120+1) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit' SELECT PostGIS_full_version(); -- 'POSTGIS="3.4.2 c19ce56" [EXTENSION] PGSQL="150" GEOS="3.11.1-CAPI-1.17.1" PROJ="9.1.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/var/lib/postgresql/.local/share/proj DATABASE_PATH=/usr/share/proj/proj.db" GDAL="GDAL 3.6.2, released 2023/01/02" LIBXML="2.9.14" LIBJSON="0.16" LIBPROTOBUF="1.4.1" WAGYU="0.5.0 (Internal)" TOPOLOGY RASTER'
CI环境
SELECT version(); -- 'PostgreSQL 15.8 (Debian 15.8-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit' SELECT PostGIS_full_version(); -- 'POSTGIS="3.4.3 e365945" [EXTENSION] PGSQL="150" GEOS="3.11.1-CAPI-1.17.1" PROJ="9.1.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/var/lib/postgresql/.local/share/proj DATABASE_PATH=/usr/share/proj/proj.db" LIBXML="2.9.14" LIBJSON="0.16" LIBPROTOBUF="1.4.1" WAGYU="0.5.0 (Internal)" TOPOLOGY'
排查思路
- 版本差异验证:CI环境使用PostGIS 3.4.3,本地是3.4.2,优先确认该版本差异是否引入ST_Transform的偶发bug。可在本地临时升级到3.4.3,复现CI测试场景,看是否出现相同问题。
- 并发场景模拟:CI测试通常是多任务并行执行,本地可能单线程运行。尝试在本地模拟并发插入/更新操作,触发触发器,看是否能复现偶发错误——可能是并发下PROJ库的资源竞争或状态异常导致。
- 参数边界值排查:虽然本地执行相同参数没问题,但偶发失败可能对应某些边界值(如超出投影范围的坐标、浮点精度异常值)。在CI失败时捕获具体的eastings/northings参数,带回本地反复测试,同时检查测试数据是否存在随机生成的边界值。
- PROJ库状态检查:CI环境的PROJ配置中
NETWORK_ENABLED=OFF,需确认CI环境的proj.db是否完整,是否存在并发访问时的文件锁问题。可在CI测试前后检查PROJ相关日志,或临时启用PROJ的调试日志(通过设置环境变量PROJ_DEBUG=3)获取更详细的错误信息。 - 触发器函数原子性验证:检查触发器函数是否存在非原子操作,比如在转换前未对eastings/northings做空值或有效性校验,并发下可能出现临时无效值被传入ST_Transform。补充参数校验逻辑,避免无效坐标进入转换流程。
- 硬件架构差异:本地是aarch64架构,CI是x86_64,可能存在编译后的二进制兼容性问题。可在CI环境中直接运行ST_Transform的压力测试,看是否能稳定复现错误,或对比两种架构下的浮点运算结果是否存在细微差异。
内容的提问来源于stack exchange,提问作者AbundantSalmon
相关产品推荐
相关产品推荐

