[dpdk-dev] [PATCH v2 1/1] fbarray: get fbarrays from containerized secondary

Yasufumi Ogawa yasufum.o at gmail.com
Tue Jul 9 12:22:13 CEST 2019


Hi Anatoly,

On 2019/07/05 17:53, Burakov, Anatoly wrote:
> On 16-Apr-19 4:43 AM, ogawa.yasufumi at lab.ntt.co.jp wrote:
>> From: Yasufumi Ogawa <ogawa.yasufumi at lab.ntt.co.jp>
>>
>> In secondary_msl_create_walk(), it creates a file for fbarrays with its
>> PID for reserving unique name among secondary processes. However, it
>> does not work if secondary is run as app container because each of
>> containerized secondary has PID 1. To reserve unique name, use hostname
>> instead of PID if the value is 1.
>>
>> Cc: stable at dpdk.org
>>
>> Signed-off-by: Yasufumi Ogawa <ogawa.yasufumi at lab.ntt.co.jp>
>> ---
> 
> I'm not too well versed in containers - is this hostname 1) always set, 
> and 2) always unique?
For docker, 1) hostname is always set. 2) The hostname is decided as 
short form of container ID, so it might not be unique even though very 
low possibility.

I found that we can get whole container ID in `/proc/self/cgroup` as 
discussed [1]. I think using hostname is reasonable way without running 
many secondary processes. However, it might be better to use 64 digits 
full container ID instead of 12 digits short ID if ensure uniqueness 
strongly. What do yo think?

[1] 
https://forums.docker.com/t/get-a-containers-full-id-from-inside-of-itself/37237
> 
> <snip>
> 
>> +    if (getpid() == 1) {
>> +        FILE *hn_fp;
>> +        hn_fp = fopen("/etc/hostname", "r");
>> +        if (hn_fp == NULL) {
>> +            RTE_LOG(ERR, EAL,
>> +                "Cannot open '/etc/hostname' for secondary\n");
>> +            return -1;
>> +        }
>> +
>> +        /* with docker, /etc/hostname just has one entry of hostname */
>> +        if (fscanf(hn_fp, "%s", proc_id) == EOF)
>> +            return -1;
> 
> Wouldn't an error in fscanf() leak the file handle? I think you need to 
> fclose() before checking the result.
I would like to fix it.

Regards,
Yasufumi
> 
>> +        fclose(hn_fp);
>> +    } else
>> +        sprintf(proc_id, "%d", (int)getpid());
>> +
>> +    snprintf(name, RTE_FBARRAY_NAME_LEN, "%s_%s",
>> +            primary_msl->memseg_arr.name, proc_id);
>>       ret = rte_fbarray_init(&local_msl->memseg_arr, name,
>>           primary_msl->memseg_arr.len,
>>
> 
> 


More information about the dev mailing list