26#ifndef __XRD_CL_OPERATIONS_HH__
27#define __XRD_CL_OPERATIONS_HH__
49 template<
bool HasHndl>
class Operation;
117 std::promise<XRootDStatus>
prms,
170 std::promise<XRootDStatus>
prms;
186 template<
bool HasHndl>
193 friend std::future<XRootDStatus>
Async(
Pipeline, uint16_t );
214 if( !op.valid )
throw std::invalid_argument(
"Cannot construct "
215 "Operation from an invalid Operation!" );
255 std::promise<XRootDStatus> prms,
258 static_assert(HasHndl,
"Only an operation that has a handler can be assigned to workflow");
259 handler->Assign( timeout, std::move( prms ), std::move(
final ), this );
275 catch(
const std::exception& ex )
327 friend std::future<XRootDStatus>
Async(
Pipeline, uint16_t );
412 operation->AddOperation( op.ToHandled() );
423 if( !
bool(
operation ) )
throw std::logic_error(
"Invalid pipeline." );
486 throw std::logic_error(
"Pipeline is already running!" );
489 std::promise<XRootDStatus> prms;
490 ftr = prms.get_future();
492 if( !
operation ) std::logic_error(
"Empty pipeline!" );
499 opr->
Run( timeout, std::move( prms ), std::move(
final ) );
510 std::future<XRootDStatus>
ftr;
522 inline std::future<XRootDStatus>
Async(
Pipeline pipeline, uint16_t timeout = 0 )
524 pipeline.
Run( timeout );
525 return std::move( pipeline.
ftr );
539 return Async( std::move( pipeline ), timeout ).get();
550 template<
template<
bool>
class Derived,
bool HasHndl,
typename HdlrFactory,
typename ... Args>
553 template<
template<
bool>
class, bool,
typename,
typename ...>
566 static_assert( !HasHndl,
"It is only possible to construct operation without handler" );
591 template<
typename Hdlr>
594 return this->
StreamImpl( HdlrFactory::Create( hdlr ) );
651 this->
handler->Assign( fo.final );
652 return this->
template Transform<true>();
662 Derived<HasHndl> *me =
static_cast<Derived<HasHndl>*
>( this );
663 return new Derived<HasHndl>( std::move( *me ) );
674 Derived<HasHndl> *me =
static_cast<Derived<HasHndl>*
>( this );
675 return new Derived<true>( std::move( *me ) );
684 Derived<HasHndl> *me =
static_cast<Derived<HasHndl>*
>( this );
685 return std::move( *me );
698 Derived<HasHndl> *me =
static_cast<Derived<HasHndl>*
>( this );
699 return Derived<to>( std::move( *me ) );
711 static_assert( !HasHndl,
"Operator >> is available only for operation without handler" );
713 return Transform<true>();
747 me.AddOperation( op.
Move() );
748 return me.template Transform<true>();
765 return me.template Transform<true>();
Definition XrdClAnyObject.hh:33
Definition XrdClOperations.hh:552
Derived< to > Transform()
Definition XrdClOperations.hh:696
Derived< true > operator|(Operation< true > &&op)
Definition XrdClOperations.hh:616
static void AllocHandler(ConcreteOperation< Derived, true, HdlrFactory, Args... > &me)
Definition XrdClOperations.hh:720
static void AllocHandler(ConcreteOperation< Derived, false, HdlrFactory, Args... > &me)
Definition XrdClOperations.hh:729
std::tuple< Args... > args
Operation arguments.
Definition XrdClOperations.hh:771
Derived< true > StreamImpl(ResponseHandler *handler)
Definition XrdClOperations.hh:709
ConcreteOperation(ConcreteOperation< Derived, from, HdlrFactory, Args... > &&op)
Definition XrdClOperations.hh:577
Derived< HasHndl > Timeout(uint16_t timeout)
Set operation timeout.
Definition XrdClOperations.hh:681
Derived< true > operator>>(Hdlr &&hdlr)
Definition XrdClOperations.hh:592
uint16_t timeout
Operation timeout.
Definition XrdClOperations.hh:776
ConcreteOperation(Args &&... args)
Definition XrdClOperations.hh:563
Derived< true > operator|(Operation< false > &op)
Definition XrdClOperations.hh:628
Operation< HasHndl > * Move()
Definition XrdClOperations.hh:660
static Derived< true > PipeImpl(ConcreteOperation< Derived, HasHndl, HdlrFactory, Args... > &me, Operation< false > &op)
Definition XrdClOperations.hh:760
Derived< true > operator|(Operation< false > &&op)
Definition XrdClOperations.hh:640
Derived< true > operator|(FinalOperation &&fo)
Adds a final operation to the pipeline.
Definition XrdClOperations.hh:648
Operation< true > * ToHandled()
Definition XrdClOperations.hh:671
static Derived< true > PipeImpl(ConcreteOperation< Derived, HasHndl, HdlrFactory, Args... > &me, Operation< true > &op)
Definition XrdClOperations.hh:743
friend class ConcreteOperation
Definition XrdClOperations.hh:554
Derived< true > operator|(Operation< true > &op)
Definition XrdClOperations.hh:604
static PostMaster * GetPostMaster()
Get default post master.
Definition XrdClFinalOperation.hh:42
void QueueJob(Job *job, void *arg=0)
Add a job to be run.
Definition XrdClJobManager.hh:92
Definition XrdClOperations.hh:188
virtual ~Operation()
Destructor.
Definition XrdClOperations.hh:222
virtual Operation< HasHndl > * Move()=0
friend class PipelineHandler
Definition XrdClOperations.hh:196
Operation()
Constructor.
Definition XrdClOperations.hh:203
void AddOperation(Operation< true > *op)
Definition XrdClOperations.hh:300
void Run(Timeout timeout, std::promise< XRootDStatus > prms, std::function< void(const XRootDStatus &)> final)
Definition XrdClOperations.hh:254
bool valid
Flag indicating if it is a valid object.
Definition XrdClOperations.hh:314
virtual std::string ToString()=0
Name of the operation.
virtual XRootDStatus RunImpl(PipelineHandler *handler, uint16_t timeout)=0
virtual Operation< true > * ToHandled()=0
std::unique_ptr< PipelineHandler > handler
Operation handler.
Definition XrdClOperations.hh:309
friend std::future< XRootDStatus > Async(Pipeline, uint16_t)
Definition XrdClOperations.hh:522
Operation(Operation< from > &&op)
Move constructor between template instances.
Definition XrdClOperations.hh:211
Definition XrdClParallelOperation.hh:80
Pipeline exception, wrapps an XRootDStatus.
Definition XrdClOperationHandlers.hh:393
Definition XrdClOperations.hh:64
void dealloc(XRootDStatus *status, AnyObject *response, HostList *hostList)
Definition XrdClOperations.hh:139
void HandleResponseWithHosts(XRootDStatus *status, AnyObject *response, HostList *hostList)
Callback function.
PipelineHandler()
Default Constructor.
Definition XrdClOperations.hh:79
void PreparePipelineStart()
Called by a pipeline on the handler of its first operation before Run.
Timeout timeout
Pipeline timeout.
Definition XrdClOperations.hh:165
void Assign(const Timeout &timeout, std::promise< XRootDStatus > prms, std::function< void(const XRootDStatus &)> final, Operation< true > *opr)
std::unique_ptr< ResponseHandler > responseHandler
The handler of our operation.
Definition XrdClOperations.hh:150
~PipelineHandler()
Destructor.
Definition XrdClOperations.hh:97
std::promise< XRootDStatus > prms
The promise that there will be a result (traveling along the pipeline)
Definition XrdClOperations.hh:170
PipelineHandler(ResponseHandler *handler)
void HandleResponseImpl(XRootDStatus *status, AnyObject *response, HostList *hostList=nullptr)
Callback function implementation;.
std::unique_ptr< Operation< true > > currentOperation
The operation the handler is assigned to.
Definition XrdClOperations.hh:155
void HandleResponse(XRootDStatus *status, AnyObject *response)
Callback function.
void AddOperation(Operation< true > *operation)
void Assign(std::function< void(const XRootDStatus &)> final)
Assign the finalization routine.
std::unique_ptr< Operation< true > > nextOperation
Next operation in the pipeline.
Definition XrdClOperations.hh:160
Definition XrdClOperations.hh:325
Pipeline(Operation< true > *op)
Constructor.
Definition XrdClOperations.hh:342
std::future< XRootDStatus > ftr
The future result of the pipeline.
Definition XrdClOperations.hh:510
Pipeline(Operation< true > &&op)
Constructor.
Definition XrdClOperations.hh:358
Pipeline & operator|=(Operation< true > &&op)
Extend pipeline.
Definition XrdClOperations.hh:401
static void Repeat()
Repeat current operation.
Operation< true > * operator->()
Definition XrdClOperations.hh:472
static void Stop(const XRootDStatus &status=XrdCl::XRootDStatus())
Pipeline(Operation< true > &op)
Constructor.
Definition XrdClOperations.hh:350
Pipeline(Pipeline &&pipe)
Definition XrdClOperations.hh:384
Pipeline & operator=(Pipeline &&pipe)
Constructor.
Definition XrdClOperations.hh:392
Pipeline(Operation< false > *op)
Definition XrdClOperations.hh:363
static void Replace(Operation< false > &&opr)
Replace current operation.
Pipeline(Operation< false > &&op)
Constructor.
Definition XrdClOperations.hh:379
friend std::future< XRootDStatus > Async(Pipeline, uint16_t)
Definition XrdClOperations.hh:522
std::unique_ptr< Operation< true > > operation
First operation in the pipeline.
Definition XrdClOperations.hh:505
void Run(Timeout timeout, std::function< void(const XRootDStatus &)> final=nullptr)
Definition XrdClOperations.hh:483
static void Ignore()
Ignore error and proceed with the pipeline.
Pipeline(Operation< false > &op)
Constructor.
Definition XrdClOperations.hh:371
Pipeline()
Default constructor.
Definition XrdClOperations.hh:335
static void Replace(Pipeline p)
Replace with pipeline.
Pipeline & operator|=(Operation< false > &&op)
Extend pipeline.
Definition XrdClOperations.hh:410
JobManager * GetJobManager()
Get the job manager object user by the post master.
Handle an async response.
Definition XrdClXRootDResponses.hh:1126
Call the user callback.
Definition XrdClResponseJob.hh:31
Definition XrdClOperationTimeout.hh:20
Request status.
Definition XrdClXRootDResponses.hh:219
Definition XrdClOperationTimeout.hh:17
Definition XrdClAction.hh:34
const uint16_t errOperationExpired
Definition XrdClStatus.hh:90
const uint16_t stError
An error occurred that could potentially be retried.
Definition XrdClStatus.hh:32
std::function< Operation< true > *(const XRootDStatus &)> rcvry_func
Type of the recovery function to be provided by the user.
Definition XrdClOperations.hh:57
XRootDStatus WaitFor(Pipeline pipeline, uint16_t timeout=0)
Definition XrdClOperations.hh:537
std::vector< HostInfo > HostList
Definition XrdClXRootDResponses.hh:1120
const uint16_t errInternal
Internal error.
Definition XrdClStatus.hh:56
std::future< XRootDStatus > Async(Pipeline pipeline, uint16_t timeout=0)
Definition XrdClOperations.hh:522
Definition XrdOucJson.hh:4517
bool IsOK() const
We're fine.
Definition XrdClStatus.hh:124