hoodoo 1.14.0 → 1.15.0

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
  SHA1:
3
- metadata.gz: 5f2eb0d49452cfe11be6f7953e2915139a799389
4
- data.tar.gz: 2d9ca68a6fc2f064c7e8c1a3473ef3028369ff02
3
+ metadata.gz: fad91d3880f61878b0df4c509f63f8afd7b7ed21
4
+ data.tar.gz: 0c2502907dd97eda85b8ede8369c85935bc2a89a
5
5
  SHA512:
6
- metadata.gz: a3091aedf879cae316a5bbf757bca8f6a01967bd41608359d7ab01f8b54330d2faf482ac0d5d80e222d88ffa9425d15fec98e02e6c976aa9223adbd1ff536816
7
- data.tar.gz: 2194d4e534790c220d2bdfadc2b9efc42a8ba408741b1933a6f0c66edd47e2e40103aa04a6a7a22e66e78576395d035a70e111425aad4c0bf59030590ff50019
6
+ metadata.gz: c011115dcfee583a769f46deb6e167847208860c3fcb7f878191d5c6ef8f51757845530d44ab07f01b387522e730215911865b447e6f93bd78480f28a78abb8a
7
+ data.tar.gz: 2df1b22163e1944e86e4d546bcc950ada63eba410d841e94e144aadcb2696531dfa7f1c3c0427c5bc8ba9184f8ba438a5b9def124c2dc1cc96a21b30586d171f
@@ -178,7 +178,7 @@ module Hoodoo
178
178
 
179
179
  session = @wrapping_session
180
180
  @wrapping_session = nil
181
- session.delete_from_memcached()
181
+ session.delete_from_store()
182
182
  end
183
183
 
184
184
  annotate_errors_from_other_resource_in( result )
@@ -949,7 +949,7 @@ module Hoodoo; module Services
949
949
  # Ignore errors, there's nothing much we can do about them and in
950
950
  # the worst case we just have to wait for this to expire naturally.
951
951
 
952
- session.delete_from_memcached()
952
+ session.delete_from_store()
953
953
  end
954
954
 
955
955
  # Extract the returned data, handling error conditions.
@@ -1629,7 +1629,7 @@ module Hoodoo; module Services
1629
1629
  :session_id => session_id
1630
1630
  )
1631
1631
 
1632
- result = session.load_from_memcached!( session_id )
1632
+ result = session.load_from_store!( session_id )
1633
1633
  session = nil if result != :ok
1634
1634
  elsif ( self.class.environment.test? || self.class.environment.development? )
1635
1635
  interaction.using_test_session()
@@ -9,7 +9,7 @@
9
9
  ########################################################################
10
10
 
11
11
  require 'ostruct'
12
- require 'dalli'
12
+ require 'hoodoo/transient_store'
13
13
  require 'hoodoo/transient_store/mocks/dalli_client'
14
14
 
15
15
  module Hoodoo
@@ -20,8 +20,7 @@ module Hoodoo
20
20
  class Session
21
21
 
22
22
  # Time To Live: Number of seconds for which a session remains valid
23
- # after being saved. Only applicable from the save time onwards in
24
- # stores that support TTL such as Memcached - see #save_to_memcached.
23
+ # after being saved.
25
24
  #
26
25
  TTL = 172800 # 48 hours
27
26
 
@@ -47,8 +46,8 @@ module Hoodoo
47
46
  # version changes, associated sessions are flushed.
48
47
  #
49
48
  # If you _change_ a Caller version in a Session, you _really_ should
50
- # call #save_to_memcached as soon as possible afterwards so that the
51
- # change gets recognised in Memcached.
49
+ # call #save_to_store as soon as possible afterwards so that the
50
+ # change gets recognised in the transient store.
52
51
  #
53
52
  attr_accessor :caller_version
54
53
 
@@ -107,7 +106,7 @@ module Hoodoo
107
106
  # Only set when the session is saved (or loaded from a representation
