On 23. april 2015 19:02, Tim Bunce wrote:

> On Thu, Apr 23, 2015 at 05:59:34PM +0200, Cosimo Streppone wrote:
>>
>> When the fork + exec'd daemon chooses a random port, I need to be able
>> to know which port it has bound itself to, and here lies the problem.
>
> Perhaps dodge the problem by not picking a random port. Have the parent
> process look for free ports itself in some obscure part of the range.
> Then pass that port number to the daemon. There's a very small race
> hazard here but that seems quite acceptable under the circumstances.
> Especially as you'll know you've hit it because the statsd daemon will die.

Thanks Tim, I can certainly experiment with this idea.
My hunch is that port clashes will still happen, but that
needs to be verified.

>> Basically I set an ENV variable such as $ENV{STATSD_PORT_FILE} with a
>> temporary random file name.
>>
>> In the daemon startup code, if $ENV{HARNESS_ACTIVE} and
>> $ENV{STATSD_PORT_FILE} are both there (since the daemon is spawned by
>> the *.t script), then the port number is saved into the file name
>> indicated by $ENV{STATSD_PORT_FILE}.
> 
> How is "the port number is saved into the file" when you don't know
> which port it has bound itself to?

The daemon starts and binds using port 0. Still within the daemon code,
I can then query for the used port, through regular socket calls.
After that, I check for HARNESS_ACTIVE and STATSD_PORT_FILE
and I write the port to the file indicated by STATSD_PORT_FILE.

Of course I don't like that the statsd daemon code needs to know about
this at all.

Thanks,

-- 
Cosimo

Reply via email to