Class: Sfn::Cache::LocalLock

Inherits:
Object
  • Object
show all
Defined in:
lib/sfn/cache.rb

Overview

Simple lock for memory cache

Defined Under Namespace

Classes: LocalLockTimeout

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, args = {}) ⇒ LocalLock

Create new instance

Parameters:

  • name (Symbol)

    name of lock

  • args (Hash) (defaults to: {})

Options Hash (args):

  • :timeout (Numeric)


301
302
303
304
305
# File 'lib/sfn/cache.rb', line 301

def initialize(name, args = {})
  @_key = name
  @_timeout = args.fetch(:timeout, -1).to_f
  @_lock = Mutex.new
end

Instance Attribute Details

#_keySymbol (readonly)

Returns key name

Returns:

  • (Symbol)

    key name



290
291
292
# File 'lib/sfn/cache.rb', line 290

def _key
  @_key
end

#_lockMutex (readonly)

Returns underlying lock

Returns:

  • (Mutex)

    underlying lock



294
295
296
# File 'lib/sfn/cache.rb', line 294

def _lock
  @_lock
end

#_timeoutNumeric (readonly)

Returns timeout

Returns:

  • (Numeric)

    timeout



292
293
294
# File 'lib/sfn/cache.rb', line 292

def _timeout
  @_timeout
end

Instance Method Details

#clearObject

Note:

this is a noop

Clear the lock



335
336
337
# File 'lib/sfn/cache.rb', line 335

def clear
  # noop
end

#lock { ... } ⇒ Object

Aquire lock and yield

Yields:

  • block to execute within lock

Returns:

  • (Object)

    result of yield



311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
# File 'lib/sfn/cache.rb', line 311

def lock
  locked = false
  attempt_start = Time.now.to_f
  while (!locked && (_timeout < 0 || Time.now.to_f - attempt_start < _timeout))
    locked = _lock.try_lock
  end
  if locked
    begin
      yield
    ensure
      _lock.unlock if _lock.locked?
    end
  else
    if defined?(Redis)
      raise Redis::Lock::LockTimeout.new "Timeout on lock #{_key} exceeded #{_timeout} sec"
    else
      raise LocalLockTimeout.new "Timeout on lock #{_key} exceeded #{_timeout} sec"
    end
  end
end