[erlang-questions] "New" vs. "old" console behavior: bug or feature?

Scott Lystig Fritchie fritchie@REDACTED
Wed Apr 24 22:39:36 CEST 2013


Fred Hebert <mononcqc@REDACTED> wrote:

fh> Input --> user.erl <---> shell.erl

fh> [...] The shell attempts to evaluate it, and if there's not enough
fh> data, it asks for more. user.erl then blocks until it can get more
fh> data to respond to the io request.

fh> When output is sent to 'user' it's sent as an additional io request,
fh> as a message. This message will not be read until the shell can
fh> answer the previous request. This is where you block.

Yup.

The combination of using "run_erl" + no tty/pty + lager prior to this
work(*) meant that any Erlang process that attempted to log a message
would be blocked arbitrarily until user.erl would return from
user:get_chars_more() et al.

If someone had used the Riak console recently, attaching to the VM's
console via "riak attach" (which in turn uses "to_erl"), and if the last
thing that they typed was not the end of an expression and then detached
from the console(**), every process that attempts to log a message
afterward will hang.  Forever.  Or until someone re-attaches to the
console and types "." and ENTER so that user.erl can finish its
simple-minded parsing.

The completely silent nature of the switch to the old shell was
baffling.  Not to mention causing us & our customers serious grief.  I
finally starting finding the root cause when I realized that all cases
of the all-lager-events-blocked-arbirarily mystery involved systems
where there was no 'user_drv' registered process.

-Scott

(*) https://github.com/basho/lager/pull/139

(**) Or if that person merely pressed ENTER before detaching, an
exceptionally easy thing to do.



More information about the erlang-questions mailing list