An example of lightweight transaction.
INSERT INTO USERS (login, email, name, login_count) values ('jbellis', 'jbellis@datastax.com', 'Jonathan Ellis', 1) IF NOT EXISTS
UPDATE users SET reset_token = null, password = ‘newpassword’ WHERE login = ‘jbellis’ IF reset_token = ‘some-generated-reset-token’
Essentially the paxos how operation concerntrated in class StorageProxy.We read that from the code documentation,
There are three phases to Paxos:
1. Prepare: the coordinator generates a ballot (timeUUID in our case) and asks replicas to (a) promise
not to accept updates from older ballots and (b) tell us about the most recent update it has already
accepted.
2. Accept: if a majority of replicas reply, the coordinator asks replicas to accept the value of the
highest proposal ballot it heard about, or a new value if no in-progress proposals were reported.
3. Commit (Learn): if a majority of replicas acknowledge the accept request, we can commit the new
value.
So it involve a few operation before an insert and update can be perform and this is not something you want to replace in bulk operation call with. We see that in class StorageService, several paxos verbs are registered. You can find them mostly in the paxos packages. Following are some useful paxos classes.
Interesting in the class PaxosState, noticed the following
locks - an array of length 1024
call system keyspace class to load and save paxos state.
When you check into cassandra using cqlsh, you will find the following.
cqlsh:jw_schema1> use system;
cqlsh:system> desc tables;
available_ranges peers paxos range_xfers
batches compaction_history batchlog local
"IndexInfo" sstable_activity size_estimates hints
views_builds_in_progress peer_events built_views
cqlsh:system> select * from paxos;
row_key | cf_id | in_progress_ballot | most_recent_commit | most_recent_commit_at | most_recent_commit_version | proposal | proposal_ballot | proposal_version
---------+-------+--------------------+--------------------+-----------------------+----------------------------+----------+-----------------+------------------
(0 rows)
You can also read the unit test for paxos in cassandra 2.0.17 as can be read here.
This compare and set (cas) operation looks interesting if you want to ensure the value only be created if it not exists, a nifty feature found in apache cassandra 2.0 onward. Feel free to explore further!