diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc index 4d513ec3714..b85649406f1 100644 --- a/src/libstore/filetransfer.cc +++ b/src/libstore/filetransfer.cc @@ -1046,16 +1046,33 @@ struct curlFileTransfer : public FileTransfer return ItemHandle(item.get_ptr()); } - ItemHandle enqueueFileTransfer(const FileTransferRequest & request, Callback callback) override + inline ref + makeTransferItem(const FileTransferRequest & request, Callback callback) { /* Handle s3:// URIs by converting to HTTPS and optionally adding auth */ if (request.uri.scheme() == "s3") { auto modifiedRequest = request; modifiedRequest.setupForS3(); - return enqueueItem(make_ref(*this, std::move(modifiedRequest), std::move(callback))); + return make_ref(*this, std::move(modifiedRequest), std::move(callback)); + } else { + return make_ref(*this, request, std::move(callback)); } + } + + ItemHandle + enqueueFileTransfer(const FileTransferRequest & request, Callback callback) noexcept override + { + const auto item = makeTransferItem(request, std::move(callback)); - return enqueueItem(make_ref(*this, request, std::move(callback))); + try { + return enqueueItem(item); + } catch (const nix::BaseError & e) { + // NOTE(cole-h): catches both nix::Error and nix::Interrupted -- enqueueItem calls + // writeFull which may throw nix::Interrupted, and the rest of enqueueItem may throw + // nix::Error + item->fail(e); + return ItemHandle(item.get_ptr()); + } } void unpauseTransfer(std::weak_ptr item) @@ -1133,7 +1150,7 @@ void FileTransferRequest::setupForS3() #endif } -std::future FileTransfer::enqueueFileTransfer(const FileTransferRequest & request) +std::future FileTransfer::enqueueFileTransfer(const FileTransferRequest & request) noexcept { auto promise = std::make_shared>(); enqueueFileTransfer(request, {[promise](std::future fut) { diff --git a/src/libstore/include/nix/store/filetransfer.hh b/src/libstore/include/nix/store/filetransfer.hh index 1bf5dd80fbe..272bc13218d 100644 --- a/src/libstore/include/nix/store/filetransfer.hh +++ b/src/libstore/include/nix/store/filetransfer.hh @@ -354,14 +354,14 @@ public: * exception. */ virtual ItemHandle - enqueueFileTransfer(const FileTransferRequest & request, Callback callback) = 0; + enqueueFileTransfer(const FileTransferRequest & request, Callback callback) noexcept = 0; /** * Unpause a transfer that has been previously paused by a dataCallback. */ virtual void unpauseTransfer(ItemHandle handle) = 0; - std::future enqueueFileTransfer(const FileTransferRequest & request); + std::future enqueueFileTransfer(const FileTransferRequest & request) noexcept; /** * Synchronously download a file.