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.