This is a guide for code contribution to Pegasus. Before writing your code, please take a second reading this doc.
Clang-Format
We currently use clang-format-3.9 for C++ code formatting. Please install this tool and run before submitting a PR:
./scripts/format_files.sh
./rdsn/scripts/linux/run-clang-format.sh
CCache
Pegasus supports ccache to accelerate compilation. It significantly reduces the building time, by caching the intermediate results on your disk. We highly recommend this tool for Pegasus development.
sudo apt install ccache
ccache -M 5G # configure the cache size
Once you installed ccache, Pegasus's building process will automatically detect it without any manual configuration.
Continuous Integration
Pegasus runs a Github Actions workflow/TravisCI for each of the submitted pull-request. The CI procedure checks:
- If your PR title matches conventional commit
- If your code is well-formatted
- If your changes can pass all the tests. You can run `./run.sh test` on your local environment.
For more details about how we run Github Actions, please refer to this doc: Github Actions .
In addition to testing-per-PR, we also run daily workflows at https://github.com/pegasus-kv/pegasus-docker that check:
- If rdsn/pegasus can be built upon various platforms and compilers.
- If all code is sanitized (address/leak/thread/undefined).
Heap Profiling
By default, Pegasus enables gperftools and utilizes tcmalloc for memory allocation. To analyzing the memory/cpu usage of Pegasus server, you can run pprof against the target server. The Pegasus server will retrieve profiling data via gperftools library and respond via HTTP.
pprof --svg http://127.0.0.1:34801/pprof/heap > heap.svg
Thrift
Pegasus uses thrift as the serialization tool for RPC data. To modify the RPC structs in Pegasus, or to add a new RPC type, you need to update the corresponding ".thrift" protocol file, and run:
./rdsn/compile_thrift.py # if the thrift is in rdsn
./src/idl/recompile_thrift.sh # if the thrift is in pegasus
We directly manage thrift as one of our third-parties, that is, it requires no separate installation. After running `./run.sh build` it will be automatically installed under `./rdsn/thirdparty/output/bin`.