Apache Accumulo Reservations Example

This example shows running a simple reservation system implemented using conditional mutations. This system guarantees that only one concurrent user can reserve a resource. The example's reserve command allows multiple users to be specified. When this is done, it creates a separate reservation thread for each user. In the example below threads are spun up for alice, bob, eve, mallory, and trent to reserve room06 on 20140101. Bob ends up getting the reservation and everyone else is put on a wait list. The example code will take any string for what, when and who.

$ /path/to/accumulo org.apache.accumulo.server.util.ListInstances

Instance Name       | Instance ID                          | Master                        
---------------------+--------------------------------------+-------------------------------
    <instance name> | 9f8f2a97-432f-4e66-b153-861e2a1ca246 |                localhost:9999

$ /path/to/accumulo shell -u root -p secret -e "createtable ars"
$ ./bin/runex reservations.ARS
>connect <instance name> localhost root secret ars
  connected
>
  Commands :
    reserve <what> <when> <who> {who}
    cancel <what> <when> <who>
    list <what> <when>
>reserve room06 20140101 alice bob eve mallory trent
                   bob : RESERVED
               mallory : WAIT_LISTED
                 alice : WAIT_LISTED
                 trent : WAIT_LISTED
                   eve : WAIT_LISTED
>list room06 20140101
  Reservation holder : bob
  Wait list : [mallory, alice, trent, eve]
>cancel room06 20140101 alice
>cancel room06 20140101 bob
>list room06 20140101
  Reservation holder : mallory
  Wait list : [trent, eve]
>quit

Scanning the table in the Accumulo shell after running the example shows the following:

root@test16> table ars
root@test16 ars> scan
room06:20140101 res:0001 []    mallory
room06:20140101 res:0003 []    trent
room06:20140101 res:0004 []    eve
room06:20140101 tx:seq []    6

The tx:seq column is incremented for each update to the row allowing for detection of concurrent changes. For an update to go through, the sequence number must not have changed since the data was read. If it does change, the conditional mutation will fail and the example code will retry.