basho/lager — pull request #138 by slfritchie (2013-04-23 15:19:50+00:00)
Title: Disable I/O to the console if the old-style Erlang console is used

There's a nasty problem with the Erlang VM + lager when the old-style
Erlang console is used. You can use the "-oldshell" flag to explicitly
get the old-style shell. However, if the Erlang VM is started when
*not* associated with a pseudo-tty, the VM will silently use the
old-style shell (because the new-style shell requires a pty to
support command line editing, etc.). The most common way of starting
the Erlang VM without a pty is to start it via a non-interactive
SSH session.

This patch is opinionated in what to do in the case when the old-
style shell is detected. My opinion is:

1. Shout loudly to the console log (in a separate Erlang process, so
that the main lager event handler proc won't be blocked by any
problems with the old-style console). It's almost certainly
likely that you really don't want to run Erlang with the old-style
shell. But many sysadmins don't look closely at their systems'
log files, so (for example) shouting the same message 10x in a row
is legit. Reviewers: YMMV.
2. Set a SASL alarm. Again, many sysadmins' are bad at looking at
log messages. Setting a SASL alarm is another method to try to
get their attention.

To test, create a test script called `/tmp/testit.sh`, changing the
`-pz` parameter to point to the correct place for lager's `ebin`
subdirectory:

#!/bin/sh

erl -pz /Users/fritchie/b/src/lager/ebin -eval '{application:start(sasl), lager_console_backend:init([error, true]), timer:sleep(5*1000), io:format("\n\nInfo: ~p\n\n", [{{alarms, alarm_handler:get_alarms()}, {user_drv, whereis(user_drv)}}]), erlang:halt()}.'

Then run it twice, using the following:

First time: ssh -t localhost sh /tmp/testit.sh
Second time: ssh localhost sh /tmp/testit.sh

The last lines of the first time should look like:

Info: {{alarms,[]},{user_drv,<0.22.0>}}

The last lines of the second time should look like:

Info: {{alarms,
[{lager_console_backend,
"WARNING: old-style console is in use, so lager_console_backend log output to the console is disabled. Restart the VM on a pseudo-tty to ensure use of the new-style VM console."}]},
{user_drv,undefined}}