OTP 25.0-rc3 (Release Candidate 3) is released

Henrik Nord X henrik.x.nord@REDACTED
Wed Apr 13 14:46:36 CEST 2022

OTP 25-rc3

Erlang/OTP 25-rc3 is the third and final release candidate before the
OTP 25.0 release.

The intention with this release is to get feedback from our users. All
feedback is welcome, even if it is only to say that it works for you.
We encourage users to try it out and give us feedback either by
creating an issue here https://github.com/erlang/otp/issues or by
posting to Erlangforums or the mailing list erlang-

All artifacts for the release can be downloaded from the Erlang/OTP
Github release and you can view the new documentation at 
https://erlang.org/documentation/doc-13.0-rc3/doc/. You can also
install the latest release using kerl like this: kerl build 25.0-rc3

Erlang/OTP 25 is a new major release with new features, improvements as
well as a few incompatibilities. Some of the new features are
highlighted below.

Many thanks to all contributors!

Below are some highlights of the release:
Highlights rc3

Change format of feature options and directives for better consistency.
Options to erlc and the -compile(..) directive now has the format
{feature, feature-name, enable | disable}. The -feature(..) now has the
format -feature(feature-name, enable | disable).

Introducing a new (still experimental) option
{certs_keys,[cert_key_conf()]}. With this a list of a certificates with
their associated key may be used to authenticate the client or the
server. The certificate key pair that is considered best and matches
negotiated parameters for the connection will be selected.
Highlights rc2

    New function filelib:ensure_path/1 will ensure that all directories
for the given path exists
    New functions groups_from_list/2 and groups_from_list/3 in the maps
    New functions uniq/1 uniq/2 in the lists module

compiler, kernel, stdlib, syntax_tools

    Added support for selectable features as described in EEP-60.
Features can be enabled/disabled during compilation with options
(ordinary and +term) to erlc as well as with directives in the file.
Similar options can be used to erl for enabling/disabling features
allowed at runtime. The new maybe expression EEP-49 is fully supported
as the feature maybe_expr.

Highlights rc1
erts & jit

    The JIT now works for 64-bit ARM processors.
    The JIT now does type-based optimizations based on type information
in the BEAM files.
    Improved the JIT's support for external tools like perf and gdb,
allowing them to show line numbers and even the original Erlang source
code when that can be found.

erts, stdlib, kernel

    Users can now configure ETS tables with the {write_concurrency,
auto} option. This option forces tables to automatically change the
number of locks that are used at run-time depending on how much
concurrency is detected. The {decentralized_counters, true} option is
enabled by default when {write_concurrency, auto} is active.

    Benchmark results comparing this option with the other ETS
optimization options are available here: benchmarks.

    To enable more optimizations, BEAM files compiled with OTP 21 and
earlier cannot be loaded in OTP 25.

    The signal queue of a process with the process flag
message_queue_data=off_heap has been optimized to allow parallel
reception of signals from multiple processes. This can improve
performance when many processes are sending in parallel to one process.
See benchmark.

    The Erlang installation directory is now relocatable on the file
system given that the paths in the installation's RELEASES file are
paths that are relative to the installations root directory.

    A new option called short has been added to the functions
erlang:float_to_list/2 and erlang:float_to_binary/2. This option
creates the shortest correctly rounded string representation of the
given float that can be converted back to the same float again.

    Introduction of quote/1 and unquote/1 functions in the uri_string
module - a replacement for the deprecated functions http_uri:encode and

    The new module peer supersedes the slave module. The slave module
is now deprecated and will be removed in OTP 27.

    global will now by default prevent overlapping partitions due to
network issues. This is done by actively disconnecting from nodes that
reports that they have lost connections to other nodes. This will cause
fully connected partitions to form instead of leaving the network in a
state with overlapping partitions.

    It is possible to turn off the new behavior by setting the the
kernel configuration parameter prevent_overlapping_partitions to false.
Doing this will retain the same behavior as in OTP 24 and earlier.

    The format_status/2 callback for gen_server, gen_statem and
gen_event has been deprecated in favor of the new format_status/1

    The new callback adds the possibility to limit and change many more
things than the just the state.

    The timer module has been modernized and made more efficient, which
makes the timer server less susceptible to being overloaded. The
timer:sleep/1 function now accepts an arbitrarily large integer.


    The maybe ... end construction as proposed in EEP-49 has been
implemented. It can simplify complex code where otherwise deeply nested
cases would have to be used.

    To enable maybe, give the option {enable_feature,maybe_expr} to the
compiler. The exact option to use will change in a coming release
candidate and then it will also be possible to use from inside the
module being compiled.

    When a record matching or record update fails, a {badrecord,
ExpectedRecordTag} exception used to be raised. In this release, the
exception has been changed to {badrecord, ActualValue}, where
ActualValue is the value that was found instead of the expected record.

    Add compile attribute -nifs() to empower compiler and loader with
information about which functions may be overridden as NIFs by

    Improved and more detailed error messages when binary construction
with the binary syntax fails. This applies both for error messages in
the shell and for erl_error:format_exception/3,4.


    Add crypto:hash_equals/2 which is a constant time comparision of


    Optimize operations in the erl_types module. Parallelize the
Dialyzer pass remote.
    Added the missing_return and extra_return options to raise warnings
when specifications differ from inferred types. These are similar to,
but not quite as verbose as overspecs and underspecs.
    Dialyzer now better understands the types for min/2, max/2, and
erlang:raise/3. Because of that, Dialyzer can potentially generate new
warnings. In particular, functions that use erlang:raise/3 could now
need a spec with a no_return() return type to avoid an unwanted


    A new DEVELOPMENT HOWTO guide has been added that describes how to
build and test Erlang/OTP when fixing bugs or developing new
    Testing has been added to the Github actions run for each opened PR
so that more bugs are caught earlier when bug fixes and new features
are proposed.

For more details about new features and potential incompatibilities see


More information about the erlang-questions mailing list