atomic_cache 0.5.2.rc1 → 0.5.3.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 47216ee7b28e97d5a2a0d45ec7a7831d6ee05038f2029498654006b7ad42171c
4
- data.tar.gz: 025c598a7d72bd3387c0fe0057a3047227ad9c6ae67ed818912a98d3a3f21e05
3
+ metadata.gz: 508ff6dd988d3b864438c2c54d3bca4cba2490a62c2ae97ed2b313522d5e8694
4
+ data.tar.gz: e0cd9a214c089780758955d2642c406484e0404c669d87faf347de1d8cb3a781
5
5
  SHA512:
6
- metadata.gz: d575cb83f4bd7a97d902ad8b15d2da5063ea12edfcadc4d4b6c21f9ea1600413635cb84ee98025747bf49a82a7f97a91a73a5ba6152d7c5095ce19b556c5b7ad
7
- data.tar.gz: 19486f04dfeb751f70b8e1c828b6affa6619829f2a467b87070b4c81a38d7656a57d7ceb02d935d1cf33e3bf4fc47f1356769cb27a19ae177a73cd0af86dbb6b
6
+ metadata.gz: f5e751211a50a029cf4043fa89bf74e50cb200835985c884b5a0faa782b9fc3b8b4c9a0b55be561763363c6625e124c9c11bee75cb15596ddea7b7213bb20bc7
7
+ data.tar.gz: b3fa0f5bed38fe417103a02409fcb1bf9ccb7611d69887ac6b5cc565e1440a6148ab9f306cb3283fbce2369bf26012f2532a21e889871a47e22d3a517f8b9b84
data/docs/USAGE.md CHANGED
@@ -38,6 +38,12 @@ The ideal `generate_ttl_ms` time is just slightly longer than the average genera
38
38
 
39
39
  If metrics are enabled, the `<namespace>.generate.run` can be used to determine the min/max/average generate time for a particular cache and the `generate_ttl_ms` tuned using that.
40
40
 
41
+ ##### ⚠️ TTL Rounding
42
+ When using atomic_cache with memcached, be aware that the TTL will be rounded down to the nearest whole seconds. For example, a `generate_ttl_ms` value of 3500 will result in a 3s TTL with memcache.
43
+
44
+ ##### ⚠️ Max Rate of Change
45
+ Atomic_cache will *not* remove the lock after the generation process is done. This is both more efficient, and allows the `generate_ttl_ms` to be used to limit the total rate of change. For example, if the typical database query behind the cache takes 2s to run, but `generate_ttl_ms` is set to 10s, then the lock will live on for 8s after the generate process finishes, preventing other processes from querying for a new value. In many ways, `generate_ttl_ms` is the amount of time that the system will be un-allowed to make additional queries.
46
+
41
47
  #### `max_retries` & `backoff_duration_ms`
42
48
  _`max_retries` defaults to 5._
43
49
  _`backoff_duration_ms` defaults to 50ms._
@@ -144,16 +144,6 @@ module AtomicCache
144
144
  if !value.nil?
145
145
  metrics(:increment, 'wait.present', tags: metrics_tags)
146
146
  return value
147
- else
148
- # if we didn't get a fresh value this go-round, check if there's a last known value
149
- # if expirations were to come in rapidly, it's possible that the expiration which caused
150
- # the wait cycle wrote a value, and it's now in LKV, and a new expiration came in, which
151
- # has moved the LMT forward
152
- value = last_known_value(keyspace, options, tags)
153
- if !value.nil?
154
- metrics(:increment, 'wait.lkv.present', tags: metrics_tags)
155
- return value
156
- end
157
147
  end
158
148
  end
159
149
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AtomicCache
4
- VERSION = "0.5.2.rc1"
4
+ VERSION = "0.5.3.rc1"
5
5
  end
@@ -163,26 +163,6 @@ describe 'AtomicCacheClient' do
163
163
  expect(result).to eq(new_value)
164
164
  end
165
165
 
166
- it 'uses the last known value if the LMT increments while waiting' do
167
- key_storage.set(timestamp_manager.last_modified_time_key, '1420090000')
168
- key_storage.set(keyspace.last_known_key_key, 'lkk_key')
169
- last_known_value = 'value from another thread'
170
-
171
- # fetching the 'fresh' value continually returns nil (because LMT is incrementing forward)
172
- allow(cache_storage).to receive(:read)
173
- .with(timestamp_manager.current_key(keyspace), anything)
174
- .and_return(nil, nil, nil, nil)
175
-
176
- # multiple returned values are faking what it would look like if another process
177
- # promoted a value (wrote LKV) but then the cache expired right after
178
- allow(cache_storage).to receive(:read)
179
- .with(timestamp_manager.last_known_key(keyspace), anything)
180
- .and_return(nil, nil, nil, last_known_value)
181
-
182
- result = subject.fetch(keyspace, backoff_duration_ms: 5) { 'value from generate' }
183
- expect(result).to eq(last_known_value)
184
- end
185
-
186
166
  it 'stops waiting when the max retry count is reached' do
187
167
  timestamp_manager.promote(keyspace, last_known_key: 'asdf', timestamp: 1420090000)
188
168
  result = subject.fetch(keyspace, backoff_duration_ms: 5) { 'value from generate' }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atomic_cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2.rc1
4
+ version: 0.5.3.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ibotta Developers
@@ -9,22 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-07-13 00:00:00.000000000 Z
12
+ date: 2021-08-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '1.14'
20
+ version: '0'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - "~>"
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: '1.14'
27
+ version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: gems
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -144,9 +144,6 @@ dependencies:
144
144
  - - ">="
145
145
  - !ruby/object:Gem::Version
146
146
  version: '4.2'
147
- - - "<"
148
- - !ruby/object:Gem::Version
149
- version: '6'
150
147
  type: :runtime
151
148
  prerelease: false
152
149
  version_requirements: !ruby/object:Gem::Requirement
@@ -154,9 +151,6 @@ dependencies:
154
151
  - - ">="
155
152
  - !ruby/object:Gem::Version
156
153
  version: '4.2'
157
- - - "<"
158
- - !ruby/object:Gem::Version
159
- version: '6'
160
154
  - !ruby/object:Gem::Dependency
161
155
  name: murmurhash3
162
156
  requirement: !ruby/object:Gem::Requirement