I ended writing an extension that seems to get the job done. 

Thanks for your help.

Any critics are 
welcome https://gist.github.com/mastermatt/a5aa17d84a15f4d0245819751252b1c9

On Wednesday, March 31, 2021 at 3:31:49 PM UTC-6 Jeremy Evans wrote:

> On Wed, Mar 31, 2021 at 9:52 AM 'Matt Wilson' via sequel-talk <
> [email protected]> wrote:
>
>> When a new connection is being added to a pool, I need a way to check a 
>> variable on the server and possibly reject the connection. The idea being 
>> that the new connection would gracefully be closed and the pool would 
>> attempt to create new connections until the validation was successful or 
>> some timeout occurred. 
>>
>> At first glance, it seemed the *ConnectionValidator* extension was right 
>> for the job. However, if I'm reading the source right, it executes the 
>> validation statement if the connection has been sitting the pool for 
>> awhile, not when the connection is first created. 
>>
>> I've tried using the `after_connect`  callback option, however there 
>> doesn't seem to be away for the callback to signal to the pool that the 
>> current connection should be closed and retried. 
>>
>> This might be a feature request, but I'm hoping I missed something with 
>> the current options.
>>
>> I don't think it makes a difference, but if anyone wants context. I use 
>> mysql2 for an AWS Aurora connection. The behavior of Aurora during a 
>> failover is to promote a read-only node to the primary read-write node. 
>> Then (depending on the type of failover) the previous primary stays around, 
>> but gets demoted to a read-only node. When the app attempts to reconnect 
>> the severed connections, depending on how DNS resolves, there is a window 
>> of time when the app could reconnect to the old primary that is now a 
>> read-only. The recommendation from AWS is to query "*SHOW GLOBAL 
>> VARIABLES LIKE 'innodb_read_only';*" and if the value is "ON" attempt a 
>> reconnect.
>>
>
> Sequel doesn't currently have direct support for this.  You could probably 
> do something like:
>
> DB = Sequel.connect("mysql2://...", test: false)
> def DB.connect(*)
>   while true
>     conn = super
>     return conn if # connection is valid
>     disconnect_connection(conn)
>   end
> end
>
> I suppose we could offer a way to :after_connect to return a value 
> indicating a retry, so you wouldn't need to override connect.
>
> Thanks,
> Jeremy
>

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/sequel-talk/32078413-6ea8-403e-b138-72119d18395dn%40googlegroups.com.

Reply via email to