Thanks SO MUCH! I'm sorry I didn't understand DB.synchronize(:read_only) as I piled through the documentation. I promise I looked, but it wasn't making sense to me. That's super helpful!
Thanks so much again! Geff. On Wednesday, December 9, 2020 at 2:19:22 PM UTC-8 Jeremy Evans wrote: > On Wed, Dec 9, 2020 at 1:37 PM Geff Hanoian <[email protected]> wrote: > >> Jeremy, >> >> Thanks for everything. You are always super help. Cleanest software >> I've ever used. I think everyone on this forum owes you a lifetime supply >> of scotch or whatever you drink. :) >> >> I did what you requested: >> 1. made a super small app that just exercised this problem >> 2. Added the logging as defined above (super helpful!) >> >> What I found is, it seems like DB.synchronize does not allocate anything >> when using a replica. Is DB.synchronize correct for replicas? >> >> The following are the snip of code and log entries: ( can post more of >> the code I just didn't want to inundate ). >> >> tester-primary.rb and tester-replicas.rb lines 25-28: >> DB.synchronize do >> x = Trip.order(:id).first.inspect >> y = Template.order(:id).first.inspect >> end >> >> app/models/template.rb: ( super simple ) >> class Template < Sequel::Model >> many_to_one :user >> end >> >> Querying primary: (seems correct, one NULL for both) >> I, [2020-12-09T13:36:43.722029 #39120] INFO -- : (0.000873s) (conn: >> 47271528492740) (source: tester-primary.rb:25:in `block in <top >> (required)>') SELECT NULL >> I, [2020-12-09T13:36:43.723006 #39120] INFO -- : (0.000753s) (conn: >> 47271528492740) (source: tester-primary.rb:26:in `block (2 levels) in <top >> (required)>') SELECT * FROM "trips" ORDER BY "id" LIMIT 1 >> I, [2020-12-09T13:36:43.723889 #39120] INFO -- : (0.000452s) (conn: >> 47271528492740) (source: tester-primary.rb:27:in `block (2 levels) in <top >> (required)>') SELECT * FROM "templates" ORDER BY "id" LIMIT 1 >> >> Query replica: (3 SELECT NULL) >> I, [2020-12-09T13:35:51.502009 #39117] INFO -- : (0.000418s) (conn: >> 46966930197660) (source: tester-replica.rb:25:in `block in <top >> (required)>') SELECT NULL >> I, [2020-12-09T13:35:51.502847 #39117] INFO -- : (0.000605s) (conn: >> 46966930244680) (source: tester-replica.rb:26:in `block (2 levels) in <top >> (required)>') SELECT NULL >> I, [2020-12-09T13:35:51.504222 #39117] INFO -- : (0.001229s) (conn: >> 46966930244680) (source: tester-replica.rb:26:in `block (2 levels) in <top >> (required)>') SELECT * FROM "trips" ORDER BY "id" LIMIT 1 >> I, [2020-12-09T13:35:51.505495 #39117] INFO -- : (0.000398s) (conn: >> 46966930244680) (source: tester-replica.rb:27:in `block (2 levels) in <top >> (required)>') SELECT NULL >> I, [2020-12-09T13:35:51.506530 #39117] INFO -- : (0.000874s) (conn: >> 46966930244680) (source: tester-replica.rb:27:in `block (2 levels) in <top >> (required)>') SELECT * FROM "templates" ORDER BY "id" LIMIT 1 >> > > In Query replica, the first NULL (for the DB.synchronize line) is for a > different connection than your other ones. Since you didn't provide a > shard to use, DB.synchronize will use the default shard. However, internal > queries to get the columns will use the read_only shard by default, since > there isn't already a connection checked out for the read_only sharded, it > will checkout a connection for each query. You want to make sure you pass > the appropriate shard name to DB.synchronize. So if all access inside the > block should use the read_only shard, you want to checkout the read_only > shard: > > DB.synchronize(:read_only) do > > If you want to use this block for both the default and read only cases, > you'll have to pick the argument you want to pass: > > DB.synchronize(use_replica ? :read_only : :default) do > > Where you have appropriately defined use_replica. > > Alternatively, you could look into using the server_block extension, which > allows all queries in a block to use a specified shard by default. > > 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/32d66cd5-0723-4700-92a0-d48e5b8a3ff4n%40googlegroups.com.
