postgresql_cursor icon indicating copy to clipboard operation
postgresql_cursor copied to clipboard

PG::ConnectionBad: PQsocket() can't get socket descriptor: ROLLBACK

Open ajparise opened this issue 2 years ago • 2 comments

Our app opens a cursor which can run for hours at a time. On the longer runs (7+ hours) the cursor occasionally errors out with:

ActiveRecord::StatementInvalid
PG::ConnectionBad: PQsocket() can't get socket descriptor: ROLLBACK

I am trying to rule this gem out as the culprit. I'm not sure if this is masking a different error. Should we be passing with_hold: true in the options?

Here is a snippet of the cursor loop:

# BATCH_SIZE = 10_000
 records.each_instance(block_size: BATCH_SIZE) { |record| @handler.call(record) }

Couple things that may or may not be pertinent:

  • We tried upgrading to 0.6.7 and see the same behavior
  • The records returned by the cursor have associations on them.
  • App makes other read only ActiveRecord calls within the block passed to #each_instance
    • these read only calls do not access the same table as the cursor

ajparise avatar Mar 24 '23 13:03 ajparise

+1 we're having the same issue but only in production.

guemidiborhane avatar Aug 19 '23 16:08 guemidiborhane

After some investigations, seems like the issue in our case is related to the query being run against replica postgresql server, fixed by setting this 2 config lines in postgresql.conf:

max_standby_archive_delay = 600s 
max_standby_streaming_delay = 600s

guemidiborhane avatar Aug 19 '23 18:08 guemidiborhane