Syncstorage-rs
Mozilla Sync Storage built with Rust.
System Requirements
- Rust stable
- MySQL 5.7 (or compatible)
-* libmysqlclient (
brew install mysqlon macOS,apt-get install libmysqlclient-devon Ubuntu) - Go
- Cmake
- Pkg-config
- Openssl
Depending on your OS, you may also need to install libgrpcdev, and protobuf-compiler-grpc.
Local Setup
- Follow the instructions below to use either MySQL or Spanner as your DB.
- Now
cp config/local.example.toml config/local.toml. Openconfig/local.tomland make sure you have the desired settings configured. For a complete list of available configuration options, check out docs/config.md. make run-localstarts the server in debug mode, using your newlocal.tomlfile for config options. Or, simplycargo runwith your own config options provided as env vars.- Visit
http://localhost:8000/__heartbeat__to make sure the server is running.
MySQL
Durable sync needs only a valid mysql DSN in order to set up connections to a MySQL database. The database can be local and is usually specified with a DSN like:
mysql://_user_:_password_@_host_/_database_
To setup a fresh MySQL DB and user: (mysql -u root):
```
CREATE USER "sample_user"@"localhost" IDENTIFIED BY "sample_password";
CREATE DATABASE syncstorage_rs;
GRANT ALL PRIVILEGES on syncstorage_rs.* to sample_user@localhost;
```
Spanner
Spanner requires a key in order to access the database. It's important that you know which keys have access to the spanner database. Contact your administrator to find out. One you know the key, log into the Google Cloud Console Service Accounts page. Be sure to select the correct project.
- Locate the email identifier of the access key and pick the vertical dot menu at the far right of the row.
- Select "Create Key" from the pop-up menu.
- Select "JSON" from the Dialog Box.
A proper Key file will be downloaded to your local directory. It's important to safeguard that key file. For this example, we're going to name the file
sync-spanner.json and store it in a subdirectory called ./keys
The proper key file is in JSON format. An example file is provided below, with private information replaced by "..."
{
"type": "service_account",
"project_id": "...",
"private_key_id": "...",
"private_key": "...",
"client_email": "...",
"client_id": "...",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "..."
}
You can then specify the path to the key file using the environment variable GOOGLE_APPLICATION_CREDENTIALS when running the application.
e.g.
RUST_LOG=warn GOOGLE_APPLICATION_CREDENTIALS=`pwd`/keys/sync-spanner.json` cargo run -- --config sync.ini
Note, that unlike MySQL, there is no automatic migrations facility. Currently Spanner schema must be hand edited and modified.
Logging
- If you want to connect to the existing Sentry project for local development, login to Sentry, and go to the page with api keys. Copy the
DSNvalue, andexport SENTRY_DSN=DSN_VALUE_GOES_HEREto the environment when running this project. - Using env_logger: set the
RUST_LOGenv var.
Tests
Unit tests
cd db-tests.- Pass along your
SYNC_DATABASE_URLto the test runner. Ie:
SYNC_DATABASE_URL="mysql://sample_user:sample_password@localhost/syncstorage_rs" && /
RUST_TEST_THREADS=1 && /
cargo test
End-to-End tests
Functional tests live in server-syncstorage and can be run against a local server, e.g.:
-
If you haven't already followed the instructions here to get all the dependencies for the server-syncstorage repo, you should start there.
-
Install (Python) server-syncstorage:
$ git clone https://github.com/mozilla-services/server-syncstorage/ $ cd server-syncstorage $ make build -
Run an instance of syncstorage-rs (
cargo runin this repo). -
To run all tests:
$ ./local/bin/python syncstorage/tests/functional/test_storage.py http://localhost:8000#<SOMESECRET> -
Individual tests can be specified via the
SYNC_TEST_PREFIXenv var:$ SYNC_TEST_PREFIX=test_get_collection \ ./local/bin/python syncstorage/tests/functional/test_storage.py http://localhost:8000#<SOMESECRET>
Creating Releases
Open a PR after doing the following:
- Bump the version number in Cargo.toml.
cargo build --release- Build with the release profile release mode.clog -C CHANGELOG.md- Generate release notes. We're using clog for release notes. Add a-p,-mor-Mflag to denote major/minor/patch version, ieclog -C CHANGELOG.md -p.
Once your PR merges, then go ahead and create an official GitHub release.
Troubleshooting
rm Cargo.lock; cargo clean;- Try this if you're having problems compiling.