Skip to content
an attempt to leverage DynamoDB as an HA lock store
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
lib/fog/aws/dynamodb
spec
.gitignore
.rspec
Gemfile
LICENSE.txt
README.md
Rakefile
fog-aws-dynamodb-locker.gemspec
logo.jpg

README.md

Fog::AWS:DynamoDB::Locker

logo

This is an attempt to use DynamoDB as a lock store.

We don't have a 'Locks as a Service' thing yet, so this is an experiment to make the best of what we do have.

Would love to hear of any use of this or if you think it is just a terrible idea to begin with.

Inspired by the simplicity of sequel-pg-locker by @dylanegan.

Installation

Add this line to your application's Gemfile:

gem 'fog-aws-dynamodb-locker'

And then execute:

$ bundle

Or install it yourself as:

$ gem install fog-aws-dynamodb-locker

Usage

export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
export DYNAMODB_LOCK_TABLE='my-lock-table'
require 'fog/aws/dynamodb/locker'

# first run only
Fog::AWS::DynamoDB::Locker.init!

# create a lock
Fog::AWS::DynamoDB::Locker.lock!('my lock')
# => true

# try to claim it a second time
Fog::AWS::DynamoDB::Locker.lock!('my lock')
# => false

# release it
Fog::AWS::DynamoDB::Locker.release!('my lock')
# => true

Challenges

If a client process dies for any reason, the lock will not be removed. A method will need to be put in place to clear likely deadlocks.

Once again, we need a real 'Locks as a Service'.

TODO

  • real specs
  • set a timestamp on each lock
  • allow metadata on each lock
  • Fog::AWS::DynamoDB::Locker.sweep!(n) to remove all locks that are n old

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request
Something went wrong with that request. Please try again.