forked from lix-project/lix
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:
parent
c87f4b9324
commit
ada4e90267
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue