Currently the background schema sync (push/pull) uses frozen mutation to send the schema mutations over the wire to the remote node. For this to work correctly, both nodes have to have the exact same schema for the system schema tables, as attempting to unpack the frozen mutation with the wrong schema leads to undefined behaviour. To avoid this and to ensure syncing schema between nodes with different schema table schema versions is defined we migrate the background schema sync to use canonical mutations for the transfer of the schema mutations. Canonical mutations are immune to this problem, as they support deserializing with any version of the schema, older or newer one. The foreground schema sync mechanisms -- the on-demand schema pulls on reads and writes -- already use canonical mutations to transmit the schema mutations. It is important to note that due to this change, column-level incompatibilities between the schema mutations and the schema used to deserialize them will be hidden. This is undesired and should be fixed in a follow-up (#4956). Table level incompatibilities are detected and schema mutations containing such mutations will be rejected just like before. This patch adds canonical mutation support to the two background schema sync verbs: * `DEFINITIONS_UPDATE` (schema push) * `MIGRATION_REQUEST` (schema pull) Both verbs still support the old frozen mutation schema transfer, albeit that path is now much less efficient. After all nodes are upgraded, the pull verb can effectively avoid sending frozen mutations altogether, completely migrating to canonical mutations. Unfortunately this was not possible for the push verb, so that one now has an overhead as it needs to send both the frozen and canonical mutations. Fixes: #4273
Scylla
Quick-start
To get the build going quickly, Scylla offers a frozen toolchain which would build and run Scylla using a pre-configured Docker image. Using the frozen toolchain will also isolate all of the installed dependencies in a Docker container. Assuming you have met the toolchain prerequisites, which is running Docker in user mode, building and running is as easy as:
$ ./tools/toolchain/dbuild ./configure.py
$ ./tools/toolchain/dbuild ninja build/release/scylla
$ ./tools/toolchain/dbuild ./build/release/scylla --developer-mode 1
Please see HACKING.md for detailed information on building and developing Scylla.
Note: GCC >= 8.1.1 is required to compile Scylla.
Running Scylla
- Run Scylla
./build/release/scylla
- run Scylla with one CPU and ./tmp as data directory
./build/release/scylla --datadir tmp --commitlog-directory tmp --smp 1
- For more run options:
./build/release/scylla --help
Building Fedora RPM
As a pre-requisite, you need to install Mock on your machine:
# Install mock:
sudo yum install mock
# Add user to the "mock" group:
usermod -a -G mock $USER && newgrp mock
Then, to build an RPM, run:
./dist/redhat/build_rpm.sh
The built RPM is stored in /var/lib/mock/<configuration>/result directory.
For example, on Fedora 21 mock reports the following:
INFO: Done(scylla-server-0.00-1.fc21.src.rpm) Config(default) 20 minutes 7 seconds
INFO: Results and/or logs in: /var/lib/mock/fedora-21-x86_64/result
Building Fedora-based Docker image
Build a Docker image with:
cd dist/docker
docker build -t <image-name> .
Run the image with:
docker run -p $(hostname -i):9042:9042 -i -t <image name>