108
107
  # that includes an existing expiry date). See e.g.:
109
108
  #
110
- # * #save_to_memcached
109
+ # * #save_to_store
111
110
  #
112
111
  # The value is a Time instance in UTC. If +nil+, the session has not
113
112
  # yet been saved.
@@ -138,9 +137,7 @@ module Hoodoo
138
137
  #
139
138
  # +caller_version+:: Version of the Caller instance; defaults to zero.
140
139
  #
141
- # +memcached_host+:: Host for Memcached connections; required if you
142
- # want to use the #load_from_memcached! or
143
- # #save_to_memcached methods.
140
+ # +memcached_host+:: Host for Memcached connections.
144
141
  #
145
142
  def initialize( options = {} )
146
143
  @created_at = Time.now.utc
@@ -151,62 +148,95 @@ module Hoodoo
151
148
  self.caller_version = options[ :caller_version ] || 0
152
149
  end
153
150
 
154
- # Save this session to Memcached, in a manner that will allow it to
155
- # be loaded by #load_from_memcached! later.
151
+ # Save this session to the transient store, in a manner that will allow
152
+ # it to be loaded by #load_from_store! later.
156
153
  #
157
- # A session can only be saved if it has a Caller ID - see #caller_id=
158
- # or the options hash passed to the constructor.
154
+ # A session can only be saved if it has a Caller ID - see #caller_id= or
155
+ # the options hash passed to the constructor.
159
156
  #
160
- # The Hoodoo::Services::Session::TTL constant determines how long the
161
- # key lives in Memcached.
157
+ # The Hoodoo::Services::Session::TTL constant determines the maximum
158
+ # length of time for which the data persists inside the transient store.
162
159
  #
163
160
  # Returns a symbol:
164
161
  #
165
162
  # * +:ok+: The session data was saved OK and is valid. There was either
166
- # a Caller record with an earlier or matching value in Memcached, or
167
- # no preexisting record of the Caller.
163
+ # a Caller record with an earlier or matching value in the transient
164
+ # store, no preexisting record of the Caller.
168
165
  #
169
166
  # * +:outdated+: The session data could not be saved because an existing
170
- # Caller record was found in Memcached with a _newer_ version than
171
- # 'this' session, implying that the session is already outdated.
167
+ # Caller record was found in the transient store with a _newer_ version
168
+ # than 'this' session, implying that the session is already outdated.
172
169
  #
173
- # * +:fail+: The session data could not be saved (Memcached problem).
170
+ # * +:fail+: The session data could not be saved.
174
171
  #
175
- def save_to_memcached
172
+ def save_to_store
176
173
  if self.caller_id.nil?
177
- raise 'Hoodoo::Services::Session\#save_to_memcached: Cannot save this session as it has no assigned Caller UUID'
174
+ raise 'Hoodoo::Services::Session\#save_to_store: Cannot save this session as it has no assigned Caller UUID'
178
175
  end
179
176
 
180
177
  begin
181
- mclient = self.class.connect_to_memcached( self.memcached_host() )
178
+ store = get_store()
182
179
 
183
- # Try to update the Caller version in Memcached using this
180
+ # Try to update the Caller version in the store using this
184
181
  # Session's data. If this fails, the Caller version is out of
