Remoto - VFS
|
A wrapper for replicating nodes in different threads to produce more responsive workers in multithreaded applications. More...
#include <VFS_threadpool.h>
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_node * | find (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_node * | append (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_request * | createRequest (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_node * | find (QString path) |
Find a node by string path. More... | |
VFS_node * | findChildWithName (QString name) |
Check if a child with a given name exists. More... | |
virtual VFS_node * | mount () |
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_node * | unmount () |
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... | |
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:
Definition at line 9 of file VFS_threadpool.h.
enum VFS_threadpool::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.
|
explicit |
VFS_threadpool constructor.
count | The number of threads to create |
mode | The distribution mode for this pool |
nodeConfig | An XML specification for nodes to replicate |
env | The current environment |
printConfig | A 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.
|
overridevirtual |
VFS_threadpool destructor.
Definition at line 77 of file VFS_threadpool.cpp.
|
overridevirtualslot |
A dummy entry to override VFS_node::executeRequest()
t | The 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.
|
overridevirtual |
Distribute requests to children based on _mode
.
r | The VFS_request object |
This method will use _mode
to determine which child path to follow for requests.
Reimplemented from VFS_node.
Definition at line 103 of file VFS_threadpool.cpp.
|
overridevirtual |
A threadpool is always a container.
Reimplemented from VFS_node.
Definition at line 87 of file VFS_threadpool.cpp.
|
overridevirtualslot |
A dummy entry to override VFS_node::subtreeRequest()
t | The 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.
|
protected |
The replication count.
Definition at line 34 of file VFS_threadpool.h.
|
protected |
The current index for roundrobin requests.
Definition at line 35 of file VFS_threadpool.h.
|
protected |
The distribution mode.
Definition at line 36 of file VFS_threadpool.h.
|
static |
string names of each mode for the config file
Definition at line 22 of file VFS_threadpool.h.