S3BinaryCacheStore: Share TransferManager

TransferManager allocates a lot of memory (50 MiB by default), and it
might leak but I'm not sure about that. In any case it was causing
OOMs in hydra-queue-runner. So allocate only one TransferManager per
S3BinaryCacheStore.

Hopefully fixes https://github.com/NixOS/hydra/issues/586.
This commit is contained in:
Eelco Dolstra 2018-08-09 20:44:18 +02:00
parent c87f4b9324
commit ada4e90267
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE

View file

@ -275,6 +275,9 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
return true; return true;
} }
std::shared_ptr<TransferManager> transferManager;
std::once_flag transferManagerCreated;
void uploadFile(const std::string & path, const std::string & data, void uploadFile(const std::string & path, const std::string & data,
const std::string & mimeType, const std::string & mimeType,
const std::string & contentEncoding) const std::string & contentEncoding)
@ -286,25 +289,28 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
static std::shared_ptr<Aws::Utils::Threading::PooledThreadExecutor> static std::shared_ptr<Aws::Utils::Threading::PooledThreadExecutor>
executor = std::make_shared<Aws::Utils::Threading::PooledThreadExecutor>(maxThreads); executor = std::make_shared<Aws::Utils::Threading::PooledThreadExecutor>(maxThreads);
TransferManagerConfiguration transferConfig(executor.get()); std::call_once(transferManagerCreated, [&]() {
transferConfig.s3Client = s3Helper.client; TransferManagerConfiguration transferConfig(executor.get());
transferConfig.bufferSize = bufferSize;
transferConfig.uploadProgressCallback = transferConfig.s3Client = s3Helper.client;
[&](const TransferManager *transferManager, transferConfig.bufferSize = bufferSize;
const std::shared_ptr<const TransferHandle>
&transferHandle) {
//FIXME: find a way to properly abort the multipart upload.
//checkInterrupt();
debug("upload progress ('%s'): '%d' of '%d' bytes",
path,
transferHandle->GetBytesTransferred(),
transferHandle->GetBytesTotalSize());
};
std::shared_ptr<TransferManager> transferManager = transferConfig.uploadProgressCallback =
TransferManager::Create(transferConfig); [&](const TransferManager *transferManager,
const std::shared_ptr<const TransferHandle>
&transferHandle)
{
//FIXME: find a way to properly abort the multipart upload.
//checkInterrupt();
debug("upload progress ('%s'): '%d' of '%d' bytes",
path,
transferHandle->GetBytesTransferred(),
transferHandle->GetBytesTotalSize());
};
transferManager = TransferManager::Create(transferConfig);
});
auto now1 = std::chrono::steady_clock::now(); auto now1 = std::chrono::steady_clock::now();