diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc index f7a5d672103..240d5aa9370 100644 --- a/src/libstore/filetransfer.cc +++ b/src/libstore/filetransfer.cc @@ -962,19 +962,32 @@ struct curlFileTransfer : public FileTransfer writeFull(wakeupPipe.writeSide.get(), " "); #endif - return ItemHandle(static_cast(*item)); + return ItemHandle(ref(std::move(item))); } - ItemHandle enqueueFileTransfer(const FileTransferRequest & request, Callback callback) override + ItemHandle + enqueueFileTransfer(const FileTransferRequest & request, Callback callback) noexcept override { /* 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))); + auto item = make_ref(*this, std::move(modifiedRequest), std::move(callback)); + try { + return enqueueItem(item); + } catch (const nix::Error & e) { + item->fail(e); + return ItemHandle(ref(std::move(item))); + } } - return enqueueItem(make_ref(*this, request, std::move(callback))); + auto item = make_ref(*this, request, std::move(callback)); + try { + return enqueueItem(item); + } catch (const nix::Error & e) { + item->fail(e); + return ItemHandle(ref(std::move(item))); + } } void unpauseTransfer(ref item) @@ -988,7 +1001,7 @@ struct curlFileTransfer : public FileTransfer void unpauseTransfer(ItemHandle handle) override { - unpauseTransfer(ref{static_cast(handle.item.get()).shared_from_this()}); + unpauseTransfer(ref{static_cast(*handle.item).shared_from_this()}); } }; @@ -1047,7 +1060,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 fa8a649e2b3..9220c26cb0d 100644 --- a/src/libstore/include/nix/store/filetransfer.hh +++ b/src/libstore/include/nix/store/filetransfer.hh @@ -262,11 +262,11 @@ public: */ struct ItemHandle { - std::reference_wrapper item; + ref item; friend struct FileTransfer; - ItemHandle(Item & item) - : item(item) + explicit ItemHandle(ref item) + : item(std::move(item)) { } }; @@ -279,14 +279,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.