321 ERR <<
"Failed to execute worker" << std::endl;
334 zypp::proto::Configuration conf;
336 conf.mutable_values ()->insert ( {
AGENT_STRING_CONF.data (),
"ZYpp " LIBZYPP_VERSION_STRING } );
338 conf.mutable_values ()->insert ( {
PROVIDER_ROOT.data (),
_parent.z_func()->providerWorkdir().asString() } );
340 const auto &cleanupOnErr = [&](){
349 ERR <<
"Failed to send initial message to queue worker" << std::endl;
350 return cleanupOnErr();
358 if ( !caps || caps->messagetypename() != rpc::messageTypeName<zypp::proto::Capabilities>() ) {
359 ERR <<
"Worker did not sent a capabilities message, aborting" << std::endl;
360 return cleanupOnErr();
364 auto p =
_messageStream->parseMessage<zypp::proto::Capabilities>( *caps );
366 return cleanupOnErr();
385 const auto &getRequest = [&](
const auto &exp ) ->
decltype(
_activeItems)::iterator {
387 ERR <<
"Ignoring invalid request!" << std::endl;
392 return exp->requestId() == elem._request->provideMessage().requestId();
396 ERR <<
"Ignoring unknown request ID: " << exp->requestId() << std::endl;
403 const auto &sendErrorToWorker = [&](
const uint32_t reqId,
const uint code,
const std::string &reason,
bool transient = false ) {
406 ERR <<
"Failed to send Error message to worker process." << std::endl;
413 const bool doesDownload = this->
_capabilities.worker_type() == Config::Downloading;
414 const bool fileNeedsCleanup = doesDownload || (
_capabilities.worker_type() == Config::CPUBound &&
_capabilities.cfg_flags() & Config::FileArtifacts );
418 if ( msg->messagetypename() == rpc::messageTypeName<zypp::proto::ProvideMessage>() ) {
426 const auto &reqIter = getRequest( provMsg );
428 if ( provMsg->code() == ProvideMessage::Code::ProvideFinished && fileNeedsCleanup ) {
431 MIL <<
"Received a ProvideFinished message for a non existant request. Since this worker reported to create file artifacts, the file is cleaned up." << std::endl;
438 auto &req = *reqIter;
439 auto &reqRef =req._request;
441 const auto code = provMsg->code();
443 if ( code >= ProvideMessage::Code::FirstInformalCode && code <= ProvideMessage::Code::LastInformalCode ) {
446 if ( reqRef && reqRef->owner() )
447 reqRef->owner()->informalMessage ( *
this, reqRef, *provMsg );
450 }
else if ( code >= ProvideMessage::Code::FirstSuccessCode && code <= ProvideMessage::Code::LastSuccessCode ) {
458 if ( code == ProvideMessage::Code::ProvideFinished ) {
464 std::optional<zypp::ManagedFile> dataRef;
466 if ( !reqIter->isFileRequest() ) {
467 ERR <<
"Invalid message for request ID: " << reqIter->_request->provideMessage().requestId() << std::endl;
473 if ( doesDownload ) {
478 MIL <<
"CACHE MISS, file " << locFName <<
" was already removed, queueing again" << std::endl;
479 if ( reqRef->owner() )
480 reqRef->owner()->cacheMiss( reqRef );
481 reqRef->provideMessage().setRequestId(
InvalidId );
493 reqRef->setCurrentQueue(
nullptr);
494 auto resp =
ProvideMessage::createErrorResponse ( provMsg->requestId(), ProvideMessage::Code::InternalError,
"File vanished between downloading and adding it to cache." );
495 if ( reqRef->owner() )
496 reqRef->owner()->finishReq( *
this, reqRef, resp );
505 reqRef->setCurrentQueue(
nullptr);
506 if ( reqRef->owner() )
507 reqRef->owner()->finishReq( *
this, reqRef, *provMsg );
512 }
else if ( code >= ProvideMessage::Code::FirstClientErrCode && code <= ProvideMessage::Code::LastSrvErrCode ) {
521 reqRef->setCurrentQueue(
nullptr);
523 if ( reqRef->owner() )
524 reqRef->owner()->finishReq( *
this, reqRef, *provMsg );
530 }
else if ( code >= ProvideMessage::Code::FirstRedirCode && code <= ProvideMessage::Code::LastRedirCode ) {
540 reqRef->setCurrentQueue(
nullptr);
541 if ( reqRef->owner() )
542 reqRef->owner()->finishReq( *
this, reqRef, *provMsg );
547 }
else if ( code >= ProvideMessage::Code::FirstControllerCode && code <= ProvideMessage::Code::LastControllerCode ) {
549 ERR <<
"Received Controller message from worker, this is a fatal error. Cancelling all requests!" << std::endl;
553 }
else if ( code >= ProvideMessage::Code::FirstWorkerCode && code <= ProvideMessage::Code::LastWorkerCode ) {
555 if ( code == ProvideMessage::Code::AuthDataRequest ) {
556 if ( !reqIter->isFileRequest() && !reqIter->isAttachRequest() ) {
557 ERR <<
"Invalid message for request ID: " << reqRef->provideMessage().requestId() << std::endl;
564 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData,
"Item was cancelled") )
570 if ( !reqRef->owner() ) {
571 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData,
"Request has no owner" ) )
576 if ( !reqRef->activeUrl() ) {
577 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData,
"Item has no active URL, this is a bug." ) )
585 std::map<std::string, std::string> extraVals;
593 WAR <<
"Ignoring non string value for " << name << std::endl;
603 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData,
"No auth given by user." ) )
608 auto r =
ProvideMessage::createAuthInfo ( reqRef->provideMessage().requestId(), authOpt->username(), authOpt->password(), authOpt->lastDatabaseUpdate(), authOpt->extraValues() );
610 ERR <<
"Failed to send AuthorizationInfo to worker process." << std::endl;
618 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData, e.
asString() ) )
623 }
else if ( code == ProvideMessage::Code::MediaChangeRequest ) {
625 if ( !reqIter->isAttachRequest() ) {
626 ERR <<
"Invalid message for request ID: " << reqIter->_request->provideMessage().requestId() << std::endl;
633 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::MediaChangeAbort,
"Item was cancelled" ) )
638 MIL <<
"Worker sent a MediaChangeRequest, asking the user to insert the correct medium" << std::endl;
641 std::vector<std::string> freeDevs;
643 freeDevs.push_back( val.asString() );
646 std::optional<std::string> desc;
648 if ( descVal.valid () && descVal.isString() )
649 desc = descVal.asString();
662 MIL <<
"Sending back a MediaChanged message, retrying to find medium " << std::endl;
665 ERR <<
"Failed to send MediaChanged to worker process." << std::endl;
672 MIL <<
"Sending back a MediaChangeFailure message, request will fail " << std::endl;
673 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::MediaChangeAbort,
"Cancelled by User" ) )
678 MIL <<
"Sending back a MediaChangeFailure message, request will fail " << std::endl;
679 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::MediaChangeSkip,
"Skipped by User" ) )
686 ERR <<
"Unsupported worker request: "<<code<<
", this is a fatal error!" << std::endl;
693 ERR <<
"Received unsupported message " << msg->messagetypename() <<
" with code " << code <<
" ignoring! " << std::endl;
697 ERR <<
"Received unsupported message " << msg->messagetypename() <<
"ignoring" << std::endl;