Remoto - VFS: VFS_threadpool Class Reference
Remoto - VFS

A wrapper for replicating nodes in different threads to produce more responsive workers in multithreaded applications. More...

#include <VFS_threadpool.h>

Inheritance diagram for VFS_threadpool:
VFS_node

Public Types

enum  mode { roundrobin = 0 , available }
 A pool will distribute requests based on a mode. More...
 

Public Slots

virtual void executeRequest (VFS_request *t) override
 A dummy entry to override VFS_node::executeRequest() More...
 
virtual void subtreeRequest (VFS_request *t) override
 A dummy entry to override VFS_node::subtreeRequest() More...
 
- Public Slots inherited from VFS_node
virtual void applyDiff (VFS_request *r)
 Apply a diff received via subscription. More...
 
virtual void executeRequest (VFS_request *t)
 Based on the VFS_request::requestType, execute the function associated with an operation. More...
 
void notifySubscribers (VFS_node *origin, VFS_request *t)
 Propagate a diff to subscribers. More...
 
virtual void receiveResponse (VFS_request *t)
 Once a VFS_request has been completed, a response will be issued back to its _origin. More...
 
void remove (bool andDelete)
 Remove a child node. More...
 
virtual void remove (VFS_node *node=nullptr, QString *name=nullptr, QString user="server")
 Remove a child node from this node. More...
 
virtual void subtreeRequest (VFS_request *t)
 find() the target of a VFS_request, and execute the request More...
 
virtual void unsubscribeAll (VFS_node *n)
 Remove all references to a subscriber from this node. More...
 

Public Member Functions

Q_INVOKABLE VFS_threadpool (uint count, VFS_threadpool::mode mode, QDomElement nodeConfig, QVariantMap env, bool printConfig=false)
 VFS_threadpool constructor. More...
 
virtual ~VFS_threadpool () override
 VFS_threadpool destructor. More...
 
virtual VFS_nodefind (VFS_request *r) override
 Distribute requests to children based on _mode. More...
 
virtual bool isContainer () override
 A threadpool is always a container. More...
 
- Public Member Functions inherited from VFS_node
Q_INVOKABLE VFS_node ()
 The VFS_node constructor will add its instance to the VFS_node::__allNodes global node registry, observing thread safety rules. More...
 
virtual ~VFS_node ()
 VFS_node destructor. More...
 
virtual VFS_nodeappend (QString name, VFS_node *node, bool containerCheck=true, QString user="server")
 Append a VFS_node as a child of this node. More...
 
QString className ()
 Return the class name of a node. More...
 
virtual VFS_requestcreateRequest (VFS_request::requestType type, QString path, QString user="unknown", QJsonDocument data=QJsonDocument(), QJsonObject metadata=QJsonObject(), bool dontDelete=false)
 Create a new VFS_request with this object as _origin. More...
 
VFS_nodefind (QString path)
 Find a node by string path. More...
 
VFS_nodefindChildWithName (QString name)
 Check if a child with a given name exists. More...
 
virtual VFS_nodemount ()
 Mount this node. More...
 
virtual QString reportDetails ()
 Additional details for a generated report. More...
 
QString uniqueChildName (QString name)
 Generate a unique child name. More...
 
virtual VFS_nodeunmount ()
 Unmount this node. More...
 
virtual bool validChildName (QString name)
 Check if a node name is valid. More...
 

Static Public Attributes

static const QStringList modeStrings { "roundrobin", "available" }
 string names of each mode for the config file More...
 

Protected Attributes

uint _count
 The replication count. More...
 
uint _index
 The current index for roundrobin requests. More...
 
VFS_threadpool::mode _mode
 The distribution mode. More...
 
- Protected Attributes inherited from VFS_node
VFS_children _children
 This node's children. More...
 
QMutex _lock
 A recursive mutex that is local to this node. More...
 
VFS_subscriptionType _subscribers
 This node's subscribers. These subscribers will receive diff notifications. More...
 

Additional Inherited Members

- Signals inherited from VFS_node
void diff (VFS_node *origin, VFS_request *t)
 Emit a diff, which will trigger notifySubscribers() for a mounted node. More...
 
void finished (bool andDelete=false)
 Emitted if a thread fails to create its node, or a node is rm()'d, or any other reason a node has completed its lifecycle. It is deleted if andDelete==true. More...
 
void mounted ()
 Emitted when a node is mount()ed. More...
 
void unmounted (VFS_node *self)
 Emitted when a node is unmount()ed. More...
 
- Static Public Member Functions inherited from VFS_node
static bool __isNode (VFS_node *)
 Check to see if a node is in the global registry. More...
 
static QString code (QString nodename, QString libname, QString &error)
 Fetch code or any other resource from a node. More...
 
- Protected Member Functions inherited from VFS_node
virtual void aclDefaults (VFS_request *r)
 Return default values and features associated wth this node. More...
 
void addACLDefault (QJsonObject &acl, bool value, QString description="")
 Add a default value to the acl object. More...
 
void addACLFeature (QJsonObject &acl, QString feature, bool value, QString description="")
 Add a feature to the acl object. More...
 
void addACLFeatureGroup (QJsonObject &acl, QString feature, QString group, bool value)
 Add a feature group to the acl object. More...
 
void addACLFeatureUser (QJsonObject &acl, QString feature, QString user, bool value)
 Add a feature user to the acl object. More...
 
void addACLGroup (QJsonObject &acl, QString group, bool value)
 Add a group to the acl object. More...
 
void addACLUser (QJsonObject &acl, QString user, bool value)
 Add a user to the acl object. More...
 
virtual QByteArray icon ()
 Fetch the icon for a node. More...
 
