Class: RedisMemo::AfterCommit

Inherits:
Object
  • Object
show all
Defined in:
lib/redis_memo/after_commit.rb

Overview

TODO: -> RedisMemo::Memoizable::AfterCommit

Defined Under Namespace

Classes: Callback

Constant Summary collapse

@@callback_added =

We assume there’s only one ActiveRecord DB connection used for opening transactions

false
@@pending_memo_versions =
{}
@@previous_memo_versions =
{}

Class Method Summary collapse

Class Method Details

.after_commit(&blk) ⇒ Object



38
39
40
41
42
# File 'lib/redis_memo/after_commit.rb', line 38

def self.after_commit(&blk)
  connection.add_transaction_record(
    RedisMemo::AfterCommit::Callback.new(connection, committed: blk),
  )
end

.after_rollback(&blk) ⇒ Object



44
45
46
47
48
# File 'lib/redis_memo/after_commit.rb', line 44

def self.after_rollback(&blk)
  connection.add_transaction_record(
    RedisMemo::AfterCommit::Callback.new(connection, rolledback: blk),
  )
end

.bump_memo_version_after_commit(key, version, previous_version:) ⇒ Object



24
25
26
27
28
29
# File 'lib/redis_memo/after_commit.rb', line 24

def self.bump_memo_version_after_commit(key, version, previous_version:)
  @@pending_memo_versions[key] = version
  @@previous_memo_versions[key] = previous_version

  reset_after_transaction
end

.connectionObject



12
13
14
# File 'lib/redis_memo/after_commit.rb', line 12

def self.connection
  ActiveRecord::Base.connection
end

.in_transaction?Boolean

Returns:

  • (Boolean)


33
34
35
36
# File 'lib/redis_memo/after_commit.rb', line 33

def self.in_transaction?
  # service transactions (tests and database_cleaner) are not joinable
  connection.transaction_open? && connection.current_transaction.joinable?
end

.pending_memo_versionsObject



16
17
18
19
20
21
22
# File 'lib/redis_memo/after_commit.rb', line 16

def self.pending_memo_versions
  # In DB transactions, the pending memo version should be used immediately
  # as part of method checksums. method_cache_keys made of
  # pending_memo_versions are not referencable until we bump the
  # pending_memo_versions after commiting the current transaction
  @@pending_memo_versions
end

.reset(commited:) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/redis_memo/after_commit.rb', line 64

def self.reset(commited:)
  if commited
    @@pending_memo_versions.each do |key, version|
      invalidation_queue =
        RedisMemo::Memoizable::Invalidation.class_variable_get(:@@invalidation_queue)

      invalidation_queue << RedisMemo::Memoizable::Invalidation::Task.new(
        key,
        version,
        @@previous_memo_versions[key],
      )
    end

    RedisMemo::Memoizable::Invalidation.drain_invalidation_queue
  else
    @@pending_memo_versions.each_key do |key|
      RedisMemo::Cache.local_cache&.delete(key)
    end
  end
  @@callback_added = false
  @@pending_memo_versions.clear
  @@previous_memo_versions.clear
end

.reset_after_transactionObject



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/redis_memo/after_commit.rb', line 50

def self.reset_after_transaction
  return if @@callback_added

  @@callback_added = true

  after_commit do
    reset(commited: true)
  end

  after_rollback do
    reset(commited: false)
  end
end