summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@plataformatec.com.br>2019-05-18 20:11:35 +0200
committerJosé Valim <jose.valim@plataformatec.com.br>2019-05-18 20:11:36 +0200
commit4307a342570438bc3dde53ae78d91c8ab8e3c96b (patch)
tree6c27f036255c87ef00cbb33625a2813a68d40241
parenta697f8fd83dc5881c120abf8e5ffbe70ed1d4477 (diff)
downloadelixir-jv-run-one-off-interactive.tar.gz
Start the VM in interactive mode for rpc/eval/remotejv-run-one-off-interactive
This speeds up boot time and decreases memory use.
-rw-r--r--lib/mix/lib/mix/tasks/release.ex4
-rw-r--r--lib/mix/lib/mix/tasks/release.init.ex21
-rw-r--r--lib/mix/test/fixtures/release_test/lib/release_test.ex1
-rw-r--r--lib/mix/test/mix/tasks/release_test.exs5
4 files changed, 21 insertions, 10 deletions
diff --git a/lib/mix/lib/mix/tasks/release.ex b/lib/mix/lib/mix/tasks/release.ex
index 1eef241b8..8187e90c7 100644
--- a/lib/mix/lib/mix/tasks/release.ex
+++ b/lib/mix/lib/mix/tasks/release.ex
@@ -622,6 +622,10 @@ defmodule Mix.Tasks.Release do
files to. It can be set to a custom directory. It defaults to
`$RELEASE_ROOT/tmp`
+ * `RELEASE_MODE` - if the release should start in embedded or
+ interactive mode. Defaults to "embedded". It applies only to
+ start/daemon/install commands
+
* `RELEASE_DISTRIBUTION` - how do we want to run the distribution.
Using `name` (long names) or `sname` (short names). Defaults to
`sname` which allows access only within the current system.
diff --git a/lib/mix/lib/mix/tasks/release.init.ex b/lib/mix/lib/mix/tasks/release.init.ex
index bcacc6d9d..db6deb610 100644
--- a/lib/mix/lib/mix/tasks/release.init.ex
+++ b/lib/mix/lib/mix/tasks/release.init.ex
@@ -42,10 +42,7 @@ defmodule Mix.Tasks.Release.Init do
def vm_args_text,
do: ~S"""
## Customize flags given to the VM: http://erlang.org/doc/man/erl.html
- ## -name/-sname/-setcookie are configured via env vars, do not set them here
-
- ## Preloads all modules instead of loading them dynamically
- -mode embedded
+ ## -mode/-name/-sname/-setcookie are configured via env vars, do not set them here
## Number of dirty schedulers doing IO work (file, sockets, etc)
##+SDio 5
@@ -87,15 +84,16 @@ defmodule Mix.Tasks.Release.Init do
export RELEASE_NAME="${RELEASE_NAME:-"<%= @release.name %>"}"
export RELEASE_VSN="${RELEASE_VSN:-"$(cut -d' ' -f2 "$RELEASE_ROOT/releases/start_erl.data")"}"
export RELEASE_COMMAND="$1"
+ export RELEASE_MODE="${RELEASE_MODE:-"embedded"}"
REL_VSN_DIR="$RELEASE_ROOT/releases/$RELEASE_VSN"
. "$REL_VSN_DIR/env.sh"
- export RELEASE_COOKIE=${RELEASE_COOKIE:-"$(cat "$RELEASE_ROOT/releases/COOKIE")"}
- export RELEASE_NODE=${RELEASE_NODE:-"$RELEASE_NAME"}
- export RELEASE_TMP=${RELEASE_TMP:-"$RELEASE_ROOT/tmp"}
- export RELEASE_VM_ARGS=${RELEASE_VM_ARGS:-"$REL_VSN_DIR/vm.args"}
- export RELEASE_DISTRIBUTION=${RELEASE_DISTRIBUTION:-"sname"}
+ export RELEASE_COOKIE="${RELEASE_COOKIE:-"$(cat "$RELEASE_ROOT/releases/COOKIE")"}"
+ export RELEASE_NODE="${RELEASE_NODE:-"$RELEASE_NAME"}"
+ export RELEASE_TMP="${RELEASE_TMP:-"$RELEASE_ROOT/tmp"}"
+ export RELEASE_VM_ARGS="${RELEASE_VM_ARGS:-"$REL_VSN_DIR/vm.args"}"
+ export RELEASE_DISTRIBUTION="${RELEASE_DISTRIBUTION:-"sname"}"
rand () {
od -t xS -N 2 -A n /dev/urandom | tr -d " \n"
@@ -117,6 +115,7 @@ defmodule Mix.Tasks.Release.Init do
exec "$REL_VSN_DIR/$REL_EXEC" \
--cookie "$RELEASE_COOKIE" \
--$RELEASE_DISTRIBUTION "$RELEASE_NODE" \
+ --erl "-mode $RELEASE_MODE" \
--erl-config "$RELEASE_SYS_CONFIG" \
--boot "$REL_VSN_DIR/start" \
--boot-var RELEASE_LIB "$RELEASE_ROOT/lib" \
@@ -247,6 +246,7 @@ defmodule Mix.Tasks.Release.Init do
if not defined RELEASE_NAME (set RELEASE_NAME=<%= @release.name %>)
if not defined RELEASE_VSN (for /f "tokens=1,2" %%K in (!RELEASE_ROOT!\releases\start_erl.data) do (set ERTS_VSN=%%K) && (set RELEASE_VSN=%%L))
+ if not defined RELEASE_MODE (set RELEASE_MODE=embedded)
set RELEASE_COMMAND=%~1
set REL_VSN_DIR=!RELEASE_ROOT!\releases\!RELEASE_VSN!
call !REL_VSN_DIR!\env.bat
@@ -319,6 +319,7 @@ defmodule Mix.Tasks.Release.Init do
"!REL_VSN_DIR!\!REL_EXEC!.bat" !REL_EXTRA! ^
--cookie "!RELEASE_COOKIE!" ^
--!RELEASE_DISTRIBUTION! "!RELEASE_NODE!" ^
+ --erl "-mode !RELEASE_MODE!" ^
--erl-config "!RELEASE_SYS_CONFIG!" ^
--boot "!REL_VSN_DIR!\start" ^
--boot-var RELEASE_LIB "!RELEASE_ROOT!\lib" ^
@@ -366,7 +367,7 @@ defmodule Mix.Tasks.Release.Init do
!ERLSRV! add !RELEASE_NAME!_!RELEASE_NAME! ^
-name "!RELEASE_NODE!" ^
- -args "-setcookie !RELEASE_COOKIE! -config !RELEASE_SYS_CONFIG! -boot !REL_VSN_DIR!\start -boot_var RELEASE_LIB !RELEASE_ROOT!\lib -args_file !REL_VSN_DIR!\vm.args"
+ -args "-setcookie !RELEASE_COOKIE! -config !RELEASE_SYS_CONFIG! -mode !RELEASE_MODE! -boot !REL_VSN_DIR!\start -boot_var RELEASE_LIB !RELEASE_ROOT!\lib -args_file !REL_VSN_DIR!\vm.args"
if %ERRORLEVEL% EQU 0 (
echo Service installed but not started. From now on, it must be started and stopped by erlsrv:
diff --git a/lib/mix/test/fixtures/release_test/lib/release_test.ex b/lib/mix/test/fixtures/release_test/lib/release_test.ex
index 123f2e117..9cb4da2a9 100644
--- a/lib/mix/test/fixtures/release_test/lib/release_test.ex
+++ b/lib/mix/test/fixtures/release_test/lib/release_test.ex
@@ -13,6 +13,7 @@ defmodule ReleaseTest do
release_node: System.get_env("RELEASE_NODE"),
release_vsn: System.get_env("RELEASE_VSN"),
cookie_env: cookie,
+ mode: :code.get_mode(),
node: node(),
root_dir: :code.root_dir() |> to_string(),
static_config: Application.fetch_env(:release_test, :static),
diff --git a/lib/mix/test/mix/tasks/release_test.exs b/lib/mix/test/mix/tasks/release_test.exs
index 7782bac6d..5d6c24df7 100644
--- a/lib/mix/test/mix/tasks/release_test.exs
+++ b/lib/mix/test/mix/tasks/release_test.exs
@@ -130,6 +130,7 @@ defmodule Mix.Tasks.ReleaseTest do
assert %{
app_dir: app_dir,
cookie_env: ^cookie,
+ mode: :embedded,
node: release_node("release_test"),
protocols_consolidated?: true,
release_name: "release_test",
@@ -188,6 +189,7 @@ defmodule Mix.Tasks.ReleaseTest do
open_port(Path.join(root, "bin/runtime_config"), ['start'])
assert %{
+ mode: :embedded,
node: release_node("runtime_config"),
protocols_consolidated?: true,
release_name: "runtime_config",
@@ -238,6 +240,7 @@ defmodule Mix.Tasks.ReleaseTest do
assert %{
app_dir: app_dir,
cookie_env: "abcdefghijk",
+ mode: :embedded,
node: release_node("demo"),
protocols_consolidated?: true,
release_name: "demo",
@@ -303,6 +306,7 @@ defmodule Mix.Tasks.ReleaseTest do
assert %{
cookie_env: "abcdefghij",
+ mode: :interactive,
node: :nonode@nohost,
protocols_consolidated?: true,
release_name: "eval",
@@ -331,6 +335,7 @@ defmodule Mix.Tasks.ReleaseTest do
assert wait_until_evaled(Path.join(root, "RELEASE_BOOTED")) == %{
app_dir: Path.join(root, "lib/release_test-0.1.0"),
cookie_env: "abcdefghij",
+ mode: :embedded,
node: :"permanent2@#{@hostname}",
protocols_consolidated?: true,
release_name: "permanent2",