Skip to content

ndalmia/ex_lock

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

About

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

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages