sapling/configerator/structs/scm/mononoke/tunables/Cargo.toml

26 lines
760 B
TOML
Raw Normal View History

mononoke: Add tunables - a simple form of config hot reloading Summary: Currently, Mononoke's configs are loaded at startup and only refreshed during restart. There are some exceptions to this, including throttling limits. Other Mononoke services (such as the LFS server) have their own implementations of hot reloadable configs, however there isn't a universally agreed upon method. Static configs makes it hard to roll out features gradually and safely. If a bad config option is enabled, it can't be rectified until the entire tier is restarted. However, Mononoke's code is structured with static configs in mind and doesn't support hot reloading. Changing this would require a lot of work (imagine trying to swap out blobstore configs during run time) and wouldn't necessarily provide much benefit. Instead, add a subset of hot reloadable configs called tunables. Tunables are accessible from anywhere in the code and are cheap to read as they only require reading an atomic value. This means that they can be used even in hot code paths. Currently tunables support reloading boolean values and i64s. In the future, I'd like to expand tunables to include more functionality, such as a rollout percentage. The `--tunables-config` flag points to a configerator spec that exports a Tunables thrift struct. This allows differents tiers and Mononoke services to have their own tunables. If this isn't provided, `MononokeTunables::default()` will be used. This diff adds a proc_macro that will generate the relevant `get` and `update` methods for the fields added to a struct which derives `Tunables`. This struct is then stored in a `once_cell` and can be accessed using `tunables::tunables()`. To add a new tunable, add a field to the `MononokeTunables` struct that is of type `AtomicBool` or `AtomicI64`. Update the relevant tunables configerator config to include your new field, with the exact same name. Removing a tunable from `MononokeTunables` is fine, as is removing a tunable from configerator. If the `--tunables-config` path isn't passed, then a default tunables config located at `scm/mononoke/tunables/default` will be loaded. There is also the `--disable-tunables` flag that won't load anything from configerator, it will instead use the `Tunable` struct's `default()` method to initialise it. This is useful in integration tests. Reviewed By: StanislavGlebik Differential Revision: D21177252 fbshipit-source-id: 02a93c1ceee99066019b23d81ea308e4c565d371
2020-05-01 02:06:10 +03:00
[package]
name = "tunables_structs"
edition = "2018"
version = "0.1.0"
authors = ['Facebook']
license = "GPLv2+"
include = ["thrift_lib.rs"]
build = "thrift_build.rs"
[lib]
path = "thrift_lib.rs"
[build-dependencies]
thrift_compiler = { git = "https://github.com/facebookexperimental/rust-shed.git", branch = "master" }
[dependencies]
codegen_includer_proc_macro = { git = "https://github.com/facebookexperimental/rust-shed.git", branch = "master" }
fbthrift = { git = "https://github.com/facebook/fbthrift.git", branch = "master" }
anyhow = "1.0"
async-trait = "0.1.29"
futures = { version = "0.3.5", features = ["async-await", "compat"] }
mononoke: Add tunables - a simple form of config hot reloading Summary: Currently, Mononoke's configs are loaded at startup and only refreshed during restart. There are some exceptions to this, including throttling limits. Other Mononoke services (such as the LFS server) have their own implementations of hot reloadable configs, however there isn't a universally agreed upon method. Static configs makes it hard to roll out features gradually and safely. If a bad config option is enabled, it can't be rectified until the entire tier is restarted. However, Mononoke's code is structured with static configs in mind and doesn't support hot reloading. Changing this would require a lot of work (imagine trying to swap out blobstore configs during run time) and wouldn't necessarily provide much benefit. Instead, add a subset of hot reloadable configs called tunables. Tunables are accessible from anywhere in the code and are cheap to read as they only require reading an atomic value. This means that they can be used even in hot code paths. Currently tunables support reloading boolean values and i64s. In the future, I'd like to expand tunables to include more functionality, such as a rollout percentage. The `--tunables-config` flag points to a configerator spec that exports a Tunables thrift struct. This allows differents tiers and Mononoke services to have their own tunables. If this isn't provided, `MononokeTunables::default()` will be used. This diff adds a proc_macro that will generate the relevant `get` and `update` methods for the fields added to a struct which derives `Tunables`. This struct is then stored in a `once_cell` and can be accessed using `tunables::tunables()`. To add a new tunable, add a field to the `MononokeTunables` struct that is of type `AtomicBool` or `AtomicI64`. Update the relevant tunables configerator config to include your new field, with the exact same name. Removing a tunable from `MononokeTunables` is fine, as is removing a tunable from configerator. If the `--tunables-config` path isn't passed, then a default tunables config located at `scm/mononoke/tunables/default` will be loaded. There is also the `--disable-tunables` flag that won't load anything from configerator, it will instead use the `Tunable` struct's `default()` method to initialise it. This is useful in integration tests. Reviewed By: StanislavGlebik Differential Revision: D21177252 fbshipit-source-id: 02a93c1ceee99066019b23d81ea308e4c565d371
2020-05-01 02:06:10 +03:00
lazy_static = "1.0"
serde = { version = "1.0", features = ["derive", "rc"] }
serde_derive = "1.0"
thiserror = "1.0"