From a083d3d9566f7f6982bc824d13d8af062fa97355 Mon Sep 17 00:00:00 2001 From: Mauro Passerino Date: Wed, 17 Nov 2021 15:18:10 +0000 Subject: [PATCH 1/5] Update design and add EventsQueue's types info Signed-off-by: Mauro Passerino --- articles/events_executor.md | 115 +++++++++++-------- img/events_executor/waitset-events-queue.png | Bin 0 -> 119094 bytes 2 files changed, 69 insertions(+), 46 deletions(-) create mode 100644 img/events_executor/waitset-events-queue.png diff --git a/articles/events_executor.md b/articles/events_executor.md index e8c2f6968..72ef4ae27 100644 --- a/articles/events_executor.md +++ b/articles/events_executor.md @@ -53,20 +53,20 @@ The `EventsExecutor` is characterized by two main components, i.e. the `EventsQu ### Brief Overview -In order to execute generic ROS 2 entities (i.e. everything except timers), the `EventsExecutor` relies on an event queue. +In order to execute generic ROS 2 entities, the `EventsExecutor` relies on an event queue. Whenever a ROS 2 entity that is associated to the executor has work to do, it will push an event into the executor's queue. Then the executor can process these events in a FIFO manner, without need for expensive entities look-ups. Processing an event results in different operations depending on the entity that generated it. -Timers are executed in a separate task by a timers manager, where they are kept in a priority queue sorted according to their expiration time. The task then has to monitor only the first element of the queue and can execute its callback as soon as it expires. +Timers are monitored in a separate task by a timers manager, where they are kept in a priority queue sorted according to their expiration time. The task then has to monitor only the first element of the queue and can execute its callback as soon as it expires. The timers manager can also push timer events into the queue, instead of executing the timer. ![Overview](../img/events_executor/overview.png) ### EventsQueue -The `EventsExecutor` requires that all the entities (except ROS 2 timers) as soon as they have some work to do, they push an event into the executor's `EventsQueue`. -The events are produced in the RMW layer, i.e. where the underlying middleware notifies the ROS 2 entity that there is new work to do, on the other hand, events are executed in the rclcpp layer by the `EventsExecutor`. +The `EventsExecutor` requires that all the entities as soon as they have some work to do, they push an event into the executor's `EventsQueue`. +Events might be produced in the RMW layer, i.e. where the underlying middleware notifies the ROS 2 entity that there is new work to do, but events can also be produced in the rclcpp layer. Events are executed in the rclcpp layer by the `EventsExecutor`. The event data structure that is pushed into the `EventsQueue` must contain all what is needed for the executor to be able to process that particular event. The data structure so includes the type of the entity that generated the event and a handle to its corresponding rclcpp object. @@ -74,12 +74,15 @@ Considering the entities currently available in ROS 2, the content of the event - `ExecutorEventType::SUBSCRIPTION_EVENT` and an identifier for a `rclcpp::SubscriptionBase` object. - `ExecutorEventType::SERVICE_EVENT` and an identifier for a `rclcpp::ServiceBase` object. - `ExecutorEventType::CLIENT_EVENT` and an identifier for a `rclcpp::ClientBase` object. - - `ExecutorEventType::WAITABLE_EVENT` and an identifier for a `rclcpp::Waitable` object. + - `ExecutorEventType::TIMER_EVENT` and an identifier for a `rclcpp::TimerBase` object. + - `ExecutorEventType::WAITABLE_EVENT` and an identifier for a `rclcpp::Waitable` object plus an identifier used by the waitable to perform different actions based on it. Let's consider as an example how ROS 2 subscription are handled in the current implementation of the `EventsExecutor`. The underlying middleware will notify the rmw_subscription object whenever a new message arrives. The rmw_subscription object will have to push an event data structure into the `EventsExecutor`'s queue. This event data structure will contain the `ExecutorEventType::SUBSCRIPTION_EVENT` label (to denote that this event comes from a subscription) and a raw pointer to the `rclcpp::SubscriptionBase` object which will have to execute it. +In the case of a `rclcpp::Waitable` object, for example if a `rclcpp_action::ServerBase` waitable has a request from a client, the rmw pushes an `ExecutorEventType::WAITABLE_EVENT` along the ID of the `rclcpp_action::ServerBase` object, but also includes the ID of the action server's `GoalService` which should be executed when the `EventsExecutor` executes the action server waitable. + It is responsibility of the `EventsExecutor` to setup entities such that they can push such events. An application can add ROS 2 nodes or callback groups to an `EventsExecutor` using the corresponding APIs (`add_node()` and `add_callback_group()`). @@ -107,7 +110,7 @@ Note that `Waitables` can be used as a way to implement generic custom events, a ##### Timer -Timers are not required to push events into the `EventsExecutor`'s `EventsQueue`, so new timer entities are simply redirected to the `TimersManager` object. +The `TimersManager` object can either push timer events into the `EventsExecutor`'s `EventsQueue` or execute them directly when they are ready. ---- @@ -129,11 +132,63 @@ This class will forward the items needed for pushing events to the notify guard Whenever an entity is associated to an executor it may already have multiple items of work ready to be processed. The `EventsExecutor` should tell the entity whether it has to immediately push or to discard those pending events. +### Types of Events queue + +There are multiple uses cases with different requirements (performance, determinism in events ordering, bounded memory). A single `EventsQueue` can't comply with all requirements simultaneously, so there's need for different types of queue. + +##### SimpleEventsQueue + +This is the simplest queue, as it does not peform any checks when events are pushed or extracted, so it's more suitable for situacions where CPU performance is needed. + +As long as events are pushed into the queue it will keep growing, regardless of the actual history size of the underlying middleware entity. +This may cause several events to accumulate, for example while the `EventsExecutor` is not spinning, which can lead to out-of-memory situations or subverting the ordering of events. + +This queue may fail to provide a correct ordering of events in some corner case situations. +In particular, if an entity pushes a number of events greater than its QoS history size while the `EventsExecutor` is busy processing events, then the ordering may be compromised. + +Consider the following example of a system with two subscriptions A and B. Subscription A has a QoS history size of 1. +While the `EventsExecutor` is busy processing events, the following events accumulates into the `EventsQueue`: + - Event 1 from Subscription A + - Event 2 from Subscription B + - Event 3 from Subscription A + +When the `EventsExecutor` is ready to process these new events, it will start from the first pushed, i.e. the event 1 from Subscription A. +However, when calling the `execute_subscription()` API, the message that generated event 1 will not be available anymore as it has been overwritten from the message that generated event 3. +The `execute_subscription()` API will not fail, but rather it will process the message that generated event 3. +This violates the ordering as event 2 should have been processed before that. + +##### LockFreeEventsQueue + +This queue is equivalent to the `SimpleEventsQueue` with the difference that is lock free, which improves performance reducing times needed to enqueue/dequeue events from it. + +##### BoundedEventsQueue + +This queue doesn't allow more events from an entity than its history size. For example a subscription with a history size of 5, can't have more than 5 events from it in the queue. + +This queue has policies to decide what to do when a new event arrives from an entity which will exceed the amount of events allowed. It can remove the oldest event and push a new one, which keeps the relative time ordering of the event with respect to other events (at the cost of some CPU time), or it can directly avoid pushing the new event into the queue, saving CPU but subverting the time ordering of events. + +##### WaitSetEventsQueue + +This queue has a waitset-like behaviour: There's a single entry for each entity, and the order of events execution is the same as the `SingleThreadedExecutor` executor. +If the `TimersManager` is configured to push timer events, timers will be executed in the same thread as other entities, as it happens also with the current default executor. + +The difference with respect to the waitset used in the `SingleThreadedExecutor` is that only entities which have work to do are present in the waitset. This way we avoid polling entities in search of new data to process. +Also this reduces the time to look for existing elements in the waitset (to update their events counter) as there are less elements to iterate. + +The events from a single entity are represented by a single event and counter, specifying the number of events left to execute from this entity (as oposed to other EventsQueue which can have multiple events). + +The waitset has elements ordered by entity tipe: 1.Timers / 2.Subs / 3.Services / 4.Clients / 5.Waitables. An iterator points to the next event to dequeue, so the order of execution of entities is the same as of the `SingleThreadedExecutor`. + +The waitset is internally divided in lists of events by entity tipe: Timers / Subs / Services / Clients / Waitables. This makes easy to add a new event to where it belongs, otherwise, some logic is needed to locate the event in the correct position to maintain the desired order of events to execute. + +![Overview](../img/events_executor/waitset-events-queue.png) + ### TimersManager -The `TimersManager` is a class that allows to monitor and execute multiple timers. +The `TimersManager` is a class that allows to monitor timers and execute them or push timer events. It should respect the following specification: - Timers are dynamic and they can be added or removed while the `TimersManager` is running. + - The `TimersManager` should support both executing a timer or push a `ExecutorEventType::TIMER_EVENT` with the ID of the `rclcpp::TimerBase` when ready. - The `TimersManager` should support both periodic as well as one-shot timers (with the second currently not available in ROS 2). - The `TimersManager` need to support all the modes of a ROS 2 executor (i.e. `spin()`, `spin_some()`, etc). - Users should be able to extend the `TimersManager` to improve its performance according to their specific use-case. @@ -142,7 +197,7 @@ In order to use the `TimersManager` within a blocking `spin()` call, a `TimersMa For example, the current implementation executes this task through the following loop: 1. Get the time before the first timer expires. 2. Sleep for the required amount of time. - 3. Execute all ready timers. + 3. Execute or push timer events of all ready timers. 4. Repeat. Creating a new task provides the most efficient way for handling timers and it ensures that timers are executed in a timely manner, without having to wait for other entities to be processed. @@ -157,13 +212,12 @@ This has the advantage to give to the executor a more fine-grained control on wh The current implementation of the `TimersManager` uses an heap priority queue to keep the timers sorted. Whenever a timer is added or removed from the `TimersManager`, the queue is heapified again (i.e. reordered to be a valid heap). -After a timer is executed its expire time will be automatically updated, so it's necessary to provide an efficient operation for updating the root element of the priority queue, while the rest of it is still correctly ordered. +After a timer is executed (or an `ExecutorEventType::TIMER_EVENT` pushed) its expire time will be updated, so it's necessary to provide an efficient operation for updating the root element of the priority queue, while the rest of it is still correctly ordered. This is currently done using the `pop_heap()` function from std library, that has 2 log(n) complexity. Moving the timers management into its own class allows to isolate this feature from the rest of the system, allowing to develop it independently. Moreover, by separating timers execution from sorting, it is possible to extend the `TimersManager` object to use different algorithms -such as timer wheels- or to take advantage of the OS capabilities by using low level OS timers, without having to modify the executor. - ### Events Execution The simplest usage of the `EventsExecutor` consists in calling the `spin()` method which results in having the `EventsExecutor` to start the `TimersManager` task, while at the same time continuously waiting for events to be pushed into the `EventsQueue`. @@ -171,9 +225,10 @@ Events are executed in a FIFO manner, following the order in which they are push Executing an event is done by calling the corresponding API on the rclcpp object identified by the event. Let's consider a ROS 2 subscription as an example. -The event will contain the `ExecutorEventType::SUBSCRIPTION_EVENT` label and an identifier to a `rclcpp::SubscriptionBase` object, and the executor will use them to get the `rclcpp::SubscriptionBase` object that needs to be passed to the `execute_subscription()` API. +The event will contain the `ExecutorEventType::SUBSCRIPTION_EVENT` label and an identifier to a `rclcpp::SubscriptionBase` object, and the executor will use them to get the `rclcpp::SubscriptionBase` object to call its `execute_subscription()` API. -`Waitables` implement their own `execute()` API which can be called directly by the executor when a `ExecutorEventType::WAITABLE_EVENT` is received. +`Waitables` implement their own `execute()` API which can be called directly by the executor when a `ExecutorEventType::WAITABLE_EVENT` is received. The callback also receives an int identifier argument, needed because a Waitable may be composed of several distinct entities such as subscriptions, services, etc. +This implies that the provided callback can use the identifier to behave differently depending on which entity triggered the waitable to become ready. The `EventsExecutor` should allow entities to push events into the queue while other events are being processed, i.e. without blocking the producers. The current implementation achieves that by having two separate `EventsQueue`: one for storage and accumulation of events and the other for their execution, and swapping the two whenever the executor wakes up. @@ -190,7 +245,7 @@ The `EventsExecutor` design allows to easily extend the execution of events from The `EventsExecutor` should not keep ownership of the nodes and of the entities that are associated to it. -Whenever a node or a callback group are removed from the executor using the corresponding APIs (`remove_node()` and `remove_callback_group()`), the `EventsExecutor` needs to clean up the associated entities to make them stop sending events. +Whenever a node or callback group is removed from the executor using the corresponding APIs (`remove_node()` and `remove_callback_group()`), the `EventsExecutor` needs to clean up the associated entities to make them stop sending events. Entities may be eventually added back again to the same executor or to a different one and they need to be able to start again producing events. This requires that the initialization procedure that is performed when entities are added to an executor is completely reversible. @@ -198,36 +253,4 @@ The events-based approach requires particular care in handling the case where en An entity may push an event into the `EventsQueue` and then get immediately destroyed. This may happen before the `EventsExecutor` start to process those events or while it is processing them. -The current implementation addresses this problem by providing an additional function pointer to each associated entity. -This function pointer will be called whenever the entity's destructor is invoked and it will result in clearing the `EventsQueue` from any event that was generated by this entity. Note that this may block until the `EventsQueue` is done processing events. -Alternative implementations may involve the `EventsExecutor` to keep weak pointers to the entities and lock them before executing any event. - -### Open Issues - -The `EventsQueue` does not have a knowledge of QoS settings, this may cause some issues in some particular situations. - -##### Unbound growth of event queue - -As long as events are pushed into the queue, this will keep growing, regardless of the actual history size of the underlying middleware entity. -This may cause several events to accumulate, for example while the `EventsExecutor` is not spinning. - - -##### Invalid ordering corner case - -The current design may fail to provide a correct ordering of events in some corner case situations. -In particular, if an entity pushes a number of events greater than its QoS history size while the `EventsExecutor` is busy processing events, then the ordering may be compromised. - -Consider the following example of a system with two subscriptions A and B. Subscription A has a QoS history size of 1. -While the `EventsExecutor` is busy processing events, the following events accumulates into the `EventsQueue`: - - Event 1 from Subscription A - - Event 2 from Subscription B - - Event 3 from Subscription A - -When the `EventsExecutor` is ready to process these new events, it will start from the first pushed, i.e. the event 1 from Subscription A. -However, when calling the `execute_subscription()` API, the message that generated event 1 will not be available anymore as it has been overwritten from the message that generated event 3. -The `execute_subscription()` API will not fail, but rather it will process the message that generated event 3. -This violates the ordering as event 2 should have been processed before that. - - - - +The current implementation addresses this problem by keeping a list of weak pointers of entities. So before trying to execute them, a check is performed to confirm the entity hasn't expired. If has expired the weak pointer is removed from the list, otherwise the entity is executed normally. diff --git a/img/events_executor/waitset-events-queue.png b/img/events_executor/waitset-events-queue.png new file mode 100644 index 0000000000000000000000000000000000000000..ea053c1a9be71b6646df593ad823b4dc810f59a5 GIT binary patch literal 119094 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%0Df|33)`59cdji^9P$snf< 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 W)yS2=i{Lk~I>kk#g~1 Date: Thu, 18 Nov 2021 15:47:59 +0000 Subject: [PATCH 2/5] Add new line after a . Signed-off-by: Mauro Passerino --- articles/events_executor.md | 43 +++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/articles/events_executor.md b/articles/events_executor.md index 72ef4ae27..f86408a2e 100644 --- a/articles/events_executor.md +++ b/articles/events_executor.md @@ -58,7 +58,9 @@ Whenever a ROS 2 entity that is associated to the executor has work to do, it wi Then the executor can process these events in a FIFO manner, without need for expensive entities look-ups. Processing an event results in different operations depending on the entity that generated it. -Timers are monitored in a separate task by a timers manager, where they are kept in a priority queue sorted according to their expiration time. The task then has to monitor only the first element of the queue and can execute its callback as soon as it expires. The timers manager can also push timer events into the queue, instead of executing the timer. +Timers are monitored in a separate task by a timers manager, where they are kept in a priority queue sorted according to their expiration time. +The task then has to monitor only the first element of the queue and can execute its callback as soon as it expires. +The timers manager can also push timer events into the queue, instead of executing the timer. ![Overview](../img/events_executor/overview.png) @@ -66,7 +68,8 @@ Timers are monitored in a separate task by a timers manager, where they are kept ### EventsQueue The `EventsExecutor` requires that all the entities as soon as they have some work to do, they push an event into the executor's `EventsQueue`. -Events might be produced in the RMW layer, i.e. where the underlying middleware notifies the ROS 2 entity that there is new work to do, but events can also be produced in the rclcpp layer. Events are executed in the rclcpp layer by the `EventsExecutor`. +Events might be produced in the RMW layer, i.e. where the underlying middleware notifies the ROS 2 entity that there is new work to do, but events can also be produced in the rclcpp layer. +Events are executed in the rclcpp layer by the `EventsExecutor`. The event data structure that is pushed into the `EventsQueue` must contain all what is needed for the executor to be able to process that particular event. The data structure so includes the type of the entity that generated the event and a handle to its corresponding rclcpp object. @@ -78,7 +81,8 @@ Considering the entities currently available in ROS 2, the content of the event - `ExecutorEventType::WAITABLE_EVENT` and an identifier for a `rclcpp::Waitable` object plus an identifier used by the waitable to perform different actions based on it. Let's consider as an example how ROS 2 subscription are handled in the current implementation of the `EventsExecutor`. -The underlying middleware will notify the rmw_subscription object whenever a new message arrives. The rmw_subscription object will have to push an event data structure into the `EventsExecutor`'s queue. +The underlying middleware will notify the rmw_subscription object whenever a new message arrives. +The rmw_subscription object will have to push an event data structure into the `EventsExecutor`'s queue. This event data structure will contain the `ExecutorEventType::SUBSCRIPTION_EVENT` label (to denote that this event comes from a subscription) and a raw pointer to the `rclcpp::SubscriptionBase` object which will have to execute it. In the case of a `rclcpp::Waitable` object, for example if a `rclcpp_action::ServerBase` waitable has a request from a client, the rmw pushes an `ExecutorEventType::WAITABLE_EVENT` along the ID of the `rclcpp_action::ServerBase` object, but also includes the ID of the action server's `GoalService` which should be executed when the `EventsExecutor` executes the action server waitable. @@ -134,7 +138,8 @@ The `EventsExecutor` should tell the entity whether it has to immediately push o ### Types of Events queue -There are multiple uses cases with different requirements (performance, determinism in events ordering, bounded memory). A single `EventsQueue` can't comply with all requirements simultaneously, so there's need for different types of queue. +There are multiple uses cases with different requirements (performance, determinism in events ordering, bounded memory). +A single `EventsQueue` can't comply with all requirements simultaneously, so there's need for different types of queue. ##### SimpleEventsQueue @@ -146,7 +151,8 @@ This may cause several events to accumulate, for example while the `EventsExecut This queue may fail to provide a correct ordering of events in some corner case situations. In particular, if an entity pushes a number of events greater than its QoS history size while the `EventsExecutor` is busy processing events, then the ordering may be compromised. -Consider the following example of a system with two subscriptions A and B. Subscription A has a QoS history size of 1. +Consider the following example of a system with two subscriptions A and B. +Subscription A has a QoS history size of 1. While the `EventsExecutor` is busy processing events, the following events accumulates into the `EventsQueue`: - Event 1 from Subscription A - Event 2 from Subscription B @@ -163,23 +169,28 @@ This queue is equivalent to the `SimpleEventsQueue` with the difference that is ##### BoundedEventsQueue -This queue doesn't allow more events from an entity than its history size. For example a subscription with a history size of 5, can't have more than 5 events from it in the queue. +This queue doesn't allow more events from an entity than its history size. +For example a subscription with a history size of 5, can't have more than 5 events from it in the queue. -This queue has policies to decide what to do when a new event arrives from an entity which will exceed the amount of events allowed. It can remove the oldest event and push a new one, which keeps the relative time ordering of the event with respect to other events (at the cost of some CPU time), or it can directly avoid pushing the new event into the queue, saving CPU but subverting the time ordering of events. +This queue has policies to decide what to do when a new event arrives from an entity which will exceed the amount of events allowed. +It can remove the oldest event and push a new one, which keeps the relative time ordering of the event with respect to other events (at the cost of some CPU time), or it can directly avoid pushing the new event into the queue, saving CPU but subverting the time ordering of events. ##### WaitSetEventsQueue This queue has a waitset-like behaviour: There's a single entry for each entity, and the order of events execution is the same as the `SingleThreadedExecutor` executor. If the `TimersManager` is configured to push timer events, timers will be executed in the same thread as other entities, as it happens also with the current default executor. -The difference with respect to the waitset used in the `SingleThreadedExecutor` is that only entities which have work to do are present in the waitset. This way we avoid polling entities in search of new data to process. +The difference with respect to the waitset used in the `SingleThreadedExecutor` is that only entities which have work to do are present in the waitset. +This way we avoid polling entities in search of new data to process. Also this reduces the time to look for existing elements in the waitset (to update their events counter) as there are less elements to iterate. The events from a single entity are represented by a single event and counter, specifying the number of events left to execute from this entity (as oposed to other EventsQueue which can have multiple events). -The waitset has elements ordered by entity tipe: 1.Timers / 2.Subs / 3.Services / 4.Clients / 5.Waitables. An iterator points to the next event to dequeue, so the order of execution of entities is the same as of the `SingleThreadedExecutor`. +The waitset has elements ordered by entity tipe: 1.Timers / 2.Subs / 3.Services / 4.Clients / 5.Waitables. +An iterator points to the next event to dequeue, so the order of execution of entities is the same as of the `SingleThreadedExecutor`. -The waitset is internally divided in lists of events by entity tipe: Timers / Subs / Services / Clients / Waitables. This makes easy to add a new event to where it belongs, otherwise, some logic is needed to locate the event in the correct position to maintain the desired order of events to execute. +The waitset is internally divided in lists of events by entity tipe: Timers / Subs / Services / Clients / Waitables. +This makes easy to add a new event to where it belongs, otherwise, some logic is needed to locate the event in the correct position to maintain the desired order of events to execute. ![Overview](../img/events_executor/waitset-events-queue.png) @@ -193,7 +204,8 @@ It should respect the following specification: - The `TimersManager` need to support all the modes of a ROS 2 executor (i.e. `spin()`, `spin_some()`, etc). - Users should be able to extend the `TimersManager` to improve its performance according to their specific use-case. -In order to use the `TimersManager` within a blocking `spin()` call, a `TimersManager` task is started. This task will continuously execute timers and sleep until the next timer is ready as long as the executor is still spinning. +In order to use the `TimersManager` within a blocking `spin()` call, a `TimersManager` task is started. +This task will continuously execute timers and sleep until the next timer is ready as long as the executor is still spinning. For example, the current implementation executes this task through the following loop: 1. Get the time before the first timer expires. 2. Sleep for the required amount of time. @@ -215,7 +227,7 @@ Whenever a timer is added or removed from the `TimersManager`, the queue is heap After a timer is executed (or an `ExecutorEventType::TIMER_EVENT` pushed) its expire time will be updated, so it's necessary to provide an efficient operation for updating the root element of the priority queue, while the rest of it is still correctly ordered. This is currently done using the `pop_heap()` function from std library, that has 2 log(n) complexity. -Moving the timers management into its own class allows to isolate this feature from the rest of the system, allowing to develop it independently. +Moving the timers management into its own class allows to isolate this feature from the rest of the system, allowing to develop it independently. Moreover, by separating timers execution from sorting, it is possible to extend the `TimersManager` object to use different algorithms -such as timer wheels- or to take advantage of the OS capabilities by using low level OS timers, without having to modify the executor. ### Events Execution @@ -227,7 +239,8 @@ Executing an event is done by calling the corresponding API on the rclcpp object Let's consider a ROS 2 subscription as an example. The event will contain the `ExecutorEventType::SUBSCRIPTION_EVENT` label and an identifier to a `rclcpp::SubscriptionBase` object, and the executor will use them to get the `rclcpp::SubscriptionBase` object to call its `execute_subscription()` API. -`Waitables` implement their own `execute()` API which can be called directly by the executor when a `ExecutorEventType::WAITABLE_EVENT` is received. The callback also receives an int identifier argument, needed because a Waitable may be composed of several distinct entities such as subscriptions, services, etc. +`Waitables` implement their own `execute()` API which can be called directly by the executor when a `ExecutorEventType::WAITABLE_EVENT` is received. +The callback also receives an int identifier argument, needed because a Waitable may be composed of several distinct entities such as subscriptions, services, etc. This implies that the provided callback can use the identifier to behave differently depending on which entity triggered the waitable to become ready. The `EventsExecutor` should allow entities to push events into the queue while other events are being processed, i.e. without blocking the producers. @@ -253,4 +266,6 @@ The events-based approach requires particular care in handling the case where en An entity may push an event into the `EventsQueue` and then get immediately destroyed. This may happen before the `EventsExecutor` start to process those events or while it is processing them. -The current implementation addresses this problem by keeping a list of weak pointers of entities. So before trying to execute them, a check is performed to confirm the entity hasn't expired. If has expired the weak pointer is removed from the list, otherwise the entity is executed normally. +The current implementation addresses this problem by keeping a list of weak pointers of entities. +So before trying to execute them, a check is performed to confirm the entity hasn't expired. +If has expired the weak pointer is removed from the list, otherwise the entity is executed normally. From 4477e460ea3a85619d2ae3d8cf06784c4b6d8028 Mon Sep 17 00:00:00 2001 From: Mauro Passerino Date: Thu, 18 Nov 2021 15:54:48 +0000 Subject: [PATCH 3/5] Add EventsQueue abstract class info Signed-off-by: Mauro Passerino --- articles/events_executor.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/articles/events_executor.md b/articles/events_executor.md index f86408a2e..e87bb727f 100644 --- a/articles/events_executor.md +++ b/articles/events_executor.md @@ -138,8 +138,15 @@ The `EventsExecutor` should tell the entity whether it has to immediately push o ### Types of Events queue +##### EventsQueue abstract class + There are multiple uses cases with different requirements (performance, determinism in events ordering, bounded memory). A single `EventsQueue` can't comply with all requirements simultaneously, so there's need for different types of queue. +We want all queues to use the same APIs (to be able to use them interchangeably), so we created an abstract class `EventsQueue`. +This abstract class can be used to implement different types of queues where `ExecutorEvent`s can be stored. +The derived classes should choose which underlying container to use and the strategy for pushing and popping events. +For example a queue implementation may be bounded or unbounded and have different pruning strategies. +Implementations may or may not check the validity of events and decide how to handle the situation where an event is not valid anymore (e.g. a subscription history cache overruns). ##### SimpleEventsQueue From 0d70bf2a6147a12e05297aa27c5031e3c5c6634e Mon Sep 17 00:00:00 2001 From: Mauro Passerino Date: Thu, 18 Nov 2021 17:15:45 +0000 Subject: [PATCH 4/5] Update design Signed-off-by: Mauro Passerino --- articles/events_executor.md | 54 ++++++++++++------------------------- 1 file changed, 17 insertions(+), 37 deletions(-) diff --git a/articles/events_executor.md b/articles/events_executor.md index e87bb727f..be8fde792 100644 --- a/articles/events_executor.md +++ b/articles/events_executor.md @@ -136,43 +136,30 @@ This class will forward the items needed for pushing events to the notify guard Whenever an entity is associated to an executor it may already have multiple items of work ready to be processed. The `EventsExecutor` should tell the entity whether it has to immediately push or to discard those pending events. -### Types of Events queue ##### EventsQueue abstract class There are multiple uses cases with different requirements (performance, determinism in events ordering, bounded memory). A single `EventsQueue` can't comply with all requirements simultaneously, so there's need for different types of queue. -We want all queues to use the same APIs (to be able to use them interchangeably), so we created an abstract class `EventsQueue`. -This abstract class can be used to implement different types of queues where `ExecutorEvent`s can be stored. +We want all queues to use the same APIs to be able to use them interchangeably, so we created an abstract class `EventsQueue` which can be derived to implement different types of queues where `ExecutorEvent`s can be stored. The derived classes should choose which underlying container to use and the strategy for pushing and popping events. -For example a queue implementation may be bounded or unbounded and have different pruning strategies. -Implementations may or may not check the validity of events and decide how to handle the situation where an event is not valid anymore (e.g. a subscription history cache overruns). - -##### SimpleEventsQueue -This is the simplest queue, as it does not peform any checks when events are pushed or extracted, so it's more suitable for situacions where CPU performance is needed. +The EventsQueue abstract class has generic queue APIs like `enqueue()`, `dequeue()`, `empty()`, `size ()` and an `init()` API needed for some specific implementations. -As long as events are pushed into the queue it will keep growing, regardless of the actual history size of the underlying middleware entity. -This may cause several events to accumulate, for example while the `EventsExecutor` is not spinning, which can lead to out-of-memory situations or subverting the ordering of events. +##### Types of Events queue -This queue may fail to provide a correct ordering of events in some corner case situations. -In particular, if an entity pushes a number of events greater than its QoS history size while the `EventsExecutor` is busy processing events, then the ordering may be compromised. +A queue implementation may be bounded or unbounded and have different pruning strategies. +Implementations may or may not check the validity of events and decide how to handle the situation where an event is not valid anymore (e.g. a subscription history cache overruns). +Here we present some possible type of queues that could be implemented. -Consider the following example of a system with two subscriptions A and B. -Subscription A has a QoS history size of 1. -While the `EventsExecutor` is busy processing events, the following events accumulates into the `EventsQueue`: - - Event 1 from Subscription A - - Event 2 from Subscription B - - Event 3 from Subscription A +##### SimpleEventsQueue -When the `EventsExecutor` is ready to process these new events, it will start from the first pushed, i.e. the event 1 from Subscription A. -However, when calling the `execute_subscription()` API, the message that generated event 1 will not be available anymore as it has been overwritten from the message that generated event 3. -The `execute_subscription()` API will not fail, but rather it will process the message that generated event 3. -This violates the ordering as event 2 should have been processed before that. +This is the simplest queue, just a wrapper around the std::queue. +It does not peform any checks when events are pushed or extracted, so it's more suitable for situacions where CPU performance is needed. -##### LockFreeEventsQueue +As multiple threads can push events into the queue, a locking mechanism is needed. As an alternative, a lock free queue can be implemented. -This queue is equivalent to the `SimpleEventsQueue` with the difference that is lock free, which improves performance reducing times needed to enqueue/dequeue events from it. +This queue has the disadvantage of not being bounded, so its use should be avoided. ##### BoundedEventsQueue @@ -180,24 +167,17 @@ This queue doesn't allow more events from an entity than its history size. For example a subscription with a history size of 5, can't have more than 5 events from it in the queue. This queue has policies to decide what to do when a new event arrives from an entity which will exceed the amount of events allowed. -It can remove the oldest event and push a new one, which keeps the relative time ordering of the event with respect to other events (at the cost of some CPU time), or it can directly avoid pushing the new event into the queue, saving CPU but subverting the time ordering of events. +For example, it can remove the oldest event and push a new one, keeping this way the time ordering of the event with respect to other events (at the cost of some CPU time), or it can directly avoid pushing the new event into the queue, saving CPU but subverting the time ordering of events. ##### WaitSetEventsQueue -This queue has a waitset-like behaviour: There's a single entry for each entity, and the order of events execution is the same as the `SingleThreadedExecutor` executor. -If the `TimersManager` is configured to push timer events, timers will be executed in the same thread as other entities, as it happens also with the current default executor. - -The difference with respect to the waitset used in the `SingleThreadedExecutor` is that only entities which have work to do are present in the waitset. -This way we avoid polling entities in search of new data to process. -Also this reduces the time to look for existing elements in the waitset (to update their events counter) as there are less elements to iterate. - -The events from a single entity are represented by a single event and counter, specifying the number of events left to execute from this entity (as oposed to other EventsQueue which can have multiple events). +This queue is similar to a waitset, in the way that each entity occupies a single element of the queue regardless of the amount of events to process, so there's little risk of this queue to grow unbounded. -The waitset has elements ordered by entity tipe: 1.Timers / 2.Subs / 3.Services / 4.Clients / 5.Waitables. -An iterator points to the next event to dequeue, so the order of execution of entities is the same as of the `SingleThreadedExecutor`. +Entity events are represented by the entity ID and a counter, specifying the number of events left to execute. +This counter is bounded by the history size (QoS depth) of the entity. -The waitset is internally divided in lists of events by entity tipe: Timers / Subs / Services / Clients / Waitables. -This makes easy to add a new event to where it belongs, otherwise, some logic is needed to locate the event in the correct position to maintain the desired order of events to execute. +The difference with respect to the `rclcpp::WaitSet` is that only entities which have work to do are present in the queue, avoiding this way polling entities in search of new data to process. +This also reduces the time to look for existing elements, as there are less elements to iterate. ![Overview](../img/events_executor/waitset-events-queue.png) From eb635636192b11ee1e34ff9b769d6f581e603ea5 Mon Sep 17 00:00:00 2001 From: Alberto Soragna Date: Fri, 19 Nov 2021 12:41:48 +0000 Subject: [PATCH 5/5] update design page Signed-off-by: Alberto Soragna --- articles/events_executor.md | 160 ++++++++++++++++++------------------ 1 file changed, 82 insertions(+), 78 deletions(-) diff --git a/articles/events_executor.md b/articles/events_executor.md index be8fde792..e05c9d4e0 100644 --- a/articles/events_executor.md +++ b/articles/events_executor.md @@ -24,7 +24,7 @@ Many articles have discussed the CPU overhead of the default ROS 2 executor the - [SingleThreadedExecutor creates a high CPU overhead in ROS 2](https://discourse.ros.org/t/singlethreadedexecutor-creates-a-high-cpu-overhead-in-ros-2/10077) - [ROS 2 Middleware Change Proposal](https://discourse.ros.org/t/ros2-middleware-change-proposal/15863) -We can identify some major contributors to this overhead: +Some major contributors to this overhead can be identified: - The cost of modifying and updating waitsets. Currently this operation happens multiple times for every iteration of the executor, even if the majority of robotics systems are mostly static, i.e. the number of ROS 2 entities is fixed and known at startup. A detailed walk-through of the waitset management process can be found [here](https://discourse.ros.org/t/ros2-middleware-change-proposal/15863/6). @@ -46,144 +46,146 @@ The following requirements have been taken account for the design of a new ROS 2 ## The Events Executor -In order to address the aforementioned requirements, we designed the so-called `EventsExecutor`. +The so-called `EventsExecutor` class has been designed in order to address the aforementioned requirements. The `EventsExecutor` inherits from the base `Executor` class. -The main difference between this and the other executor implementations is that the `EventsExecutor` does not use the concept of a waitset. -The `EventsExecutor` is characterized by two main components, i.e. the `EventsQueue` and the `TimersManager`. +However it is inherently different from the previous executor implementations (e.g. the `SingleThreadedExecutor`, the `MultiThreadedExecutor` and the `StaticSingleThreadedExecutor`). +All these executor classes indeed rely on abstractions of the DDS waitsets in order to be notified when entities have work to do. +On the other hand, the `EventsExecutor` uses a completely separate approach, i.e. the DDS listener APIs (see for example [fast-dds documentation](https://fast-dds.docs.eprosima.com/en/latest/fastdds/dds_layer/subscriber/dataReaderListener/dataReaderListener.html)). +Note that the `EventsExecutor` is only one of the possible execution classes that could be built on top of the aforementioned APIs. ### Brief Overview -In order to execute generic ROS 2 entities, the `EventsExecutor` relies on an event queue. +In order to execute ROS 2 entities, the `EventsExecutor` relies on an events queue. Whenever a ROS 2 entity that is associated to the executor has work to do, it will push an event into the executor's queue. -Then the executor can process these events in a FIFO manner, without need for expensive entities look-ups. -Processing an event results in different operations depending on the entity that generated it. +For DDS-based entities (e.g. `rclcpp::Subscription`, `rclcpp::Service`, etc.), events will be pushed by properly set DDS listener callbacks. +Timers are handled differently, using a dedicated `TimersManager` component that will be described in details in the rest of this document. -Timers are monitored in a separate task by a timers manager, where they are kept in a priority queue sorted according to their expiration time. -The task then has to monitor only the first element of the queue and can execute its callback as soon as it expires. -The timers manager can also push timer events into the queue, instead of executing the timer. +Then the executor can extract the events from the queue and process them. +Processing an event results in different operations depending on the entity that generated it. ![Overview](../img/events_executor/overview.png) +## ExecutorEvent -### EventsQueue +The `EventsExecutor` requires that all the entities as soon as they have some work to do, they push an `ExecutorEvent` into the executor's `EventsQueue`. +Events might be produced in the RMW layer, i.e. where the underlying middleware notifies the ROS 2 entity that there is new work to do, but events can also be produced in the rclcpp layer or by the application itself. +Regardless of their origin, events are executed by the `EventsExecutor` in its context. -The `EventsExecutor` requires that all the entities as soon as they have some work to do, they push an event into the executor's `EventsQueue`. -Events might be produced in the RMW layer, i.e. where the underlying middleware notifies the ROS 2 entity that there is new work to do, but events can also be produced in the rclcpp layer. -Events are executed in the rclcpp layer by the `EventsExecutor`. -The event data structure that is pushed into the `EventsQueue` must contain all what is needed for the executor to be able to process that particular event. -The data structure so includes the type of the entity that generated the event and a handle to its corresponding rclcpp object. +Being this implementation an events-queue, rather than a data-queue, the `ExecutorEvent` data structures do not contain the actual data received, but rather they contain all what is needed for the executor to be able to process that particular event. +In practice this means that `ExecutorEvent` data structures include identifiers to the rclcpp object that should process the generated event. -Considering the entities currently available in ROS 2, the content of the event data structure can be any of the following: +Considering the entities currently available in ROS 2, the content of the `ExecutorEvent` event data structure can be any of the following: - `ExecutorEventType::SUBSCRIPTION_EVENT` and an identifier for a `rclcpp::SubscriptionBase` object. - `ExecutorEventType::SERVICE_EVENT` and an identifier for a `rclcpp::ServiceBase` object. - `ExecutorEventType::CLIENT_EVENT` and an identifier for a `rclcpp::ClientBase` object. - `ExecutorEventType::TIMER_EVENT` and an identifier for a `rclcpp::TimerBase` object. - - `ExecutorEventType::WAITABLE_EVENT` and an identifier for a `rclcpp::Waitable` object plus an identifier used by the waitable to perform different actions based on it. + - `ExecutorEventType::WAITABLE_EVENT` and an identifier for a `rclcpp::Waitable` object. Let's consider as an example how ROS 2 subscription are handled in the current implementation of the `EventsExecutor`. The underlying middleware will notify the rmw_subscription object whenever a new message arrives. The rmw_subscription object will have to push an event data structure into the `EventsExecutor`'s queue. -This event data structure will contain the `ExecutorEventType::SUBSCRIPTION_EVENT` label (to denote that this event comes from a subscription) and a raw pointer to the `rclcpp::SubscriptionBase` object which will have to execute it. +This event data structure will contain the `ExecutorEventType::SUBSCRIPTION_EVENT` label (to denote that this event comes from a subscription) and an identifier to the `rclcpp::SubscriptionBase` object which will have to execute it. -In the case of a `rclcpp::Waitable` object, for example if a `rclcpp_action::ServerBase` waitable has a request from a client, the rmw pushes an `ExecutorEventType::WAITABLE_EVENT` along the ID of the `rclcpp_action::ServerBase` object, but also includes the ID of the action server's `GoalService` which should be executed when the `EventsExecutor` executes the action server waitable. +Note that `ExecutorEvent` generated by waitables are slightly different. +Indeed waitables can potentially wrap multiple DDS entities and need to know which one generated an event in order to process it. +So, in the case of an entity which derives from `rclcpp::Waitable`, for example a `rclcpp_action::ServerBase` which has a request from a client, the rmw pushes an `ExecutorEventType::WAITABLE_EVENT` along with the ID of the `rclcpp_action::ServerBase` object, but also includes the ID of the action server's `GoalService` which should be executed when the `EventsExecutor` executes the action server waitable. -It is responsibility of the `EventsExecutor` to setup entities such that they can push such events. +## Pushing ExecutorEvent -An application can add ROS 2 nodes or callback groups to an `EventsExecutor` using the corresponding APIs (`add_node()` and `add_callback_group()`). +It is responsibility of the `EventsExecutor` to setup entities such that they can push `ExecutorEvent`s. + +An application can add ROS 2 nodes or callback groups to an `EventsExecutor` using the corresponding APIs (e.g. `add_node()` and `add_callback_group()`). Added nodes and callback groups are inspected in order to find all the existing ROS 2 entities that have to be associated with the executor. Whenever new entities are associated to the `EventsExecutor` an initialization procedure takes place, with the purpose of provisioning those entities with a way for pushing events. -This consists in passing the following items from the rclcpp layer to the rmw layer: - - The `EventsExecutorCallback`, a function pointer that can be used to push events. - - The identifier of the rclcpp entity. +In simple terms, the initialization procedure simply consists in passing a function pointer to the entity. +The function will have no return type and it will take as input the number of events that should be pushed. The initialization procedure presents some small variations depending on the type of the entity: ##### Client/Server/Subscription These entities have a 1-to-1 correspondence between objects in the rclcpp and the rmw layer. -The initialization is straight forward and consists in having the `EventsExecutor` to pass the aforementioned items to the rclcpp subscription, which then will forward them to rcl and finally to rmw. +The initialization is straight forward and it entirely relies on setting the aforementioned function pointer as a DDS listener function. ##### Waitable -`Waitables` are a concept that exists only in the rclcpp layer. -Each class that inherits from `Waitable` will have to define its own function for forwarding items to the rmw layer. -For example, a `SubscriptionIntraProcess` relies on a guard condition in the rmw layer, so it will forward to it the items needed for pushing events. +`Waitables` are a concept that exists only in the rclcpp layer and that is used to implement a wide variety of different entities. +Because of this, it is not possible to define a common way for pushing events. +Each class that inherits from `rclcpp::Waitable` and that wants to be used with the `EventsExecutor` will have to define its own function for doing so. +For example, a `rclcpp::SubscriptionIntraProcess`, which relies on a guard condition and it's entirely managed in the rclcpp layer, will be able to directly push events. On the other hand, a `QOSEventHandler` will forward the aforementioned items to the underlying rmw QoSEvent implementation. Note that `Waitables` can be used as a way to implement generic custom events, as it will be described in the next sections. ##### Timer -The `TimersManager` object can either push timer events into the `EventsExecutor`'s `EventsQueue` or execute them directly when they are ready. - ----- +As mentioned before, when used in an `EventsExecutor`, timers are managed by a `TimersManager` object. +The `TimersManager` is owned by the `EventsExecutor` and it has access to the `EventsQueue`. +So, whenever a timer is ready, it can push the corresponding events there. -The aforementioned entities are initialized as soon as their node or callback group is added to the `EventsExecutor`. -However, there are also other entities which can push events and that are not related to any node. +## EventsQueue -##### EventsExecutorNotifyWaitable +The `EventsQueue` class is responsible for storing events and providing them to the `EventsExecutor`. +This is a critical component and, depending on its implementation, it is possible to obtain very different execution models. +Due to the presence of very different use-cases in the robotics domain, each with their own requirements and priorities, a single `EventsQueue` class wouldn't be able to efficiently support all of them. -The `EventsExecutorNotifyWaitable` derives from `Waitable` and is used by the `EventsExecutor` to receive an event whenever any of the context interrupt guard condition (e.g. ctrl-c) or the own executor interrupt guard condition are triggered. -This can be achieved by having this class to implement a function that forwards the items needed for pushing events to two distinct rmw guard condition objects. +Because of this, the `EventsExecutor` provides only an `EventsQueue` interface class. +This is a very simple interface and it includes the standard operations that can be found in generic STL containers. +The only addition is an `init()` API which will allow the `EventsQueue` to access some internal details of the `EventsExecutor` if needed. -##### EventsExecutorEntitiesCollector +The `rclcpp` library will provide only few examples of simple `EventsQueue` implementations, while allowing developers to define their own classes as part of their applications. +This is achieved by having the `EventsQueue` object be created in the application and then being passed to the `EventsExecutor` constructor as an argument. -The `EventsExecutorEntitiesCollector` derives from `Waitable` and it is used by the `EventsExecutor` to setup entities that are added to nodes or callback groups while it is spinning. -This class will forward the items needed for pushing events to the notify guard condition of each of the nodes associated with the executor. +In the following sections, some simple examples of `EventsQueue` implementations will be described. +These will focus on showing what are some common storing and pruning strategies. +All these implementation use standard STL containers under the hood, but developers are invited to follow these examples and use more advanced data-structures to improve performance. ----- +It is important to note that all the queue implementations described here lead to overall better performance than the existing executors. -Whenever an entity is associated to an executor it may already have multiple items of work ready to be processed. -The `EventsExecutor` should tell the entity whether it has to immediately push or to discard those pending events. - - -##### EventsQueue abstract class +##### SimpleEventsQueue -There are multiple uses cases with different requirements (performance, determinism in events ordering, bounded memory). -A single `EventsQueue` can't comply with all requirements simultaneously, so there's need for different types of queue. -We want all queues to use the same APIs to be able to use them interchangeably, so we created an abstract class `EventsQueue` which can be derived to implement different types of queues where `ExecutorEvent`s can be stored. -The derived classes should choose which underlying container to use and the strategy for pushing and popping events. +This is the simplest possible `EventsQueue` implementation and it is just a wrapper around the `std::queue` with the addition of `std::mutex` for thread safety. +It does not use any information about the entities producing the events, for the sake of simplicity. -The EventsQueue abstract class has generic queue APIs like `enqueue()`, `dequeue()`, `empty()`, `size ()` and an `init()` API needed for some specific implementations. +When new events are pushed, they are immediately added to the underlying queue. +Events will be extracted only when the `EventsExecutor` takes them. -##### Types of Events queue +Due to its simplicity and lack of any book-keeping mechanism, this implementation is very efficient. +However, it will grow unbounded if the `EventsExecutor` is not spinning or if events are being pushed faster than they are processed. -A queue implementation may be bounded or unbounded and have different pruning strategies. -Implementations may or may not check the validity of events and decide how to handle the situation where an event is not valid anymore (e.g. a subscription history cache overruns). -Here we present some possible type of queues that could be implemented. +As long as the number of events in the queue produced by each entity does not exceed the entity history QoS, this very simple queue also guarantees that events are processed in the same order as they were produced. -##### SimpleEventsQueue +##### BoundedEventsQueue -This is the simplest queue, just a wrapper around the std::queue. -It does not peform any checks when events are pushed or extracted, so it's more suitable for situacions where CPU performance is needed. +This queue is an extension of the `SimpleEventsQueue` which provides access to different policies to prevent the unbounded growth. -As multiple threads can push events into the queue, a locking mechanism is needed. As an alternative, a lock free queue can be implemented. +Whenever a new `ExecutorEvent` is pushed, different conditions and recovery actions will be adopted depending on the chosen policy. + - `NotBounded`: nothing will happen. + The behavior of the queue is identical to the `SimpleEventsQueue` described before. + - `BoundedNoTimeOrdering`: the event will be pushed only if the maximum number of events for this entity has not been reached. + If an entity has a QoS history size of 10, this means avoid pushing an 11th event into the queue. + Note that, not pushing the event does not result in losing data, but rather it only affects the order of execution. + - `BoundedWithTimeOrdering`: an event is always pushed, but, if the maximum number of events for this entity has been reached, the oldest event for this entity will also be removed. -This queue has the disadvantage of not being bounded, so its use should be avoided. +It is easy to notice how the different policies perform various trade-off between performance (CPU time) and correctness. -##### BoundedEventsQueue +##### WaitSetEventsQueue -This queue doesn't allow more events from an entity than its history size. -For example a subscription with a history size of 5, can't have more than 5 events from it in the queue. +This queue is meant to provide the same execution model of waitset-based executors, while at the same time maintaining some of the improvements of the `EventsExecutor` approach. -This queue has policies to decide what to do when a new event arrives from an entity which will exceed the amount of events allowed. -For example, it can remove the oldest event and push a new one, keeping this way the time ordering of the event with respect to other events (at the cost of some CPU time), or it can directly avoid pushing the new event into the queue, saving CPU but subverting the time ordering of events. +Similarly to a waitset, this approach is bounded and entities are executed in a fixed and predetermined order, rather than depending on the chronological order of events. -##### WaitSetEventsQueue - -This queue is similar to a waitset, in the way that each entity occupies a single element of the queue regardless of the amount of events to process, so there's little risk of this queue to grow unbounded. +This `EventsQueue` implementation does not rely on an abstraction of the DDS waitset, but rather it uses the same notification mechanism as other queues. +Moreover, only entities which have work to do are present in the queue, avoiding to pay performance for polling entities that are not ready. Entity events are represented by the entity ID and a counter, specifying the number of events left to execute. This counter is bounded by the history size (QoS depth) of the entity. -The difference with respect to the `rclcpp::WaitSet` is that only entities which have work to do are present in the queue, avoiding this way polling entities in search of new data to process. -This also reduces the time to look for existing elements, as there are less elements to iterate. - ![Overview](../img/events_executor/waitset-events-queue.png) ### TimersManager -The `TimersManager` is a class that allows to monitor timers and execute them or push timer events. +The `TimersManager` is a class that allows to monitor timers. It should respect the following specification: - Timers are dynamic and they can be added or removed while the `TimersManager` is running. - The `TimersManager` should support both executing a timer or push a `ExecutorEventType::TIMER_EVENT` with the ID of the `rclcpp::TimerBase` when ready. @@ -191,16 +193,18 @@ It should respect the following specification: - The `TimersManager` need to support all the modes of a ROS 2 executor (i.e. `spin()`, `spin_some()`, etc). - Users should be able to extend the `TimersManager` to improve its performance according to their specific use-case. +It's important to note that the `TimersManager` can be configured to either push events into the queue when a timer is ready or rather to execute it directly from its own context. + In order to use the `TimersManager` within a blocking `spin()` call, a `TimersManager` task is started. -This task will continuously execute timers and sleep until the next timer is ready as long as the executor is still spinning. +This task will continuously monitor timers and sleep until the next timer is ready as long as the executor is still spinning. For example, the current implementation executes this task through the following loop: 1. Get the time before the first timer expires. 2. Sleep for the required amount of time. 3. Execute or push timer events of all ready timers. 4. Repeat. -Creating a new task provides the most efficient way for handling timers and it ensures that timers are executed in a timely manner, without having to wait for other entities to be processed. -However, this may not be compatible with the non-blocking variants of `spin()`. +Creating a new task and executing timers there provides the most efficient way for handling timers and it ensures that timers are executed in a timely manner, without having to wait for other entities to be processed. +However, this may not be compatible with all use-cases or with the non-blocking variants of `spin()`. To implement these variants, the following APIs are exposed: - `get_head_timeout()` which returns the time before the first timer expires. - `execute_head_timer()` which execute the first timer if it's ready. @@ -211,7 +215,7 @@ This has the advantage to give to the executor a more fine-grained control on wh The current implementation of the `TimersManager` uses an heap priority queue to keep the timers sorted. Whenever a timer is added or removed from the `TimersManager`, the queue is heapified again (i.e. reordered to be a valid heap). -After a timer is executed (or an `ExecutorEventType::TIMER_EVENT` pushed) its expire time will be updated, so it's necessary to provide an efficient operation for updating the root element of the priority queue, while the rest of it is still correctly ordered. +After a timer is executed (or an `ExecutorEventType::TIMER_EVENT` is pushed) its expire time will be updated, so it's necessary to provide an efficient operation for updating the root element of the priority queue, while the rest of it is still correctly ordered. This is currently done using the `pop_heap()` function from std library, that has 2 log(n) complexity. Moving the timers management into its own class allows to isolate this feature from the rest of the system, allowing to develop it independently. @@ -227,7 +231,7 @@ Let's consider a ROS 2 subscription as an example. The event will contain the `ExecutorEventType::SUBSCRIPTION_EVENT` label and an identifier to a `rclcpp::SubscriptionBase` object, and the executor will use them to get the `rclcpp::SubscriptionBase` object to call its `execute_subscription()` API. `Waitables` implement their own `execute()` API which can be called directly by the executor when a `ExecutorEventType::WAITABLE_EVENT` is received. -The callback also receives an int identifier argument, needed because a Waitable may be composed of several distinct entities such as subscriptions, services, etc. +The callback also receives an identifier argument, needed because a Waitable may be composed of several distinct entities such as subscriptions, services, etc. This implies that the provided callback can use the identifier to behave differently depending on which entity triggered the waitable to become ready. The `EventsExecutor` should allow entities to push events into the queue while other events are being processed, i.e. without blocking the producers. @@ -255,4 +259,4 @@ This may happen before the `EventsExecutor` start to process those events or whi The current implementation addresses this problem by keeping a list of weak pointers of entities. So before trying to execute them, a check is performed to confirm the entity hasn't expired. -If has expired the weak pointer is removed from the list, otherwise the entity is executed normally. +If the weak pointer has expired, then it is removed from the list, otherwise the entity is executed normally.