In this patch, we re-implement the three read-modify-write operations - PutItem, UpdateItem, DeleteItem. All three operations may need to read the item before writing it to support conditional updates (the "Expected" parameter) and UpdateItem may also need the previous item's value for its update expression (e.g., a user may ask to "set a=a+1" or "set a=b"). Before this patch, the implementation of RMW operations simply did a read, and then a write - without any attempt to protect concurrent operations. In this patch, Scylla's LWT mechanism (storage_proxy::cas()) is used instead, to ensure that concurrent update operations are correctly isolated even if they are conditional. This means that Alternator now requires the experimental LWT feature to be enabled (and refuses to boot if it isn't). The version presented here is configured to always use LWT for *every* write, regardless of whether it has a condition or not. So it will will significantly slow down write-only workloads like YCSB. But the code in this patch actually includes three other modes, which can be chosen by setting an enum constant in the code. In the future we will want to let the user configure this mode, globally, per table or per attribute. Note that read requests are NOT modified, and work exactly as they did before: i.e., strongly-consistent reads are done using a normal CL=LOCAL_QUORUM read - not via LWT. I believe this is good enough given Dynamo's guarantees, and critical for our read performance. Also note that patch doesn't yet fix the BatchWriteItem operation. Although BatchWriteItem does not support any RMW operations - just pure writes - we may still need to do those pure writes using LWT. This should be fixed in a follow-up patch. Unfortunately, this patch involves a large amount of code movement and reorganization, because: 1. The cas operation requires each operation to be made into an object, with a separate apply() function, forcing a lot of code to move. 2. Moreover, we need to do this for three different operations (PutItem, UpdateItem, DeleteItem) so to avoid massive code duplication, I had to move some common code. 3. The cas operation also forced us to change some of the utility functions' APIs. The end result is that this patch focuses more on a compact and understandable *end result* than it does on an easy to understand *patch*, so reviewers - sorry about that. All alternator-test/ tests pass with this patch (and also with all of the different optional modes enabled). However, other than that, I did not yet do any real isolation tests (are concurrent operations really isolated correctly? or is LWT just faking it? :-) ), performance tests or stress tests - and I'll definitely need to do those as well. Fixes #5054 Signed-off-by: Nadav Har'El <nyh@scylladb.com>
Scylla developer documentation
This folder (and its subfolders) contain developer-oriented documentation concerning the Scylla codebase. We also have a wiki, which contains additional developer-oriented documentation. There is currently no clear definition of what goes where, so when looking for something be sure to check both.
Seastar documentation can be found here.
User documentation can be found on docs.scylladb.com
For information on how to build Scylla and how to contribute visit HACKING.md and CONTRIBUTING.md.