From 195644da041e0aeb84df2f481f55d56d17f6b0c8 Mon Sep 17 00:00:00 2001 From: Marco Neumann Date: Fri, 4 Jun 2021 12:51:56 +0200 Subject: [PATCH] docs: document semaphore design in server --- server/src/lib.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/src/lib.rs b/server/src/lib.rs index e2d2fa7588..1b62a00c24 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -416,6 +416,12 @@ pub struct Server { initialized: AtomicBool, /// Semaphore that limits the number of jobs that load DBs when the serverID is set. + /// + /// Note that this semaphore is more of a "lock" than an arbitrary semaphore. All the other sync structures (mutex, + /// rwlock) require something to be wrapped which we don't have in our case, so we're using a semaphore here. We + /// want exactly 1 background worker to mess with the server init / DB loading, otherwise everything in the critical + /// section (in [`maybe_initialize_server`](Self::maybe_initialize_server)) will break apart. So this semaphore + /// cannot be configured. initialize_semaphore: Semaphore, } @@ -458,6 +464,7 @@ impl Server { metrics: Arc::new(ServerMetrics::new(Arc::clone(&metric_registry))), registry: Arc::clone(&metric_registry), initialized: AtomicBool::new(false), + // Always set semaphore permits to `1`, see design comments in `Server::initialize_semaphore`. initialize_semaphore: Semaphore::new(1), } }