spring icon indicating copy to clipboard operation
spring copied to clipboard

spring doubles the env size, sometimes causing "Argument list too long" error

Open michaelglass opened this issue 5 years ago • 1 comments

Spring is great! You are great!

When spring spawns new processes, it passes in a copy of the original spring env, SPRING_ORIGINAL_ENV as an environmental variable.

https://github.com/rails/spring/blob/a85d32ef3726931b2b81abbb10a6e1c2964e7e32/lib/spring/application_manager.rb#L102

If the environment size is greater than half of ARG_MAX, the spring server, as well as other processes will spawn without spring but fail with spring because of an Argument list too long error.

Potential solutions:

  • have specific environmental variables to watch rather than everything
  • pass SPRING_ORIGINAL_ENV via a tempfile rather than another environmental variable
  • fail gracefully / loudly if SPRING_ORIGINAL_ENV > 1/2 ARG_MAX ~~(perhaps suggesting user increases ulimit)~~ (ARG_MAX is hard-coded in OS X)

michaelglass avatar Oct 06 '20 10:10 michaelglass

have specific environmental variables to watch rather than everything

The idea is to be agnostic to the existing environment, so everything Just Works from Spring users' point of view.

Some additional possibilities to pursue:

  • Spawned processes inherit the environment by default, so perhaps passing the original env is not strictly necessary. If we can deduce the original env from the inherited env.
  • Process.spawn can wipe the environment as well, with the unsetenv_others: true option. That'd limit env size. Not sure about support in older Ruby versions.
  • Spring::ApplicationManager and Spring::Application could pass the original environment over their UNIX socket pair after the process is spawned, sidestepping the environment entirely.

jeremy avatar Oct 06 '20 14:10 jeremy