185
- # date or we couldn't talk to Memcached. Either way, bail out.
186
-
187
- result = update_caller_version_in_memcached( self.caller_id,
188
- self.caller_version,
189
- mclient )
182
+ # date or we couldn't talk to the store. Either way, bail out.
183
+ #
184
+ # TL;DR: The 'update' call here is critical.
185
+ #
186
+ # This process refreshes the caller version information in the
187
+ # transient store back-end with each new Session. If eventually the
188
+ # Caller version is expired or evicted, Sessions would be immediately
189
+ # invalidated and a recreation would result in the Caller version
190
+ # being rewritten.
191
+ #
192
+ # What if the Caller goes out of date? An external service must gate
193
+ # access to Caller resource changes and update the Caller version
194
+ # itself if the Caller alters in a way that should invalidate
195
+ # Sessions. This refreshes the lifetime on that item which normally
196
+ # expires at a much greater TTL than sessions anyway and, if anyone
197
+ # tries to use a Stale session after, the Caller version mismatch
198
+ # will invalidate it so they'll need a new one.
199
+ #
200
+ # If a Caller version is created but somehow evicted before any of
201
+ # the older existing Sessions (perhaps because Caller version data is
202
+ # small but Session data is large) then attempts to read the Session
203
+ # will fail; *loading* a Session requires the Caller version. The
204
+ # Caller would have to create a new Session and this would by virtue
205
+ # of the handling resource endpoint's service code acquire the new
206
+ # Caller version data immediately then cause it to be re-asserted /
207
+ # re-written by the code below.
208
+ #
209
+ result = update_caller_version_in_store( self.caller_id,
210
+ self.caller_version,
211
+ store )
190
212
 
191
213
  return result unless result.equal?( :ok )
192
214
 
193
215
  # Must set this before saving, even though the delay between
194
- # setting this value and Memcached actually saving the value
195
- # with a TTL will mean that Memcached expires the key slightly
216
+ # setting this value and the store actually saving the value
217
+ # with a TTL will mean that the store expires the key slightly
196
218
  # *after* the time we record.
197
219
 
198
220
  @expires_at = ( ::Time.now + TTL ).utc()
221
+ result = store.set( key: self.session_id,
222
+ payload: self.to_h(),
223
+ maximum_lifespan: TTL )
199
224
 
200
- return :ok if mclient.set( self.session_id,
201
- self.to_h(),
202
- TTL )
225
+ case result
226
+ when true
227
+ return :ok
228
+ when false
229
+ raise 'Unknown storage engine failure'
230
+ else
231
+ raise result
232
+ end
203
233
 
204
234
  rescue => exception
205
235
 
206
236
  # Log error and return nil if the session can't be parsed
207
237
  #
208
238
  Hoodoo::Services::Middleware.logger.warn(
209
- 'Hoodoo::Services::Session\#save_to_memcached: Session saving failed - connection fault or session corrupt',
239
+ 'Hoodoo::Services::Session\#save_to_store: Session saving failed - connection fault or session corrupt',
210
240
  exception.to_s
211
241
  )
212
242
 
@@ -215,10 +245,14 @@ module Hoodoo
215
245
  return :fail
216
246
  end
217
247
 
248
+ # Deprecated alias for #save_to_store, dating back to when the Session
249
+ # engine was hard-coded to Memcached.
250
+ #
251
+ alias_method( :save_to_memcached, :save_to_store )
252
+
218
253
  # Load session data into this instance, overwriting instance values
219
254
  # if the session is found. Raises an exception if there is a problem
220
- # connecting to Memcached. A Memcached connection host must have been
221
- # set through the constructor or #memcached_host accessor first.
255
+ # connecting to the transient store.
222
256
  #
223
257
  # +sid+:: The Session UUID to look up.
224
258
  #
@@ -228,16 +262,17 @@ module Hoodoo
228
262
  #
229
263
  # * +:outdated+: The session data was loaded, but is outdated; either
230
264
  # the session has expired, or its Caller version mismatches the
231
- # associated stored Caller version in Memcached.
265
+ # associated stored Caller version in the transient store.
232
266
  #
233
267
  # * +:not_found+: The session was not found.
234
268
  #
235
- # * +:fail+: The session data could not be loaded (Memcached problem).
269
+ # * +:fail+: The session data could not be loaded (unexpected storage
270
+ # engine failure).
236
271
  #
237
- def load_from_memcached!( sid )
272
+ def load_from_store!( sid )
238
273
  begin
239
- mclient = self.class.connect_to_memcached( self.memcached_host() )
240
- session_hash = mclient.get( sid )
274
+ store = get_store()
275
+ session_hash = store.get( key: sid, allow_throw: true )
241
276
 
