Ruby pg gem segfault
When running Rails tests (esp. in parallel mode for some reason), once in a while I get a segfault. This is coming from some interaction of pg gem code with krb5 (Kerberos protocol? I’m not familiar.)
The beginning of the error looks like this:
/Users/max/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/pg-1.5.3/lib/pg/connection.rb:690: [BUG] Segmentation fault at 0x00000001007c4abe ruby 3.2.2 (2023-03-30 revision e51014f9c0) [arm64-darwin22]
There are 2 issues in pg’s repo about this:
- An older issue, where a workaround is provided.
- A newer issue that has more discussion, and links to the older one.
There are a few ways to work around this, but they all (except the last one) come down to disabling
GSSENCMODE in postgres.
- Set ENV variable
PGGSSENCMODE=disable(presumably when launching Postgres?)
gssencmode=disablein the connection string. In Rails, this means you just add
gssencmode: disableto the database.yml file, under each of your environments.
- Install postgres without
--with-gssapienabled). Homebrew postgres has
--with-gssapi, asdf postgres doesn’t. The command
otool -Lcan help check. E.g.
otool -L ~/.asdf/installs/postgres/13.9/bin/postgres.
- Initiate the database connection by preloading the app before forking so the macOS system calls are invoked in the parent process. In Puma, the
preload_app!config option does this.