Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

HUP doesn't restore the arguments properly because of the use of $0 #34

Closed
miyagawa opened this Issue · 9 comments

2 participants

@miyagawa
Owner

With Plack 0.9971's $0 change, the HUP signal handling is broken, and the way Net::Server retrieves the original command line args.

See also: https://github.com/miyagawa/Plack/issues/243

@frankyd

I have an example of how to reproduce this:

https://gist.github.com/1197586

https://gist.github.com/1197876

@miyagawa
Owner

Note that this may or may not work with procfs because of the way Net::Server works. A quick test shows that there's no issue with Mac OS X.

@miyagawa
Owner

I keep failing to reproduce this bug on Mac, and also hear issues from linux users (I think). Can someone specify 100% reproducible simple step to replicate this bug? I do have a linux environment to test and fix if there's any.

@miyagawa
Owner

OK i could reproduce now - is it correct that it only happens on a) linux, b) when you use PSGI file other than app.psgi and c) when you use --preload-app.

@miyagawa
Owner

Sort of related, Net::Server does this:

delete $ENV{$_} for $self->hup_delete_env_keys;
sub hup_delete_env_keys { return qw(PATH) }

which means if you run starman using just 'perl', relying on your $PATH configured correctly, then sending HUP could potentially run the process again from a wrong path. This is issue number one.

@miyagawa
Owner

I think restarting the server with exec $0, @ARGV is not exactly what we want - we should override Net::Server's behavior of handling HUP signals. Also the code to get the original command line in Net::Server is just insane:
https://metacpan.org/source/RHANDOM/Net-Server-0.99/lib/Net/Server.pm#L162

http://unicorn.bogomips.org/SIGNALS.html handles HUP to restart config files, then restart all workers. It will pick up code changes unless the preload_app is used, which we could replicate in Starman as well.

If you use --preload-app then the code changes won't be picked up, which could be confusing to some people. We can document that in --preload-app that you can run starman behind Server::Starter to make HUP to fully restart the server while preloading the app entirely.

@miyagawa
Owner

0.29_01 is shipped to CPAN. Test it.

@frankyd

I have tested version 0.29_90 and it works exactly as you have described above and in the documentation. A HUP signal now successfully restarts the workers. Thanks for sorting this out.

@miyagawa
Owner

Closing.

@miyagawa miyagawa closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.