diff --git a/src/drogon_http_async_writer_impl.cpp b/src/drogon_http_async_writer_impl.cpp index 28837048f3..0ec0572438 100644 --- a/src/drogon_http_async_writer_impl.cpp +++ b/src/drogon_http_async_writer_impl.cpp @@ -46,7 +46,7 @@ void DrogonHttpAsyncWriterImpl::PartialReplyBegin(std::function actualWo this->responsePtr = drogon::HttpResponse::newAsyncStreamResponse( [this, actualWorkloadCallback = std::move(actualWorkloadCallback)](drogon::ResponseStreamPtr stream) { this->stream = std::move(stream); - this->pool.Schedule([actualWorkloadCallback = std::move(actualWorkloadCallback)] { + this->pool.Schedule([&actualWorkloadCallback] { SPDLOG_DEBUG("DrogonHttpAsyncWriterImpl::PartialReplyBegin::Schedule begin"); try { actualWorkloadCallback(); // run actual workload (mediapipe executor inferStream) which uses PartialReply diff --git a/src/http_rest_api_handler.cpp b/src/http_rest_api_handler.cpp index 314aef10e8..a6578dfb09 100644 --- a/src/http_rest_api_handler.cpp +++ b/src/http_rest_api_handler.cpp @@ -716,7 +716,7 @@ Status HttpRestApiHandler::processV3(const std::string_view uri, const HttpReque serverReaderWriter->OverwriteResponseHeader("Content-Type", "text/event-stream"); serverReaderWriter->OverwriteResponseHeader("Cache-Control", "no-cache"); serverReaderWriter->OverwriteResponseHeader("Connection", "keep-alive"); - serverReaderWriter->PartialReplyBegin([executor = std::move(executor), serverReaderWriter, request = std::move(request)] { + serverReaderWriter->PartialReplyBegin([executor = std::move(executor), serverReaderWriter, request = std::move(request)]() mutable { ExecutionContext executionContext{ExecutionContext::Interface::REST, ExecutionContext::Method::V3Stream}; auto status = executor->inferStream(request, *serverReaderWriter, executionContext); if (!status.ok()) { @@ -729,6 +729,8 @@ Status HttpRestApiHandler::processV3(const std::string_view uri, const HttpReque serverReaderWriter->PartialReplyWithStatus(buffer.GetString(), HTTPStatusCode::BAD_REQUEST); } serverReaderWriter->PartialReplyEnd(); + // Release executor resources after the work is done - for example CB pipeline object + executor.reset(); }); return StatusCode::PARTIAL_END; }