Class: SolidObjects::Lease
- Inherits:
-
Object
- Object
- SolidObjects::Lease
- Defined in:
- lib/solid_objects/lease.rb,
sig/generated/lib/solid_objects/lease.rbs
Instance Attribute Summary collapse
-
#database_adapter ⇒ Object
readonly
Returns the value of attribute database_adapter.
- #expires_at ⇒ Object readonly
- #generation ⇒ Object readonly
- #instance_id ⇒ Object readonly
- #owner_id ⇒ Object readonly
Class Method Summary collapse
- .acquire(instance_id:, owner_id:, duration: SolidObjects.configuration.lease_duration, database_adapter: SolidObjects.database_adapter) ⇒ Lease?
- .claim(instance:, owner_id:, now:, database_adapter:, duration: SolidObjects.configuration.lease_duration) ⇒ Lease?
Instance Method Summary collapse
- #fenced_transaction {|arg0| ... } ⇒ Object
-
#initialize(instance_id:, owner_id:, generation:, expires_at:, database_adapter:) ⇒ Lease
constructor
A new instance of Lease.
- #locked_owned_instance! ⇒ Instance
- #owned_generation?(instance) ⇒ Boolean
- #release ⇒ Boolean
- #renew(duration: SolidObjects.configuration.lease_duration) ⇒ Lease
- #verify_unexpired!(instance, now) ⇒ void
Constructor Details
#initialize(instance_id:, owner_id:, generation:, expires_at:, database_adapter:) ⇒ Lease
Returns a new instance of Lease.
78 79 80 81 82 83 84 |
# File 'lib/solid_objects/lease.rb', line 78 def initialize(instance_id:, owner_id:, generation:, expires_at:, database_adapter:) @instance_id = instance_id @owner_id = owner_id @generation = generation @expires_at = expires_at @database_adapter = database_adapter end |
Instance Attribute Details
#database_adapter ⇒ Object (readonly)
Returns the value of attribute database_adapter.
147 148 149 |
# File 'lib/solid_objects/lease.rb', line 147 def database_adapter @database_adapter end |
#expires_at ⇒ Object (readonly)
75 76 77 |
# File 'lib/solid_objects/lease.rb', line 75 def expires_at @expires_at end |
#generation ⇒ Object (readonly)
75 76 77 |
# File 'lib/solid_objects/lease.rb', line 75 def generation @generation end |
#instance_id ⇒ Object (readonly)
75 76 77 |
# File 'lib/solid_objects/lease.rb', line 75 def instance_id @instance_id end |
#owner_id ⇒ Object (readonly)
75 76 77 |
# File 'lib/solid_objects/lease.rb', line 75 def owner_id @owner_id end |
Class Method Details
.acquire(instance_id:, owner_id:, duration: SolidObjects.configuration.lease_duration, database_adapter: SolidObjects.database_adapter) ⇒ Lease?
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/solid_objects/lease.rb', line 34 def acquire( instance_id:, owner_id:, duration: SolidObjects.configuration.lease_duration, database_adapter: SolidObjects.database_adapter ) lease = database_adapter.transaction do instance = Instance.lock.find(instance_id) now = database_adapter.database_now claim(instance:, owner_id:, now:, duration:, database_adapter:) end if lease SolidObjects.instrument( :"activation.claimed", instance_id:, owner_id:, generation: lease.generation ) end lease end |
.claim(instance:, owner_id:, now:, database_adapter:, duration: SolidObjects.configuration.lease_duration) ⇒ Lease?
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/solid_objects/lease.rb', line 7 def claim( instance:, owner_id:, now:, database_adapter:, duration: SolidObjects.configuration.lease_duration ) return if held_by_another_live_owner?(instance, owner_id, now) generation = instance.activation_generation + 1 expires_at = now + duration instance.update!( activation_owner_id: owner_id, activation_expires_at: expires_at, activation_generation: generation, activated_at: now, last_claimed_at: now ) new( instance_id: instance.id, owner_id:, generation:, expires_at:, database_adapter: ) end |
Instance Method Details
#fenced_transaction {|arg0| ... } ⇒ Object
137 138 139 140 141 142 143 |
# File 'lib/solid_objects/lease.rb', line 137 def fenced_transaction database_adapter.transaction do instance = locked_owned_instance! verify_unexpired!(instance, database_adapter.database_now) yield instance end end |
#locked_owned_instance! ⇒ Instance
150 151 152 153 154 155 156 157 |
# File 'lib/solid_objects/lease.rb', line 150 def locked_owned_instance! instance = Instance.lock.find_by(id: instance_id) raise ActorDestroyed, "actor instance no longer exists" unless instance instance.tap do raise LostActivation, "activation owner or generation changed" unless owned_generation?(instance) end end |
#owned_generation?(instance) ⇒ Boolean
160 161 162 163 |
# File 'lib/solid_objects/lease.rb', line 160 def owned_generation?(instance) instance.activation_owner_id == owner_id && instance.activation_generation == generation end |
#release ⇒ Boolean
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/solid_objects/lease.rb', line 114 def release released = database_adapter.transaction do instance = Instance.lock.find_by(id: instance_id) next false unless instance next false unless owned_generation?(instance) instance.update!(activation_owner_id: nil, activation_expires_at: nil) true end if released SolidObjects.instrument( :"activation.released", instance_id:, owner_id:, generation: ) end released end |
#renew(duration: SolidObjects.configuration.lease_duration) ⇒ Lease
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/solid_objects/lease.rb', line 87 def renew(duration: SolidObjects.configuration.lease_duration) renewed_lease = database_adapter.transaction do instance = locked_owned_instance! now = database_adapter.database_now verify_unexpired!(instance, now) renewed_expiration = now + duration instance.update!(activation_expires_at: renewed_expiration) self.class.new( instance_id:, owner_id:, generation:, expires_at: renewed_expiration, database_adapter: ) end SolidObjects.instrument( :"activation.renewed", instance_id:, owner_id:, generation:, expires_at: renewed_lease.expires_at ) renewed_lease end |
#verify_unexpired!(instance, now) ⇒ void
This method returns an undefined value.
166 167 168 169 170 |
# File 'lib/solid_objects/lease.rb', line 166 def verify_unexpired!(instance, now) return if instance.activation_expires_at && instance.activation_expires_at > now raise LostActivation, "activation lease expired" end |