6262#include " status.hpp"
6363#include " stringutils.hpp"
6464#include " timer.hpp"
65+ #include " copyable_object_wrapper.hpp"
6566
6667#if (MEDIAPIPE_DISABLE == 0)
6768#include " http_frontend/http_client_connection.hpp"
@@ -703,21 +704,28 @@ Status HttpRestApiHandler::processV3(const std::string_view uri, const HttpReque
703704 return status;
704705 }
705706
706- std::shared_ptr<MediapipeGraphExecutor> executor;
707+ CopyableObjectWrapper<MediapipeGraphExecutor> executorWrapper;
708+ auto & executor = executorWrapper.getObjectHolder ()->get ();
707709 status = this ->modelManager .createPipeline (executor, modelName);
708710 if (!status.ok ()) {
709711 return status;
710712 }
711713
714+ if (!executorWrapper.getObjectHolder ()->valid ()) {
715+ SPDLOG_ERROR (" Failed to acquire MediaPipe graph executor for model: {}" , modelName);
716+ return StatusCode::INTERNAL_ERROR;
717+ }
718+
712719 if (streamFieldVal == false ) {
713720 ExecutionContext executionContext{ExecutionContext::Interface::REST, ExecutionContext::Method::V3Unary};
714721 return executor->infer (&request, &response, executionContext);
715722 } else {
716723 serverReaderWriter->OverwriteResponseHeader (" Content-Type" , " text/event-stream" );
717724 serverReaderWriter->OverwriteResponseHeader (" Cache-Control" , " no-cache" );
718725 serverReaderWriter->OverwriteResponseHeader (" Connection" , " keep-alive" );
719- serverReaderWriter->PartialReplyBegin ([executor = std::move (executor) , serverReaderWriter, request = std::move (request)] {
726+ serverReaderWriter->PartialReplyBegin ([executorWrapper = executorWrapper , serverReaderWriter, request = std::move (request)]() mutable {
720727 ExecutionContext executionContext{ExecutionContext::Interface::REST, ExecutionContext::Method::V3Stream};
728+ auto & executor = executorWrapper.getObjectHolder ()->get ();
721729 auto status = executor->inferStream (request, *serverReaderWriter, executionContext);
722730 if (!status.ok ()) {
723731 rapidjson::StringBuffer buffer;
@@ -728,6 +736,7 @@ Status HttpRestApiHandler::processV3(const std::string_view uri, const HttpReque
728736 writer.EndObject ();
729737 serverReaderWriter->PartialReplyWithStatus (buffer.GetString (), HTTPStatusCode::BAD_REQUEST);
730738 }
739+ executor.reset ();
731740 serverReaderWriter->PartialReplyEnd ();
732741 });
733742 return StatusCode::PARTIAL_END;
0 commit comments