/elock

A simple, fault-tolerant distributed lock server in erlang.

Primary LanguageErlang

A Simple Distributed Lock Server

This is still an early project, but the goal is pretty simple:

A simple, distributed, fault-tolerant lock server.

Commands:

lock

Lock has two forms. The first is a non-blocking form that either tells you the lock is already taken, or acquires it.

lock lock_name

The second form allows you to wait for a certain number of seconds for the lock to become available:

lock lock_name timeout_in_seconds

Possible return values:

  • 200 - Lock has been acquired
  • 409 - The resource is locked -- you lose

Any acquired lock will be held until it's specifically unlocked, unlocked with unlock_all, or the client disconnects.

unlock

Unlock releases the lock with the given key if the current client has acquired that lock:

unlock lock_name

Possible return values:

  • 200 - The lock has been released
  • 403 - You do not own this lock (therefore you didn't release it)

unlock_all

Release any locks this client may be holding.

Possible return values:

  • 200 - It just blows it all away

conn_id

Retrieve your current session ID. This may be resumed later.

Returns:

  • 200 [some_string]

conn_id [string]

Attempts to set your connection ID to the given value.

This allows you to resume a session if you get disconnected.

Returns:

  • 200 - Resumed
  • 403 - Could not resume connection (you either already have a new one, or that one belongs to someone else)

set_timeout [integer]

Set the amount of time after disconnect (in milliseconds) before your locks are all automatically freed. Default is 30,000 (30 seconds).

Returns:

  • 200 - the new value was set

quit

Disconnect your connection.

stats

Get some server stats.

Returns:

  • 200 STATS - beginning of a stat stream (see below)

The stats output is multi-line, so the protocol handling is a little different from all of the other commands.

The initial response is

200 STATS

which is followed by several values in the following form:

STAT [key] [value]

and then one terminating value:

END

A complete example is as follows:

200 STATS
STAT clients 0
STAT locks 0
STAT monitoring 0
END