242
277
  if session_hash.nil?
243
278
  return :not_found
@@ -245,7 +280,7 @@ module Hoodoo
245
280
  self.from_h!( session_hash )
246
281
  return :outdated if self.expired?
247
282
 
248
- cv = load_caller_version_from_memcached( mclient, self.caller_id )
283
+ cv = load_caller_version_from_store( store, self.caller_id )
249
284
 
250
285
  if cv == nil || cv > self.caller_version
251
286
  return :outdated
@@ -259,7 +294,7 @@ module Hoodoo
259
294
  # Log error and return nil if the session can't be parsed
260
295
  #
261
296
  Hoodoo::Services::Middleware.logger.warn(
262
- 'Hoodoo::Services::Session\#load_from_memcached!: Session loading failed - connection fault or session corrupt',
297
+ 'Hoodoo::Services::Session\#load_from_store!: Session loading failed - connection fault or session corrupt',
263
298
  exception.to_s
264
299
  )
265
300
 
@@ -268,45 +303,50 @@ module Hoodoo
268
303
  return :fail
269
304
  end
270
305
 
271
- # Update the version of a given Caller in Memcached. This is done
272
- # automatically when Sessions are saved to Memcached, but if external
273
- # code alters any Callers independently, it *MUST* call here to keep
274
- # Memcached records up to date.
306
+ # Deprecated alias for #load_from_store!, dating back to when the Session
307
+ # engine was hard-coded to Memcached.
275
308
  #
276
- # If no cached version is in Memcached for the Caller, the method
277
- # assumes it is being called for the first time for that Caller and
278
- # writes the version it has to hand, rather than considering it an
309
+ alias_method( :load_from_memcached!, :load_from_store! )
310
+
311
+ # Update the version of a given Caller in the transient store. This is
312
+ # done automatically when Sessions are saved to that store, but if
313
+ # external code alters any Callers independently, it *MUST* call here to
314
+ # keep stored records up to date.
315
+ #
316
+ # If no cached version is in the transient store for the Caller, the
317
+ # method assumes it is being called for the first time for that Caller
318
+ # and writes the version it has to hand, rather than considering it an
279
319
  # error condition.
280
320
  #
281
- # +cid+:: Caller UUID of the Caller record to update.
321
+ # +cid+:: Caller UUID of the Caller record to update.
282
322
  #
283
- # +cv+:: New version to store (an Integer).
323
+ # +cv+:: New version to store (an Integer).
284
324
  #
285
- # +mclient+:: Optional Dalli::Client instance to use for talking to
286
- # Memcached. If omitted, a connection is established for
287
- # you. This is mostly an optimisation parameter, used by
288
- # code which already has established a connection and
289
- # wants to avoid creating another unnecessarily.
325
+ # +store+:: Optional Hoodoo::TransientStore instance to use for data
326
+ # storage. If omitted, a connection is established for
327
+ # you. This is mostly an optimisation parameter, used by
328
+ # code which already has established a connection and
329
+ # wants to avoid creating another unnecessarily.
290
330
  #
291
331
  # Returns a Symbol:
292
332
  #
293
333
  # * +:ok+: The Caller record was updated successfully.
294
334
  #
295
- # * +:outdated+: The Caller was already present in Memcached with a
296
- # _higher version_ than the one you wanted to save. Your own local
297
- # Caller data must therefore already be out of date.
335
+ # * +:outdated+: The Caller was already present in the transient store
336
+ # with a _higher version_ than the one you wanted to save. Your own
337
+ # local Caller data must therefore already be out of date.
298
338
  #
299
- # * +:fail+: The Caller could not be updated (Memcached problem).
339
+ # * +:fail+: The Caller could not be updated (unexpected storage engine
340
+ # failure).
300
341
  #
301
- def update_caller_version_in_memcached( cid, cv, mclient = nil )
342
+ def update_caller_version_in_store( cid, cv, store = nil )
302
343
  begin
