Reload is using a cache and i dont want it to be

class PendingOrder < ActiveRecord::Base
def sleep_until_processed
sleep 0.5
while !processed?
reload
sleep 0.25
end
end
end

Aug 10 19:43:38 prod-app1 foo[31608]: PendingOrder Load (0.6ms)
SELECT * FROM pending_orders LIMIT 1
Aug 10 19:43:39 prod-app1 foo[31496]: CACHE (0.0ms) SELECT * FROM
pending_orders WHERE (pending_orders.id = 221)

So the first query is legit – but second query is cached, and so
forth. Every subsequent query ends up being a cached value, forever.

How can I make the above method not look at a cache?

Josh Sharpe wrote:

class PendingOrder < ActiveRecord::Base
def sleep_until_processed
sleep 0.5
while !processed?
reload
sleep 0.25
end
end
end

Aug 10 19:43:38 prod-app1 foo[31608]: PendingOrder Load (0.6ms)
SELECT * FROM pending_orders LIMIT 1
Aug 10 19:43:39 prod-app1 foo[31496]: CACHE (0.0ms) SELECT * FROM
pending_orders WHERE (pending_orders.id = 221)

So the first query is legit – but second query is cached, and so
forth. Every subsequent query ends up being a cached value, forever.

How can I make the above method not look at a cache?

Not forever! Subsequent queries are cached until an update changes the
underlying data. Isn’t it good to read from the cache if the underlying
database hasn’t changed?

I am assuming that “processed?” reads from a column in your
pending_orders table. If something in your application changes that
value then the query cache should be cleared automatically. However, if
that database change were to happen outside of your Rails application I
could see that your code could end up blocking forever.

In any case I would recommend adding some “circuit breaker” code to your
method to prevent blocking forever. Maybe some sort of timeout/watchdog
to limit the amount of time this method could block.

Josh Sharpe wrote:

class PendingOrder < ActiveRecord::Base
def sleep_until_processed
sleep 0.5
while !processed?
reload
sleep 0.25
end
end
end

Robert W. wrote:

In any case I would recommend adding some “circuit breaker” code to your
method to prevent blocking forever. Maybe some sort of timeout/watchdog
to limit the amount of time this method could block.

And, if your Rails application is single treaded then your
sleep_until_processed method could block your entire Rails application
never allowing other parts of the application to perform the work
necessary to update the pending_orders table.

Maybe you should consider offloading this work to a background process
using something like delayed_job or similar.

Frederick C. wrote:

On Aug 11, 11:07�am, Robert W. [email protected] wrote:

I am assuming that “processed?” reads from a column in your
pending_orders table. If something in your application changes that
value then the query cache should be cleared automatically. However, if
that database change were to happen outside of your Rails application I
could see that your code could end up blocking forever.

It’s more than that - the cache is in memory, so the cache won’t be
cleared if a different rails instances touches the data

I actually misstated that, sorry. I should have said anything outside
the current Rails instance (including other Rails instances).

Thanks Frederick for the clarification. And also for the uncached
solution. I wasn’t actually aware of that, but it’s definitely good to
know.

On Aug 11, 11:07 am, Robert W. [email protected] wrote:

I am assuming that “processed?” reads from a column in your
pending_orders table. If something in your application changes that
value then the query cache should be cleared automatically. However, if
that database change were to happen outside of your Rails application I
could see that your code could end up blocking forever.

It’s more than that - the cache is in memory, so the cache won’t be
cleared if a different rails instances touches the data

Something like

PendingOrder.uncached do

end

should do the trick

Fred