/ex_lock

Postgres advisory lock backed elixir Library for locking critical section of code running on multiple machines.

Primary LanguageElixirMIT LicenseMIT

ExLock

Postgres advisory lock backed elixir Library for locking critical section of code running on multiple machines.

Installation

It can be installed by adding ex_lock to your list of dependencies in mix.exs:

def deps do
  [
    {:ex_lock, "~> 0.1.1"}
  ]
end

Usage

ExLock.execute "lock_key", [], fn ->
  # critical section
end

Parameters

  • key (mandatory) - String on which lock is getting acquired.
  • options (mandatory - [] can be passed) - Keyword list. Supported keys are function_timeout, attempt_count, attempt_interval
    • function_timeout (default - 15000) - Time in millisecond after which the function provided will time out. This is to make sure that a process does not acquire the lock for indefinite time.
    • attempt_count (default - 1) - Number of times the code will try to acquire the lock. This package does not wait on trying to acquire the lock. Instead, attempt_count needs to be specified.
    • attempt_interval (default - 1000) - Time between the attempts.
  • function - Critical section of code

Responses

{:ok, function_result} - In case lock has been acquired and function has executed properly. 
{:error, %ExLock.Error{message: "lock could not be acquired"}} - In case lock has not been acquired
{:error, %ExLock.Error{message: "function timed out"}} - In case function has timed out.

Bang function for execute is also supported.

ExLock.execute! "lock_key", [], fn ->
  # critical section
end

Lock can also be acquired and released from the code.

{:ok, lock_holder} = ExLock.acquire("lock_key", [])

# critical section

ExLock.release(lock_holder, "lock_key")

If lock is getting acquired in this fashion, please make sure it gets released after the work is done.

Second parameter is a keyword list supporting following values.

  • lock_timeout (default - 15000) - Time in millisecond after which the lock automatically gets released. This is to make sure that a process does not acquire the lock for indefinite time.
  • attempt_count (default - 1) - Number of times the code will try to acquire the lock. This package does not wait on trying to acquire the lock. Instead, attempt_count needs to be specified.
  • attempt_interval (default - 1000) - Time between the attempts.

Bang function for acquire is also supported.

lock_holder = ExLock.acquire!("lock_key", [])

# critical section

ExLock.release(lock_holder, "lock_key")

Check the specs here - ExLock Spec