303
- mclient ||= self.class.connect_to_memcached( self.memcached_host() )
304
-
305
- cached_version = load_caller_version_from_memcached( mclient, cid )
344
+ store ||= get_store()
345
+ cached_version = load_caller_version_from_store( store, cid )
306
346
 
307
347
  if cached_version != nil && cached_version > cv
308
348
  return :outdated
309
- elsif save_caller_version_to_memcached( mclient, cid, cv ) == true
349
+ elsif save_caller_version_to_store( store, cid, cv ) == true
310
350
  return :ok
311
351
  end
312
352
 
@@ -315,7 +355,7 @@ module Hoodoo
315
355
  # Log error and return nil if the session can't be parsed
316
356
  #
317
357
  Hoodoo::Services::Middleware.logger.warn(
318
- 'Hoodoo::Services::Session\#update_caller_version_in_memcached: Client version update - connection fault or corrupt record',
358
+ 'Hoodoo::Services::Session\#update_caller_version_in_store: Client version update - connection fault or corrupt record',
319
359
  exception.to_s
320
360
  )
321
361
 
@@ -324,26 +364,68 @@ module Hoodoo
324
364
  return :fail
325
365
  end
326
366
 
327
- # Delete this session from Memcached. The Session object is not
367
+ # Deprecated interface (use #update_caller_version_in_store instead),
368
+ # dating back to when the Session engine was hard-coded to Memcached.
369
+ #
370
+ # Parameters as for #update_caller_version_in_store, except +store+ is
371
+ # must be a fully configured Dalli::Client instance. Use of this
372
+ # interface is inefficient and discouraged; it will result in logged
373
+ # warnings.
374
+ #
375
+ def update_caller_version_in_memcached( cid, cv, store = nil )
376
+ unless store.nil?
377
+ Hoodoo::Services::Middleware.logger.warn(
378
+ 'Hoodoo::Services::Session#update_caller_version_in_memcached is deprecated - use #update_caller_version_in_store'
379
+ )
380
+
381
+ # Inefficient - create a TransientStore configured for the normal
382
+ # Memcached connection data, but get hold of its storage engine and
383
+ # change that engine's client to the provided Dalli::Client instance.
384
+
385
+ temp_store = Hoodoo::TransientStore.new(
386
+ storage_engine: :memcached,
387
+ storage_host_uri: self.memcached_host(),
388
+ default_namespace: 'nz_co_loyalty_hoodoo_session_'
389
+ )
390
+
391
+ memcached_engine = temp_store.storage_engine_instance()
392
+ memcached_engine.client = store
393
+
394
+ begin
395
+ update_caller_version_in_store( cid, cv, temp_store )
396
+ ensure
397
+ temp_store.close()
398
+ end
399
+
400
+ else
401
+ update_caller_version_in_store( cid, cv )
402
+
403
+ end
404
+ end
405
+
406
+ # Delete this session from the transient store. The Session object is not
328
407
  # modified.
329
408
  #
330
409
  # Returns a symbol:
331
410
  #
332
- # * +:ok+: The Session was deleted from Memcached successfully.
411
+ # * +:ok+: The Session was deleted from the transient store successfully.
333
412
  #
334
- # * +:not_found+: This session was not found in Memcached.
413
+ # * +:fail+: The session data could not be deleted (unexpected storage
414
+ # engine failure).
335
415
  #
336
- # * +:fail+: The session data could not be deleted (Memcached problem).
337
- #
338
- def delete_from_memcached
416
+ def delete_from_store
339
417
  begin
340
418
 
341
- mclient = self.class.connect_to_memcached( self.memcached_host() )
419
+ store = get_store()
420
+ result = store.delete( key: self.session_id )
342
421
 
343
- if mclient.delete( self.session_id )
344
- return :ok
345
- else
346
- return :not_found
422
+ case result
423
+ when true
424
+ return :ok
425
+ when false
426
+ raise 'Unknown storage engine failure'
427
+ else
428
+ raise result
347
429
  end
