[dpdk-dev] [PATCH v5 00/13] introduce telemetry library
Mattias Rönnblom
mattias.ronnblom at ericsson.com
Mon Oct 22 09:11:18 CEST 2018
On 2018-10-19 12:16, Laatz, Kevin wrote:
> On 03/10/2018 20:06, Mattias Rönnblom wrote:
>> On 2018-10-03 19:36, Kevin Laatz wrote:
>>> From: Ciara Power <ciara.power at intel.com>
>>> +
>>> + if (!telemetry->request_client) {
>>> + TELEMETRY_LOG_ERR("No client has been chosen to write to");
>>> + return -1;
>>> + } > +
>>> + if (!json_string) {
>>> + TELEMETRY_LOG_ERR("Invalid JSON string!");
>>> + return -1;
>>> + }
>>> +
>>> + ret = send(telemetry->request_client->fd,
>>> + json_string, strlen(json_string), 0);
>>
>> How would this code handle a partial success (as in, for example, half
>> of the string fits the socket buffer)? In not, maybe switching over to
>> a SOCK_SEQPACKET AF_UNIX socket would be the best way around it.
>>
> Is the suggestion here simply to use socket(AF_UNIX, SOCK_SEQPACKET)
> instead of (AF_UNIX, SOCK_STREAM) ?
That would be the most straight-forward to the problem, I think. Linux'
SOCK_SEQPACKET implementation has problems with really large messages
(since a per-message linear buffer is allocated), but I'm guessing these
messages are not in the hundreds-of-kb range.
>>
>>> +
>>> + buffer_read = read(telemetry->accept_fd, buf, BUF_SIZE-1);
>>
>> This and the below code seem to assume that read() returns one and
>> only one message, but on a SOCK_STREAM, there is no such thing as a
>> message. It's a byte stream, and you need to provide your own framing,
>> or have an application protocol which allows only have one outstanding
>> request. If you do the latter, you still need to allow for "short"
>> (partial) read()s (i.e. re-read() until done).
>>
> Will the above solve this part of the problem too?
>
Yes. The kernel will delivered the application (at most) one message, in
its entirety.
More information about the dev
mailing list