On Thu, Apr 23, 2015 at 08:21:28PM +0200, Cosimo Streppone wrote:
> 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.

That approach only applies to your perl statsd, right?  For the nodejs
or C statsd's you don't have an easy[*] a way to find the port.

Tim.

[*] Ignoring options like parsing log output of running lsof.

Reply via email to