26 #ifndef __XRD_CL_OPERATIONS_HH__
27 #define __XRD_CL_OPERATIONS_HH__
118 std::promise<XRootDStatus>
prms,
166 std::promise<XRootDStatus>
prms;
172 std::function<void(const XRootDStatus&)>
final;
182 template<
bool HasHndl>
189 friend std::future<XRootDStatus>
Async(
Pipeline, uint16_t );
210 if( !op.valid )
throw std::invalid_argument(
"Cannot construct "
211 "Operation from an invalid Operation!" );
256 std::promise<XRootDStatus> prms,
259 static_assert(HasHndl,
"Only an operation that has a handler can be assigned to workflow");
260 handler->Assign( timeout, std::move( prms ), std::move(
final ),
this );
276 catch(
const std::exception& ex )
329 friend std::future<XRootDStatus>
Async(
Pipeline, uint16_t );
414 operation->AddOperation( op.ToHandled() );
425 if( !
bool(
operation ) )
throw std::logic_error(
"Invalid pipeline." );
488 throw std::logic_error(
"Pipeline is already running!" );
491 std::promise<XRootDStatus> prms;
492 ftr = prms.get_future();
494 if( !
operation ) std::logic_error(
"Empty pipeline!" );
497 opr->
Run( timeout, std::move( prms ), std::move(
final ) );
508 std::future<XRootDStatus>
ftr;
520 inline std::future<XRootDStatus>
Async(
Pipeline pipeline, uint16_t timeout = 0 )
522 pipeline.
Run( timeout );
523 return std::move( pipeline.
ftr );
536 return Async( std::move( pipeline ), timeout ).get();
547 template<
template<
bool>
class Derived,
bool HasHndl,
typename HdlrFactory,
typename ... Args>
550 template<
template<
bool>
class, bool,
typename,
typename ...>
563 static_assert( !HasHndl,
"It is only possible to construct operation without handler" );
575 Operation<HasHndl>( std::move( op ) ),
args( std::move( op.
args ) ), timeout( 0 )
588 template<
typename Hdlr>
591 return this->
StreamImpl( HdlrFactory::Create( hdlr ) );
648 this->
handler->Assign( fo.final );
649 return this->
template Transform<true>();
659 Derived<HasHndl> *me =
static_cast<Derived<HasHndl>*
>( this );
660 return new Derived<HasHndl>( std::move( *me ) );
671 Derived<HasHndl> *me =
static_cast<Derived<HasHndl>*
>( this );
672 return new Derived<true>( std::move( *me ) );
681 Derived<HasHndl> *me =
static_cast<Derived<HasHndl>*
>( this );
682 return std::move( *me );
695 Derived<HasHndl> *me =
static_cast<Derived<HasHndl>*
>( this );
696 return Derived<to>( std::move( *me ) );
708 static_assert( !HasHndl,
"Operator >> is available only for operation without handler" );
710 return Transform<true>();
744 me.AddOperation( op.
Move() );
745 return me.template Transform<true>();
762 return me.template Transform<true>();
777 #endif // __XRD_CL_OPERATIONS_HH__
std::unique_ptr< Operation< true > > operation
First operation in the pipeline.
Definition: XrdClOperations.hh:503
Definition: XrdClAnyObject.hh:32
Operation(Operation< from > &&op)
Move constructor between template instances.
Definition: XrdClOperations.hh:207
bool valid
Flag indicating if it is a valid object.
Definition: XrdClOperations.hh:316
Pipeline & operator|=(Operation< false > &&op)
Extend pipeline.
Definition: XrdClOperations.hh:412
friend std::future< XRootDStatus > Async(Pipeline, uint16_t)
Definition: XrdClOperations.hh:520
std::future< XRootDStatus > ftr
The future result of the pipeline.
Definition: XrdClOperations.hh:508
Pipeline(Operation< false > &&op)
Constructor.
Definition: XrdClOperations.hh:381
Definition: XrdClOperationTimeout.hh:19
ssize_t Move(KernelBuffer &kbuff, char *&ubuff)
Definition: XrdSysKernelBuffer.hh:452
Call the user callback.
Definition: XrdClResponseJob.hh:30
Derived< true > operator|(Operation< true > &&op)
Definition: XrdClOperations.hh:613
Pipeline & operator=(Pipeline &&pipe)
Constructor.
Definition: XrdClOperations.hh:394
static void Repeat()
Repeat current operation.
Derived< true > operator|(Operation< true > &op)
Definition: XrdClOperations.hh:601
Derived< true > operator>>(Hdlr &&hdlr)
Definition: XrdClOperations.hh:589
uint16_t timeout
Operation timeout.
Definition: XrdClOperations.hh:773
Pipeline & operator|=(Operation< true > &&op)
Extend pipeline.
Definition: XrdClOperations.hh:403
Pipeline()
Default constructor.
Definition: XrdClOperations.hh:337
void HandleResponseImpl(XRootDStatus *status, AnyObject *response, HostList *hostList=nullptr)
Callback function implementation;.
void dealloc(XRootDStatus *status, AnyObject *response, HostList *hostList)
Definition: XrdClOperations.hh:135
Derived< true > operator|(FinalOperation &&fo)
Adds a final operation to the pipeline.
Definition: XrdClOperations.hh:645
void AddOperation(Operation< true > *op)
Definition: XrdClOperations.hh:302
ConcreteOperation(ConcreteOperation< Derived, from, HdlrFactory, Args...> &&op)
Definition: XrdClOperations.hh:574
Derived< true > StreamImpl(ResponseHandler *handler)
Definition: XrdClOperations.hh:706
const XRootDStatus & GetError() const
Definition: XrdClOperationHandlers.hh:433
void QueueJob(Job *job, void *arg=0)
Add a job to be run.
Definition: XrdClJobManager.hh:92
Definition: XrdClFinalOperation.hh:39
Derived< HasHndl > Timeout(uint16_t timeout)
Set operation timeout.
Definition: XrdClOperations.hh:678
friend std::future< XRootDStatus > Async(Pipeline, uint16_t)
Definition: XrdClOperations.hh:520
~PipelineHandler()
Destructor.
Definition: XrdClOperations.hh:98
Definition: XrdClOperationTimeout.hh:17
std::future< XRootDStatus > Async(Pipeline pipeline, uint16_t timeout=0)
Definition: XrdClOperations.hh:520
Derived< true > operator|(Operation< false > &op)
Definition: XrdClOperations.hh:625
static void Replace(Operation< false > &&opr)
Replace current operation.
virtual ~Operation()
Destructor.
Definition: XrdClOperations.hh:218
Pipeline exception, wrapps an XRootDStatus.
Definition: XrdClOperationHandlers.hh:392
Pipeline(Operation< true > &&op)
Constructor.
Definition: XrdClOperations.hh:360
std::function< Operation< true > *(const XRootDStatus &)> rcvry_func
Type of the recovery function to be provided by the user.
Definition: XrdClOperations.hh:51
std::vector< HostInfo > HostList
Definition: XrdClXRootDResponses.hh:1111
void Run(Timeout timeout, std::function< void(const XRootDStatus &)> final=nullptr)
Definition: XrdClOperations.hh:485
Timeout timeout
Pipeline timeout.
Definition: XrdClOperations.hh:161
void HandleResponseWithHosts(XRootDStatus *status, AnyObject *response, HostList *hostList)
Callback function.
static void Ignore()
Ignore error and proceed with the pipeline.
friend class ConcreteOperation
Definition: XrdClOperations.hh:551
std::tuple< Args...> args
Operation arguments.
Definition: XrdClOperations.hh:768
Pipeline(Pipeline &&pipe)
Definition: XrdClOperations.hh:386
PipelineHandler()
Default Constructor.
Definition: XrdClOperations.hh:80
virtual std::string ToString()=0
Name of the operation.
std::unique_ptr< Operation< true > > nextOperation
Next operation in the pipeline.
Definition: XrdClOperations.hh:156
Pipeline(Operation< false > &op)
Constructor.
Definition: XrdClOperations.hh:373
const uint16_t stError
An error occurred that could potentially be retried.
Definition: XrdClStatus.hh:32
Request status.
Definition: XrdClXRootDResponses.hh:218
XRootDStatus WaitFor(Pipeline pipeline, uint16_t timeout=0)
Definition: XrdClOperations.hh:534
Definition: XrdClOperations.hh:49
const uint16_t errOperationExpired
Definition: XrdClStatus.hh:90
Operation()
Constructor.
Definition: XrdClOperations.hh:199
static Derived< true > PipeImpl(ConcreteOperation< Derived, HasHndl, HdlrFactory, Args...> &me, Operation< false > &op)
Definition: XrdClOperations.hh:757
static void AllocHandler(ConcreteOperation< Derived, true, HdlrFactory, Args...> &me)
Definition: XrdClOperations.hh:717
Definition: XrdClOperations.hh:63
static void AllocHandler(ConcreteOperation< Derived, false, HdlrFactory, Args...> &me)
Definition: XrdClOperations.hh:726
Operation< HasHndl > * Move()
Definition: XrdClOperations.hh:657
void HandleResponse(XRootDStatus *status, AnyObject *response)
Callback function.
Pipeline(Operation< true > &op)
Constructor.
Definition: XrdClOperations.hh:352
std::promise< XRootDStatus > prms
The promise that there will be a result (traveling along the pipeline)
Definition: XrdClOperations.hh:166
Handle an async response.
Definition: XrdClXRootDResponses.hh:1116
Operation< true > * operator->()
Definition: XrdClOperations.hh:474
std::unique_ptr< Operation< true > > currentOperation
The operation the handler is assigned to.
Definition: XrdClOperations.hh:151
Derived< to > Transform()
Definition: XrdClOperations.hh:693
void AddOperation(Operation< true > *operation)
JobManager * GetJobManager()
Get the job manager object user by the post master.
Pipeline(Operation< false > *op)
Definition: XrdClOperations.hh:365
const uint16_t errInternal
Internal error.
Definition: XrdClStatus.hh:56
static Derived< true > PipeImpl(ConcreteOperation< Derived, HasHndl, HdlrFactory, Args...> &me, Operation< true > &op)
Definition: XrdClOperations.hh:740
virtual Operation< true > * ToHandled()=0
friend class PipelineHandler
Definition: XrdClOperations.hh:192
void Run(Timeout timeout, std::promise< XRootDStatus > prms, std::function< void(const XRootDStatus &)> final)
Definition: XrdClOperations.hh:255
virtual XRootDStatus RunImpl(PipelineHandler *handler, uint16_t timeout)=0
Operation< true > * ToHandled()
Definition: XrdClOperations.hh:668
static void Stop(const XRootDStatus &status=XrdCl::XRootDStatus())
ConcreteOperation(Args &&...args)
Definition: XrdClOperations.hh:560
Pipeline(Operation< true > *op)
Constructor.
Definition: XrdClOperations.hh:344
std::unique_ptr< ResponseHandler > responseHandler
The handler of our operation.
Definition: XrdClOperations.hh:146
static PostMaster * GetPostMaster()
Get default post master.
bool IsOK() const
We're fine.
Definition: XrdClStatus.hh:123
Derived< true > operator|(Operation< false > &&op)
Definition: XrdClOperations.hh:637
Definition: XrdClOperations.hh:326
Definition: XrdClParallelOperation.hh:79
void Assign(const Timeout &timeout, std::promise< XRootDStatus > prms, std::function< void(const XRootDStatus &)> final, Operation< true > *opr)
virtual Operation< HasHndl > * Move()=0
std::unique_ptr< PipelineHandler > handler
Operation handler.
Definition: XrdClOperations.hh:311
Definition: XrdClOperations.hh:548