Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions lib/solid_cache/store/api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,8 @@ def write_entry(key, entry, raw: false, unless_exist: false, **options)
payload = serialize_entry(entry, raw: raw, **options)

if unless_exist
written = false
entry_lock_and_write(key) do |value|
if value.nil? || deserialize_entry(value, **options).expired?
written = true
payload
end
written = !!entry_lock_and_write(key) do |value|
payload if value.nil? || deserialize_entry(value, **options).expired?
end
else
written = entry_write(key, payload)
Expand Down
17 changes: 17 additions & 0 deletions test/unit/solid_cache_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,23 @@ class SolidCacheFailsafeTest < ActiveSupport::TestCase
@peek = lookup_store(expires_in: 60)
end

test "write with unless_exist returns false when persistence fails" do
SolidCache::Entry.expects(:write).raises(ActiveRecord::Deadlocked)

assert_equal false, @cache.write("foo", "bar", unless_exist: true)
assert_nil @cache.read("foo")
end

test "failed write with unless_exist does not populate the local cache" do
SolidCache::Entry.expects(:write).raises(ActiveRecord::StatementTimeout)

@cache.with_local_cache do
@cache.write("foo", "bar", unless_exist: true)

assert_nil @cache.read("foo")
end
end

def emulating_unavailability
wait_for_background_tasks(@cache)
emulating_timeouts do
Expand Down
Loading