348
430
 
349
431
  rescue => exception
@@ -351,7 +433,7 @@ module Hoodoo
351
433
  # Log error and return nil if the session can't be parsed
352
434
  #
353
435
  Hoodoo::Services::Middleware.logger.warn(
354
- 'Hoodoo::Services::Session\#delete_from_memcached: Session delete - connection fault',
436
+ 'Hoodoo::Services::Session\#delete_from_store: Session delete - connection fault',
355
437
  exception.to_s
356
438
  )
357
439
 
@@ -360,6 +442,11 @@ module Hoodoo
360
442
 
361
443
  end
362
444
 
445
+ # Deprecated alias for #delete_from_store, dating back to when the
446
+ # Session engine was hard-coded to Memcached.
447
+ #
448
+ alias_method( :delete_from_memcached, :delete_from_store )
449
+
363
450
  # Has this session expired? Only valid if an expiry date is set;
364
451
  # see #expires_at.
365
452
  #
@@ -373,9 +460,8 @@ module Hoodoo
373
460
  return ! ( exp.nil? || now < exp )
374
461
  end
375
462
 
376
- # Represent this session's data as a Hash, for uses such as
377
- # storage in Memcached or loading into another session instance.
378
- # See also #from_h!.
463
+ # Represent this session's data as a Hash, for uses such as persistence
464
+ # or loading into another session instance. See also #from_h!.
379
465
  #
380
466
  def to_h
381
467
  hash = {}
@@ -493,7 +579,7 @@ module Hoodoo
493
579
  # * +false+ if the session can't be saved due to a mismatched caller
494
580
  # version - the session must have become invalid _during_ handling.
495
581
  #
496
- # If the augmented session cannot be saved due to a Memcached problem,
582
+ # If the augmented session cannot be saved due to a storage problem,
497
583
  # an exception is raised and the generic handler will turn this into a
498
584
  # 500 response for the caller. At this time, we really can't do much
499
585
  # better than that since failure to save the augmented session means
@@ -528,7 +614,7 @@ module Hoodoo
528
614
  local_session.session_id = Hoodoo::UUID.generate()
529
615
  local_session.permissions = local_permissions
530
616
 
531
- case local_session.save_to_memcached()
617
+ case local_session.save_to_store()
532
618
  when :ok
533
619
  return local_session
534
620
 
@@ -543,96 +629,71 @@ module Hoodoo
543
629
 
544
630
  private
545
631
 
546
- # Connect to the Memcached server. Returns a new Dalli client
632
+ # Connect to the storage engine. Returns a Hoodoo:TransientStore
547
633
  # instance. Raises an exception if no connection can be established.
548
634
  #
549
- # In test environments, returns a MockDalliClient instance.
550
- #
551
- # +host+:: Connection host (IP "address:port" String) for Memcached.
552
- #
553
- def self.connect_to_memcached( host )
554
-
555
- if Hoodoo::Services::Middleware.environment.test? && MockDalliClient.bypass? == false
556
- return MockDalliClient.new
557
- end
558
-
559
- if host.nil? || host.empty?
560
- raise 'Hoodoo::Services::Session.connect_to_memcached: The Memcached connection host data is nil or empty'
561
- end
562
-
563
- exception = nil
564
- stats = nil
565
- mclient = nil
635
+ def get_store
636
+ host = self.memcached_host()
566
637
 
567
638
  begin