virtual void issueRequest (VFS_node *target, VFS_request *t)
 Issue a VFS_request to its target. More...
 
virtual void issueRequest (VFS_request *t)
 A convenience function. More...
 
virtual void issueResponse (VFS_request *t)
 Once a request has been completed, issue a response. More...
 
virtual void ls (VFS_request *r)
 List the contents of this node. More...
 
virtual void metadata (VFS_request *r)
 Fetch the metadata of this node. More...
 
virtual void read (VFS_request *r)
 Return the data contents of this node, or if it's a container call ls() More...
 
virtual void releaseLock (VFS_request *r)
 Release a lock on this node. More...
 
virtual void report (VFS_request *r)
 Report debugging information about the current state of this node. More...
 
virtual void requestLock (VFS_request *r)
 Request a lock on this node. More...
 
virtual void rm (VFS_request *r)
 Remove a child entry from a node, or the node itself. More...
 
virtual void submit (VFS_request *r)
 Submit a diff to a node. More...
 
virtual void subscribe (VFS_request *r)
 Add an entry to this node's _subscription list. More...
 
virtual void unsubscribe (VFS_request *r)
 Remove an entry from this node's _subscription list. More...
 
virtual void unsubscribePath (QString path)
 Unsubscribe all references to a subpath. More...
 
virtual void write (VFS_request *r)
 Write data to this node. More...
 

Detailed Description

A wrapper for replicating nodes in different threads to produce more responsive workers in multithreaded applications.

Any group of nodes can be placed in a threadpool. The threadpool will replicate the group against the threads value provided. Because of this, special care must be taken to ensure that the replicated nodes are not expected to be unique or stateful.

For instance, a series of read-only VFS_HD nodes make sense for this purpose, as multithreaded disk reads may make more sense than a blocking single-threaded one. However, each VFS_HD node will maintain its own cache and therefore a write to a threadpool-ed VFS_HD node will be unpredictable when under load.

The threadpool will proxy VFS_requests to its children based on its distribution mode:

  • Roundrobin - Incoming requests will revolve through children.
  • Available - Incoming requests will be queued on the child with the fewest pending requests.
Note
That the actual number of threads created will depend on the nodes being created. If 5 children are on separate threads and the pool has a count of 5, 25 new threads will be created.
See also
VFS_creator::constructNode
VFS_thread
XML Config File(s)

Definition at line 9 of file VFS_threadpool.h.

Member Enumeration Documentation

◆ mode

A pool will distribute requests based on a mode.

Enumerator
roundrobin 

roundrobin mode will cycle through children

available 

available mode will use the child with the fewest outstanding requests

Definition at line 16 of file VFS_threadpool.h.

Constructor & Destructor Documentation

◆ VFS_threadpool()

VFS_threadpool::VFS_threadpool ( uint  count,
VFS_threadpool::mode  mode,
QDomElement  nodeConfig,
QVariantMap  env,
bool  printConfig = false 
)
explicit

VFS_threadpool constructor.

Parameters
countThe number of threads to create
modeThe distribution mode for this pool
nodeConfigAn XML specification for nodes to replicate
envThe current environment
printConfigA debug setting passed during creation of threads

Creates a series of _thread nodes based on incoming config data. The new threads are named based on the node type, node name and thread index, which is useful in debuggers like gdb.

Definition at line 49 of file VFS_threadpool.cpp.

◆ ~VFS_threadpool()

VFS_threadpool::~VFS_threadpool ( )
overridevirtual

VFS_threadpool destructor.

Definition at line 77 of file VFS_threadpool.cpp.

Member Function Documentation

◆ executeRequest

void VFS_threadpool::executeRequest ( VFS_request t)
overridevirtualslot

A dummy entry to override VFS_node::executeRequest()

Parameters
tThe VFS_request object

This is a dummy entry to catch errors. In pactice it should never be called. If a warning is issued it means that some node has received a pointer to this node, which it should never have.

Definition at line 156 of file VFS_threadpool.cpp.

◆ find()

VFS_node * VFS_threadpool::find ( VFS_request r)
overridevirtual

Distribute requests to children based on _mode.

Parameters
rThe VFS_request object
Returns
The result of a selected child's VFS_node::find()

This method will use _mode to determine which child path to follow for requests.

See also
VFS_threadpool

Reimplemented from VFS_node.

Definition at line 103 of file VFS_threadpool.cpp.

◆ isContainer()

bool VFS_threadpool::isContainer ( )
overridevirtual

A threadpool is always a container.

Returns
true

Reimplemented from VFS_node.

Definition at line 87 of file VFS_threadpool.cpp.

◆ subtreeRequest

void VFS_threadpool::subtreeRequest ( VFS_request t)
overridevirtualslot

A dummy entry to override VFS_node::subtreeRequest()

Parameters
tThe VFS_request object

This is a dummy entry to catch errors. In pactice it should never be called. If a warning is issued it means that some node has received a pointer to this node, which it should never have.

Definition at line 140 of file VFS_threadpool.cpp.

Member Data Documentation

◆ _count

uint VFS_threadpool::_count
protected

The replication count.

Definition at line 34 of file VFS_threadpool.h.

◆ _index

uint VFS_threadpool::_index
protected

The current index for roundrobin requests.

Definition at line 35 of file VFS_threadpool.h.

◆ _mode

VFS_threadpool::mode VFS_threadpool::_mode
protected

The distribution mode.

Definition at line 36 of file VFS_threadpool.h.

◆ modeStrings

const QStringList VFS_threadpool::modeStrings { "roundrobin", "available" }
static

string names of each mode for the config file

Definition at line 22 of file VFS_threadpool.h.


The documentation for this class was generated from the following files: