diff --git a/doc/manual/src/configuration.md b/doc/manual/src/configuration.md index 02210449..4954040c 100644 --- a/doc/manual/src/configuration.md +++ b/doc/manual/src/configuration.md @@ -74,6 +74,30 @@ following: } } +Populating a Cache +------------------ + +A common use for Hydra is to pre-build and cache derivations which +take a long time to build. While it is possible to direcly access the +Hydra server's store over SSH, a more scalable option is to upload +built derivations to a remote store like an [S3-compatible object +store](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-help-stores.html#s3-binary-cache-store). Setting +the `store_uri` parameter will cause Hydra to sign and upload +derivations as they are built: + +``` +store_uri = s3://cache-bucket-name?compression=zstd¶llel-compression=true&write-nar-listing=1&ls-compression=br&log-compression=br&secret-key=/path/to/cache/private/key +``` + +This example uses [Zstandard](https://github.com/facebook/zstd) +compression on derivations to reduce CPU usage on the server, but +[Brotli](https://brotli.org/) compression for derivation listings and +build logs because it has better browser support. + +See [`nix help +stores`](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-help-stores.html) +for a description of the store URI format. + Statsd Configuration -------------------- diff --git a/src/hydra-queue-runner/queue-monitor.cc b/src/hydra-queue-runner/queue-monitor.cc index 81678fe1..a3557316 100644 --- a/src/hydra-queue-runner/queue-monitor.cc +++ b/src/hydra-queue-runner/queue-monitor.cc @@ -495,19 +495,19 @@ Step::ptr State::createStep(ref destStore, if (!missing.empty()) { size_t avail = 0; - for (auto & [i, maybePath] : missing) { + for (auto & [i, pathOpt] : missing) { // If we don't know the output path from the destination // store, see if the local store can tell us. - if (/* localStore != destStore && */ !maybePath && experimentalFeatureSettings.isEnabled(Xp::CaDerivations)) + if (/* localStore != destStore && */ !pathOpt && experimentalFeatureSettings.isEnabled(Xp::CaDerivations)) if (auto maybeRealisation = localStore->queryRealisation(i)) - maybePath = maybeRealisation->outPath; + pathOpt = maybeRealisation->outPath; - if (!maybePath) { + if (!pathOpt) { // No hope of getting the store object if we don't know // the path. continue; } - auto & path = *maybePath; + auto & path = *pathOpt; if (/* localStore != destStore && */ localStore->isValidPath(path)) avail++; @@ -521,11 +521,11 @@ Step::ptr State::createStep(ref destStore, if (missing.size() == avail) { valid = true; - for (auto & [i, maybePath] : missing) { + for (auto & [i, pathOpt] : missing) { // If we found everything, then we should know the path // to every missing store object now. - assert(maybePath); - auto & path = *maybePath; + assert(pathOpt); + auto & path = *pathOpt; try { time_t startTime = time(0);