From 09a8ab27960a7220578cf7ea05eb1e987dc3539f Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sat, 14 Oct 2023 12:31:07 +0200 Subject: [PATCH] Add images and refactor some files --- docs/DEVELOPING.md | 12 +-- docs/assets/architecture.png | Bin 0 -> 54288 bytes docs/assets/gossip_architecture.drawio | 104 +++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 docs/assets/architecture.png create mode 100644 docs/assets/gossip_architecture.drawio diff --git a/docs/DEVELOPING.md b/docs/DEVELOPING.md index ed9718b7..40ab6223 100644 --- a/docs/DEVELOPING.md +++ b/docs/DEVELOPING.md @@ -1,11 +1,13 @@ # Developing +![Gossip Architecture](./assets/architecture.png) + Gossip is architected with the following components: - A User Interface thread, synchronous - Tokio asynchronous runtime running - - An overlord (handles most jobs) - - A set of minions (each one handles one relay) + - An overlord: handles any operation that involves talking to relays, and a few more + - A set of minions: each one contacts a proper relay to get data, composing the filter and sending it to the relay ## Keeping the UI responsive @@ -48,7 +50,7 @@ The flow generally happens like this: ## Pull Requests -I prefer that you run and make pass: +Before issuing a Pull Request, please run and make pass: ````bash cargo clippy @@ -60,6 +62,4 @@ and then cargo fmt ```` -before you issue a pull request. Otherwise I'll have to do it for you. - -Also, I don't like branches that have a lot of commits that are messed up, but happen to end up in a good state due to the last commit. If you have a branch like this, create a new branch and one-by-one create a series of commits, each one a single logical step, each one compiling, each one passing clippy and rustfmt, each one documented, and each one doing something useful, such that this series of commits ends up where you originally got to (or somewhere even better). This not only makes it much easier to evaluate the PR, but it makes it possible to revert logical units later on if anything needs to be reverted, without necessarily reverting the entire branch. +Avoid branches that have a lot of commits that are messed up, but happen to end up in a good state due to the last commit. If you have a branch like this, create a new branch and one-by-one create a series of commits, each one a single logical step, each one compiling, each one passing clippy and rustfmt, each one documented, and each one doing something useful, such that this series of commits ends up where you originally got to (or somewhere even better). This not only makes it much easier to evaluate the PR, but it makes it possible to revert logical units later on if anything needs to be reverted, without necessarily reverting the entire branch. diff --git a/docs/assets/architecture.png b/docs/assets/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..bb312b11ed4eede79f936204dd8a34b1abce3393 GIT binary patch literal 54288 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +