Erlang/OTP 21

This release of Erlang/OTP can be built from source or installed using pre-built packages for your OS or third-party tools (such as kerl or asdf).

Erlang/OTP 21 highlight blog post

docker run -it erlang:21

Potential Incompatibilities

  • All Corba applications are now moved from the OTP repository
  • A new Corba repository will be created
  • New applications ftp and tftp, moved from inets
  • ssl no longer supports 3_DES cipher suites or RSA-key exchange cipher suites by default
  • erlang:monitor on a primitive node (erl_interface, jinterface, etc) will no longer fail with badarg exception. Instead a monitor will be created, but it will only supervise the connection to the node.

For a full list see OTP 21.0 - Potential Incompatibilities.


  • Enhanced IO scalability
  • Support for usage of distribution controller processes for alternative transports, routing etc
  • compact instructions on 64bit systems for code below 4GB 20% less memory for loaded code
  • Rewrite of the efile-driver with NIFs and “Dirty schedulers” resulting in faster file operations non-smp VM removed
  • link and monitor optimized for scalability
  • os:getenv/putenv now work on thread-safe emulation. No longer in sync with libc getenv(3). Manual synchronization will be needed.
  • New counters and atomics modules supplies access to highly efficient operations on mutable fixed word sized variables. (21.2)
  • New module persistent_term!. Lookups are in constant time! No copying the terms! (21.2)
  • Misc compiler optimizations including contributions from the Elixir team resulting in 10% improvements in benchmarks
  • “Tuple calls” have been removed from the run-time system.
  • Code such as f({ok, Val}) -> {ok, Val} is now automatically rewritten to f({ok, Val} = Tuple) -> Tuple. this reduces code size, execution time, and removed GC pressure.
  • More information in stacktrace from a number of operators
  • erlang:get_stacktrace/0 deprecated to be replaced with try … catch C:R:Stacktrace -> …
  • Creation of small maps with literal keys optimized.
  • A new predefined macro OTP_RELEASE and preprocessor directives -if and -elif
  • DTLS is now supported in the SSL application
  • Enhanced support for distribution over TLS
  • “unsecure” ciphers removed from defaults in SSL and SSH.
  • A new option value defined to facilitate implementing exec servers. Old option kept for compatibility, but now gives errors on stderror.
Standard libraries
  • New API for logging, logger
  • New uri_string module for parsing URIs according to “The standard”
  • New function lists:search(list,fun/1) -> {ok, Value} | false
  • Changed default behaviour of .erlang loading. escript, erlc, dialyzer and typer no longer load an .erlang at all.