MasterLock
MasterLock is a Ruby library for interprocess locking using Redis. Critical sections of code can be wrapped in a MasterLock block that ensures only one thread will run the code at a time. The locks are resilient to process failures by expiring after the thread obtaining them dies.
Installation
Add this line to your application's Gemfile:
gem 'master_lock'
And then execute:
$ bundle
Or install it yourself as:
$ gem install master_lock
Usage
def perform_safe_operation
MasterLock.synchronize("perform_safe_operation") do
# Code executes within locked context
end
end
# Call MasterLock.start when your application boots up.
# This starts a background thread to prevent locks from expiring.
MasterLock.start
See documentation for advanced usage.
Development
After checking out the repo, run bundle install
to install the gem dependencies.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
Testing
If you do not have Redis set up, run brew install redis
. This gives you access to redis-server
.
To set up the redis instance, run redis-server
in the project level directory. The default config should be located at /usr/local/etc/redis.conf
.
To set up the redis cluster, copy your redis-server executable to cluster-test/redis-server
. Open up 6 terminal tabs, and in every tab, start every instance:
cd cluster-test/7000
../redis-server ./redis.conf
Assuming you have at least Redis 5, create your cluster by running the following:
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
Then, run rake spec
to run the tests.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/coinbase/master_lock.
License
The gem is available as open source under the terms of the MIT License.