[LEDE-DEV] [PATCH 2/3] ubusd: make `tx_queue` backlog dynamic
Felix Fietkau
nbd at nbd.name
Wed Jun 7 06:44:17 PDT 2017
On 2017-06-07 13:09, Alexandru Ardelean wrote:
> It's not very often that the tx_queue is used,
> to store backlog messages to send to a client.
>
> And for most cases, 32 backlog messages seems to be enough.
> In fact, for most cases, I've seen ~1 entry in the queue
> being used every now-n-then.
>
> The issue is more visible/present with the `ubus list` command.
> I've traced the code to ubusd_handle_lookup() in:
>
> ```
> if (!attr[UBUS_ATTR_OBJPATH]) {
> avl_for_each_element(&path, obj, path)
> ubusd_send_obj(cl, ub, obj);
> return 0;
> }
> ```
> The code-path eventually leads to `ubus_msg_send()`.
> It seems that once the first element is queued, then
> the condition check for `(!cl->tx_queue[cl->txq_cur])`
> will queue all messages iterated in the above snippet,
> without trying any writes.
>
> This can be solved, either by making the queue dynamic
> and allow it to expand above the current fixed limit (1).
>
> Or, by forcing/allowing writes during the tx_queue-ing (2).
>
> This patch implements (1).
>
> Signed-off-by: Alexandru Ardelean <ardeleanalex at gmail.com>
If I remember correctly, I chose the backlog array because a message can
be referenced multiple times (e.g. in the notify/subscribe case).
This would break in your linked-list implementation if a message needs
to be queued for multiple clients.
- Felix
More information about the Lede-dev
mailing list