568
- @@dalli_clients ||= {}
569
- @@dalli_clients[ host ] ||= ::Dalli::Client.new(
570
- host,
571
- {
572
- :compress => false,
573
- :serializer => JSON,
574
- :namespace => :nz_co_loyalty_hoodoo_session_
575
- }
639
+ @@stores ||= {}
640
+ @@stores[ host ] ||= Hoodoo::TransientStore.new(
641
+ storage_engine: :memcached,
642
+ storage_host_uri: host,
643
+ default_namespace: 'nz_co_loyalty_hoodoo_session_'
576
644
  )
577
645
 
578
- stats = @@dalli_clients[ host ].stats()
646
+ raise 'Unknown storage engine failure' if @@stores[ host ].nil?
579
647
 
580
- rescue => e
581
- exception = e
648
+ rescue => exception
649
+ raise "Hoodoo::Services::Session\#get_store: Cannot connect to Memcached at '#{ host }': #{ exception.to_s }"
582
650
 
583
651
  end
584
652
 
585
- if stats.nil?
586
- if exception.nil?
587
- raise "Hoodoo::Services::Session.connect_to_memcached: Did not get back meaningful data from Memcached at '#{ host }'"
588
- else
589
- raise "Hoodoo::Services::Session.connect_to_memcached: Cannot connect to Memcached at '#{ host }': #{ exception.to_s }"
590
- end
591
- else
592
- return @@dalli_clients[ host ]
593
- end
653
+ @@stores[ host ]
594
654
  end
595
655
 
596
- # Try to read a cached Caller version from Memcached. Returns the
597
- # cached version if available, or +nil+ if the record isn't found.
656
+ # Try to read a cached Caller version from the transient store. Returns
657
+ # the cached version if available, or +nil+ if the record isn't found.
598
658
  #
599
- # May raise an exception for e.g. Memcached failures, via Dalli.
659
+ # May raise an exception for e.g. unexpected storage engine failures.
600
660
  #
601
661
  # TODO: As a temporary measure, compatibility bridge code in Authsome
602
662
  # may call this private interface via ".send". Until that is
603
663
  # decommissioned, the API shouldn't be changed without updating
604
664
  # Authsome too.
605
665
  #
606
- # +mclient+:: A Dalli::Client instance to use for talking to
607
- # Memcached.
608
- #
609
- # +cid+:: Caller UUID of interest.
666
+ # +store+:: A Hoodoo::TransientStore instance to use for storage.
667
+ # +cid+:: Caller UUID of interest.
610
668
  #
611
- def load_caller_version_from_memcached( mclient, cid )
612
- version_hash = mclient.get( cid )
669
+ def load_caller_version_from_store( store, cid )
670
+ version_hash = store.get( key: cid, allow_throw: true )
613
671
  return version_hash.nil? ? nil : version_hash[ 'version' ]
614
672
  end
615
673
 
616
- # Save the Caller version for a given Caller ID to Memcached.
674
+ # Save the Caller version for a given Caller ID to the transient store.
617
675
  # Returns +true+ if successful, else +false+.
618
676
  #
619
- # May raise an exception for e.g. Memcached failures, via Dalli.
677
+ # May raise an exception for e.g. unexpected storage engine failures.
620
678
  #
621
679
  # Note that any existing record for the given Caller, if there
622
680
  # is one, is unconditionally overwritten.
623
681
  #
624
- # +mclient+:: A Dalli::Client instance to use for talking to
625
- # Memcached.
626
- #
627
- # +cid+:: Caller UUID of interest.
628
- #
629
- # +cv+:: Version to save for that Caller UUID.
682
+ # +store+:: A Hoodoo::TransientStore instance to use for storage.
683
+ # +cid+:: Caller UUID of interest.
684
+ # +cv+:: Version to save for that Caller UUID.
630
685
  #
631
- def save_caller_version_to_memcached( mclient, cid, cv )
632
- return !! mclient.set(
633
- cid,
634
- { 'version' => cv }
686
+ def save_caller_version_to_store( store, cid, cv )
687
+ result = store.set(
688
+ key: cid,
689
+ payload: { 'version' => cv }
635
690
  )
691
+
692
+ if result.is_a?( Exception )
693
+ raise result
694
+ else
695
+ return result
696
+ end
636
697
  end
637
698
 
638
699
  # Before Hoodoo::TransientStore was created, the Session system was