On 2019/04/09 02:04, Jeremy Evans wrote:
On Monday, April 8, 2019 at 1:22:48 PM UTC-7, James Silberbauer wrote:


    On 2019/04/08 20:51, Jeremy Evans wrote:
    On Monday, April 8, 2019 at 6:57:50 AM UTC-7, Gustavo Sobral wrote:

        Hi,

        I have a Sinatra app with Sequel and Postgres adapter running
        in a Phusion Passenger server and I'm facing around 50~60
        Sequel::DatabaseDisconnectError exceptions a day. These
        exceptions have mainly three messages on it:

        PG::UnableToSend:  SSL error: decryption failed or bad record mac
        PG::UnableToSend:  SSL SYSCALL error: EOF detected
        PG::UnableToSend:  PQconsumeInput() SSL error: decryption
        failed or bad record mac

        This is my file responsible for initializing Sequel, I've
        already tried without success to use the
        connection_validation extension:

        |
        # frozen_string_literal: true

        # TZ settings
        Sequel.application_timezone ='Amsterdam'
        Sequel.database_timezone =:utc

        # Json serializer plugin
        Sequel::Model.plugin :json_serializer

        # Global 'DB' handle is a Sequel convention
        db_config
        
=YAML.load_file(File.join(Dir.pwd,'config/database.yml'))[ENV['RACK_ENV']]
        DB =Sequel.connect(db_config)

        # Validate that connections checked out from the pool are
        still valid, before yielding them for use
        #
        
http://sequel.jeremyevans.net/rdoc-plugins/files/lib/sequel/extensions/connection_validator_rb.html
        
<http://sequel.jeremyevans.net/rdoc-plugins/files/lib/sequel/extensions/connection_validator_rb.html>
        DB.extension(:connection_validator
        DB.pool.connection_validation_timeout =-1
        |

        Can anybody shed some light what can possibly be going on
        here? I'm using the free version of Phusion Passenger with
        single-threaded, multi-processed concurrency model.


    That does look like it should work.  The only reason I think it
    wouldn't is if the disconnects are happening on a connection that
    has been validated and already been checked out.  In that case,
    there is nothing that Sequel can do about the issue.  When the
    exception is raised, Sequel will remove the connection from the
    pool, so that a new connection can be established. You could try
    wrapping everything in a transaction and using the :retry_on
    option, but a better approach would be to find out why the
    disconnections are happening in the first place and fix them.

    Thanks,
    Jeremy

    Hi

    I have a similar issue which I have not yet been able to reproduce
    in-house.
    This is not exactly the same issue, but I mention it here as it
    may help in some way.

    This is a Roda app using Sequel which raises the exception:
    "Sequel::DatabaseDisconnectError: PG::ConnectionBad:
    PQconsumeInput() server closed the connection unexpectedly This
    probably means the server terminated abnormally before or while
    processing the request.".

    This only happens on servers that are running the app in Phusion
    Passenger.
    It also only seems to happen after using Capistrano to deploy the
    app. (probably because the deploy triggers a passenger reload-app
    call)
    The disconnect error will come up a short while after deploy and
    it will only happen once.
    Immediately after deploy I am able to interact with the app
    without triggering the exception, but some time later a different
    user will trigger the exception.

    The exception is always raised in the same place - for every
    request there is a check to see if the ip address is in a table
    which identifies certain devices by ip address.
    This is the first database query in all requests.

    This would appear to point to something going wrong when passenger
    reloads a stale process.
    I have not yet had time to try to reproduce this locally, so I
    don't have any further insight at this stage.


Based on the reports, I think in both cases, this may be caused because you didn't disconnect before forking.  If you aren't manually issuing a disconnect call before forking, and you are using preload_app, that is the probable cause.

See:

http://sequel.jeremyevans.net/rdoc/files/doc/code_order_rdoc.html#label-Disconnect+If+Using+Forking+Webserver+with+Code+Preloading

https://www.phusionpassenger.com/library/indepth/ruby/spawn_methods/#am-i-responsible-for-reestablishing-database-connections-after-the-preloader-has-forked-a-child-process

Thanks,
Jeremy

Thank you Jeremy, I was not catering for this, so I'm pretty sure that's the cause.
--
You received this message because you are subscribed to the Google Groups "sequel-talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected] <mailto:[email protected]>. To post to this group, send email to [email protected] <mailto:[email protected]>.
Visit this group at https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to