mirror of
https://github.com/NixOS/nix
synced 2025-06-25 23:11:16 +02:00
S3BinaryCacheStore: Support compression of narinfo and log files
You can now set the store parameter "text-compression=br" to compress textual files in the binary cache (i.e. narinfo and logs) using Brotli. This sets the Content-Encoding header; the extension of compressed files is unchanged. You can separately specify the compression of log files using "log-compression=br". This is useful when you don't want to compress narinfo files for backward compatibility.
This commit is contained in:
parent
2691498b5c
commit
8b1d65bebe
5 changed files with 71 additions and 8 deletions
|
@ -5,6 +5,8 @@
|
|||
#include "nar-info.hh"
|
||||
#include "nar-info-disk-cache.hh"
|
||||
#include "globals.hh"
|
||||
#include "compression.hh"
|
||||
#include "download.hh"
|
||||
|
||||
#include <aws/core/Aws.h>
|
||||
#include <aws/core/client/ClientConfiguration.h>
|
||||
|
@ -104,8 +106,10 @@ S3Helper::DownloadResult S3Helper::getObject(
|
|||
auto result = checkAws(fmt("AWS error fetching ‘%s’", key),
|
||||
client->GetObject(request));
|
||||
|
||||
res.data = std::make_shared<std::string>(
|
||||
dynamic_cast<std::stringstream &>(result.GetBody()).str());
|
||||
res.data = decodeContent(
|
||||
result.GetContentEncoding(),
|
||||
make_ref<std::string>(
|
||||
dynamic_cast<std::stringstream &>(result.GetBody()).str()));
|
||||
|
||||
} catch (S3Error & e) {
|
||||
if (e.err != Aws::S3::S3Errors::NO_SUCH_KEY) throw;
|
||||
|
@ -137,11 +141,15 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
|
||||
S3Helper s3Helper;
|
||||
|
||||
std::string textCompression, logCompression;
|
||||
|
||||
S3BinaryCacheStoreImpl(
|
||||
const Params & params, const std::string & bucketName)
|
||||
: S3BinaryCacheStore(params)
|
||||
, bucketName(bucketName)
|
||||
, s3Helper(get(params, "aws-region", Aws::Region::US_EAST_1))
|
||||
, textCompression(get(params, "text-compression", "gzip"))
|
||||
, logCompression(get(params, "log-compression", textCompression))
|
||||
{
|
||||
diskCache = getNarInfoDiskCache();
|
||||
}
|
||||
|
@ -220,13 +228,17 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
return true;
|
||||
}
|
||||
|
||||
void upsertFile(const std::string & path, const std::string & data) override
|
||||
void uploadFile(const std::string & path, const std::string & data,
|
||||
const std::string & contentEncoding)
|
||||
{
|
||||
auto request =
|
||||
Aws::S3::Model::PutObjectRequest()
|
||||
.WithBucket(bucketName)
|
||||
.WithKey(path);
|
||||
|
||||
if (contentEncoding != "")
|
||||
request.SetContentEncoding(contentEncoding);
|
||||
|
||||
auto stream = std::make_shared<istringstream_nocopy>(data);
|
||||
|
||||
request.SetBody(stream);
|
||||
|
@ -249,6 +261,16 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
stats.putTimeMs += duration;
|
||||
}
|
||||
|
||||
void upsertFile(const std::string & path, const std::string & data) override
|
||||
{
|
||||
if (path.find(".narinfo") != std::string::npos)
|
||||
uploadFile(path, *compress(textCompression, data), textCompression);
|
||||
else if (path.find("/log") != std::string::npos)
|
||||
uploadFile(path, *compress(logCompression, data), logCompression);
|
||||
else
|
||||
uploadFile(path, data, "");
|
||||
}
|
||||
|
||||
void getFile(const std::string & path,
|
||||
std::function<void(std::shared_ptr<std::string>)> success,
|
||||
std::function<void(std::exception_ptr exc)> failure) override
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue