查看源码 内核发布说明

本文档描述了对 Kernel 应用程序所做的更改。

Kernel 10.2

修复的错误和故障

  • gen_sctp:peeloff/2 已修复,可以更像 gen_tcp:accept/1 一样,将套接字选项继承到剥离的套接字,例如选项 tostclass

    当设置平台上不支持的 SCTP 选项时,应该静默忽略某些选项,但是一个错误导致选项解析脱轨,因此之后的选项可能会退出并导致错误。此问题已修复。

    自有 ID: OTP-19225 辅助 ID: PR-8789

  • 可以通过再次按 ^[h 来展开按 ^[h 显示的帮助文本。

    自有 ID: OTP-19260 辅助 ID: PR-8884

  • 当使用 inet_backend = socket 时,inet:getifaddrs/0,1 得到了改进。

    自有 ID: OTP-19264

  • 修复了 logger:report/0,强制报告中至少包含一个元素。这修复了在使用 logger:report/0 的所有 logger 函数中,重叠的 spec 域的问题。

    自有 ID: OTP-19302 辅助 ID: PR-8959

  • 修复了 code_server 上的死锁。多个调用加载同一个带有 on_load 函数加载调用的模块将导致死锁。

    自有 ID: OTP-19305 辅助 ID: PR-8744, GH-7466, GH-8510

改进和新功能

  • Kernel 应用程序现在可以识别 epmd_moduleerl_epmd_listen_port 参数,类似于 -kernel:connect_all

    自有 ID: OTP-19253 辅助 ID: PR-8671

  • inetrc 内核参数现在将再次容忍原子,以提高与偶然依赖于原子工作的旧配置的兼容性。

    预期的类型始终是,并且仍然是,一个字符串。

    自有 ID: OTP-19280 辅助 ID: GH-8899, PR-8902

  • file:io_device/0 类型已更新,以清楚地显示 rawcooked IoDevice 之间的区别。

    自有 ID: OTP-19301 辅助 ID: PR-8956

  • Erlang/OTP 类型规范已更新,以消除重叠的域。

    自有 ID: OTP-19310 辅助 ID: GH-8810, GH-8821, PR-8986

  • 添加了内核参数 os_cmd_shell,该参数控制 os:cmd/1 应使用的 shell。

    自有 ID: OTP-19342 辅助 ID: PR-8972

  • io:user/0io:standard_io/0io:standard_error/0 添加了日志记录支持。 有关更多详细信息,请参阅 io:setopts/2

    自有 ID: OTP-19372 辅助 ID: PR-8947

Kernel 10.1.2

修复的错误和故障

  • 在 Windows 上,即使并非所有数据都已读取,socket:recv 也可以成功返回 ({ok, Data})。

    自有 ID: OTP-19328

  • domain local 上的 gen_udp:send 可能会泄漏 inet_reply 消息。

    自有 ID: OTP-19332 辅助 ID: #8989

  • 当 inet_backend = socket 并使用某些 IPv6 套接字选项时,无法创建 UDP IPv6 套接字。

    自有 ID: OTP-19357

  • net:getifaddrs 在 Windows 上无法正确报告运行标志。

    自有 ID: OTP-19366 辅助 ID: OTP-19061, ERIERL-1134

Kernel 10.1.1

修复的错误和故障

  • 修复了一个错误,其中使用 gen_sctp 接收 SCTP 消息可能会浪费消息的第一个片段,而只传递最后一个片段。

    当操作系统发出套接字已准备好进行读取的信号,并结合内部超时重试时,会发生这种情况,概率较低。

    修复了一个错误,该错误是来自 SCTP 连接之后的一个持续超时,可能会阻止活动 gen_tcp 套接字上流入的消息流。

    自有 ID: OTP-19235 辅助 ID: ERIERL-1133, PR-8837

  • 为 SCTP 添加了一个布尔选项 non_block_send,以便能够实现旧的行为,通过传递操作系统网络堆栈错误消息 ({error,eagain}) 来避免阻塞发送操作。

    自有 ID: OTP-19258 辅助 ID: OTP-19061, ERIERL-1134

Kernel 10.1

修复的错误和故障

  • 更正了 prim_tty 模块中的一个错误断言。当从 stdin 读取无效的 UTF-8,并且模式从 unicode 更改为 latin1 时,可能会触发此断言。

    自有 ID: OTP-19097 辅助 ID: PR-8503

  • 打开 disk_log 文件并将 head_funcrotate 选项组合使用不起作用。

    自有 ID: OTP-19104 辅助 ID: ERIERL-870

  • 修复了非本地 pid 上 erlang:is_process_alive/1 的错误信息输出。

    自有 ID: OTP-19134 辅助 ID: PR-8560

  • 修复了 SSL 分发的 kTLS 风格中的一个竞争条件,以便 inet_drv.c 不会预读太多数据,这可能会导致在某些加密数据作为未加密数据已读取到 inet_drv.c 缓冲区中时,过晚激活 kTLS 加密。

    自有 ID: OTP-19175 辅助 ID: GH-8561, PR-8690

  • 修复了应用程序在启动期间崩溃并且日志消息发送到标准输出时发生的死锁。Logger 将无法将消息打印到标准输出,而是将其打印到标准错误。

    自有 ID: OTP-19205

  • 多次指定 -proto_dist 初始化参数时,将不再忽略该参数。现在它将记录一个警告并使用第一个指定的值。

    自有 ID: OTP-19208 辅助 ID: PR-8672

  • 更正了 genaddr (SIOCGENADDR) 的 socket:ioctl。

    自有 ID: OTP-19216

改进和新功能

  • 将函数 getservbynamegetservbyport 添加到 net 模块。

    自有 ID: OTP-19101 辅助 ID: OTP-18835

  • 引入了 inet 函数的 enet | esock 变体,或者当使用套接字调用时,或者使用显式的 inet_backend 配置或 e inet_backend 内核配置选项调用时。

    自有 ID: OTP-19132 辅助 ID: OTP-19101

  • 函数 socket:i/0 现在使用 net 模块(而不是 inet 模块)进行服务转换。

    自有 ID: OTP-19138 辅助 ID: OTP-19101

  • gen_tcp 实现了一个布尔选项 read_ahead,默认值为 true,以方便不读取超过(缓存数据)数据包末尾的数据。 特别是对于 kTLS,缓存数据可能会在加密参数激活之前读取本应由平台的网络堆栈解密的数据。

    自有 ID: OTP-19199 辅助 ID: OTP-19175, GH-8561, GH-8690, GH-8785

Kernel 10.0.1

改进和新功能

Kernel 10.0

修复的错误和故障

  • 修复了使用空选项列表调用 file:delete/2 时发生的崩溃。

    自有 ID: OTP-18590 辅助 ID: PR-7220

  • 新的函数已添加到未文档化的模块 m:inet_dns 中,该模块使用一个标志来指定编码/解码是否用于 mDNS。这会影响如何处理私有范围中设置了最高位的 CLASS 值。

    自有 ID: OTP-18878 辅助 ID: GH-7718, OTP-17734

  • 更正了 erlang:phash/2 的错误信息。

    自有 ID: OTP-18904 辅助 ID: PR-7960

  • eof 是回调返回的最后一项时,使用 I/O 协议的 get_until 请求现在会正确返回二进制或列表。

    自有 ID: OTP-18930 辅助 ID: PR-7993, GH-4992

  • 使用配置选项调用 logger:add_handlers/1 现在可以工作。

    自有 ID: OTP-18954 辅助 ID: GH-8061, PR-8076

  • code:del_path/1 函数现在也适用于通过 -pa-pz-path 和启动脚本添加的路径。

    自有 ID: OTP-18959 辅助 ID: GH-6692, PR-7697

  • 如果在 Windows 上数据立即可用,使用 Timeout = 0 调用 socket:[recv|recvfrom|recvmsg]/* 可能会导致(case clause)崩溃。

    自有 ID: OTP-19063 辅助 ID: OTP-18835

  • 改进了在具有旧 libc 版本的系统中 shell 中字符为宽字符时的启发式方法。

    自有 ID:OTP-19087 辅助 ID:PR-8382

  • 修复了从 io:user/0 读取行时,当 erl 使用 -noshell 启动时,不将没有 \n\r 视为新行的问题。

    自有 ID:OTP-19088 辅助 ID:PR-8396, GH-8360

改进和新功能

  • 添加了带有 raw 选项的 file:read_file/2,用于读取文件而不经过文件服务器。

    自有 ID:OTP-18589 辅助 ID:PR-7220

  • 未记录的 Erlang DNS 解析器库(inet_dnsinet_res)已增强,可以处理 IXFR、NOTIFY、UPDATE 和 TSIG 记录。与此同时,还进行了一些错误修复和代码清理,并且测试套件中使用的解析器已更改为 Knot DNS。请参阅源代码。

    感谢 Alexander Clouter 完成了几乎所有工作!

    自有 ID:OTP-18713 辅助 ID:PR-6985, GH-6985

  • 现在缓存 escript 的 ebin 目录。

    自有 ID:OTP-18778 辅助 ID:PR-7556

  • 已经将 -callback 属性添加到了 applicationlogger_handlerlogger_formatter

    自有 ID:OTP-18795 辅助 ID:PR-7703

  • 现在,当日志级别设置为 debug 时,会记录在 logger 启动之前产生的进度报告。

    自有 ID:OTP-18807 辅助 ID:PR-7732 ERIERL-985

  • code:where_is_file/2code:which/1 函数现在直接检查文件是否存在,而不是列出代码路径中每个目录的内容。

    自有 ID:OTP-18816 辅助 ID:PR-7711

  • 已将类型规范添加到 logger:Level/1,2,3 函数。

    自有 ID:OTP-18820 辅助 ID:PR-7779

  • 对于 inet_backend = socket,单独将 active 套接字选项设置为 oncetrueN 进行了优化,以及相应的数据传递。

    自有 ID:OTP-18835

  • 添加了用于发送 I/O 向量的新函数 socket:sendv/*

    自有 ID:OTP-18845

  • 现在,shell 会对文档帮助命令(h(Module))、自动完成和搜索命令产生的长输出进行分页。

    自有 ID:OTP-18846 辅助 ID:PR-7845

  • JIT 中已实现了原生覆盖率支持。 当运行覆盖率编译的代码时,它将自动被 cover 工具使用,以减少执行开销。

    还有新的 API 可用于支持不使用 cover 工具的原生覆盖率。

    要为原生覆盖率检测代码,必须使用 line_coverage 选项进行编译。

    要在运行时系统中启用原生覆盖率,请按以下方式启动它

    $ erl +JPcover true

    还有以下新函数用于支持原生覆盖率

    自有 ID:OTP-18856 辅助 ID:PR-7856

  • 通过将某些操作从代码服务器移动到调用方,优化了代码加载。

    自有 ID:OTP-18941 辅助 ID:PR-7981

  • 文档已迁移为使用 Markdown 和 ExDoc。

    自有 ID:OTP-18955 辅助 ID:PR-8026

  • 通过删除中间进程优化了应用程序启动。

    自有 ID:OTP-18963 辅助 ID:PR-8042

  • 对归档文件的现有实验性支持将在未来的版本中更改。在 escript 中使用归档文件的支持将保留,但在版本中使用归档文件的支持将受到更多限制或完全删除。

    从 Erlang/OTP 27 开始,函数 code:lib_dir/2-code_path_choice 标志,以及使用 erl_prim_loader 读取归档文件的成员都已被弃用。

    为了与未来版本的 Erlang/OTP 保持兼容,需要从其归档文件中检索数据文件的 escript 脚本应使用 escript:extract/2 而不是 erl_prim_loadercode:lib_dir/2

    潜在的不兼容性

    自有 ID:OTP-18966 辅助 ID:PR-8091

  • 已删除未记录且已弃用的 file:pid2name 函数。

    自有 ID:OTP-18967 辅助 ID:PR-8092

  • Kernel 中有一个新的模块 trace,它提供的跟踪功能与 erlang:trace/3erlang:trace_pattern/3 相同,但增加了动态隔离的跟踪会话

    自有 ID:OTP-18980

  • io:standard_io/0 读取器和/或写入器因错误而终止时,错误日志记录已得到改进。

    自有 ID:OTP-18989 辅助 ID:PR-8103

  • inet_backend = socket 已被优化和重构,以使其与原始的 inet_backend = inet 更加兼容。

    自有 ID:OTP-19004 辅助 ID:OTP-18835

  • 在套接字用户指南中添加了一个简单的示例(回声服务器)。

    自有 ID:OTP-19042

  • inet:i/0,1,2 已得到改进,允许显式显示端口号。

    自有 ID:OTP-19053 辅助 ID:#6724

  • socket 文档已重构,因此修复了一些细节

    • 例如,socket:is_supported/1 现在对属于“类别”而不是项目的 protocols 返回 true
    • 对于由另一个进程设置的监视器,socket:cancel_monitor/1 不再返回 badargs,而是像其他未知 reference() 一样返回 false

    自有 ID:OTP-19054

  • stdinstdoutstderr 键添加到 io:getopts/1io:standard_io/0 中,以指示相应的 I/O 设备是否由终端支持。

    自有 ID:OTP-19089 辅助 ID:PR-8396

Kernel 9.2.4.4

已修复的错误和故障

  • domain local 上的 gen_udp:send 可能会泄漏 inet_reply 消息。

    自有 ID:OTP-19332 辅助 ID:#8989

  • 当 inet_backend = socket 并使用某些 IPv6 套接字选项时,无法创建 UDP IPv6 套接字。

    自有 ID: OTP-19357

  • net:getifaddrs 在 Windows 上无法正确报告运行标志。

    自有 ID: OTP-19366 辅助 ID: OTP-19061, ERIERL-1134

Kernel 9.2.4.3

已修复的错误和故障

  • 修复了一个错误,即在使用 `gen_sctp` 接收 SCTP 消息时,可能会浪费消息的第一个片段,并且只传递最后一个片段。

    当操作系统发出套接字已准备好进行读取的信号,并结合内部超时重试时,会发生这种情况,概率较低。

    修复了一个错误,即在 SCTP 连接之后,可能会存在一个挥之不去的超时,这可能会阻止活动的 `gen_tcp` 套接字上的传入消息流。

    自有 ID:OTP-19235 辅助 ID:ERIERL-1133, PR-8837

  • 为 SCTP 添加了一个布尔选项 `non_block_send`,以便能够实现旧的行为,即通过操作系统网络堆栈错误消息 (`{error,eagain}`) 来避免阻塞发送操作。

    自有 ID: OTP-19258 辅助 ID: OTP-19061, ERIERL-1134

Kernel 9.2.4.2

已修复的错误和故障

  • 修复了 SSL 分布的 kTLS 风味中的竞争条件,使得 inet_drv.c 不会超前读取太多数据,这可能会导致当一些加密数据已经作为未加密数据读取到 inet_drv.c 缓冲区中时,kTLS 加密激活得太晚。

    自有 ID:OTP-19175 辅助 ID:GH-8561, PR-8690

  • 修复了在应用程序启动期间崩溃并且日志消息被发送到标准输出时发生的死锁。Logger 无法将消息打印到标准输出,而是将其打印到标准错误。

    自有 ID: OTP-19205

  • 添加了 stdlib 应用程序参数 shell_redraw_prompt_on_output,当设置为 false 时,禁用在执行任何其他输出时重绘 shell 提示符。

    自有 ID:OTP-19213 辅助 ID:PR-8763 ERIERL-1108

Kernel 9.2.4.1

已修复的错误和故障

  • 在 Windows 上,使用 Timeout = 0 调用 socket:[recv|recvfrom|recvmsg]/* 可能会导致(case 子句)崩溃,如果数据立即可用。

    自有 ID: OTP-19063 辅助 ID: OTP-18835

  • 打开 disk_log 文件并将 head_funcrotate 选项组合使用不起作用。

    自有 ID: OTP-19104 辅助 ID: ERIERL-870

Kernel 9.2.4

已修复的错误和故障

  • 修复了 shell 作业控制模式,使其在键入 TABCTRL+R 时不会崩溃。

    自有 ID:OTP-19072 辅助 ID:PR-8391

  • 修复了对阻塞 application API 的调用,使其在系统终止时调用时抛出原因 terminating 的异常。

    这样做是为了避免在关闭或重新启动期间发生死锁。

    自有 ID:OTP-19078 辅助 ID:PR-8422

Kernel 9.2.3

已修复的错误和故障

  • 当使用 IPv6 时,经典的 gen_udp 未能添加(组)成员资格(而是使用了删除)。

    自有 ID:OTP-19049 辅助 ID:#8176

  • inet_res 中对 RD 位的检查已略微放宽。

    自有 ID:OTP-19056 辅助 ID:PR-8312,OTP-17323

Kernel 9.2.2

修复的 Bug 和故障

  • 修复了使用 io:freadstandard_io 读取时出现的性能 Bug。此回归是在 OTP 26.0 中引入的。

    自有 ID:OTP-18910 辅助 ID:PR-7933 GH-7924

  • 代码服务器中的一个 Bug 可能导致其在某些并发场景中崩溃。此 Bug 是在 26.1 中引入的。

    自有 ID:OTP-18948 辅助 ID:PR-8046

  • 修复了 gen_udp:open/2 类型规范,以包含已支持的模块套接字地址类型。

    自有 ID:OTP-18990 辅助 ID:GH-8158

  • 修复了在 user_interactive 模式下 ssh 客户端读取密码的问题。

    自有 ID:OTP-19007 辅助 ID:ERIERL-1049

Kernel 9.2.1

修复的 Bug 和故障

  • 修复了当检测到 eof 时,get_until 回调函数返回 {done, eof, []} 时,group(即 shell)无法正确处理的问题。

    自有 ID:OTP-18901

Kernel 9.2

修复的 Bug 和故障

  • 对于 inet_backend = socket,诸如 etimedout 之类的意外接收错误会导致接收状态机服务器崩溃。此 Bug 现已修复。

    自有 ID:OTP-18749 辅助 ID:GH-7608

  • 修复了使用来自启用 Unicode 的 standard_iostandard_error 或任何其他 group 支持的设备,通过 file 读取时,导致返回错误的值或崩溃的 Bug。

    现在,当使用 file 读取 Unicode 数据时,会向调用者返回 no_translation 错误。有关如何正确从 standard_io 读取的更多详细信息,请参阅 STDLIB 用户指南中的使用 Unicode

    自有 ID:OTP-18800 辅助 ID:PR-7714 GH-7591

  • 本机解析器接口模块已对其 ETS 表处理进行了重写,以最大程度地减少术语复制,并将客户端超时处理移至客户端,这有助于本机解析器名称服务器在负载过重时避免陷入泥潭。

    自有 ID:OTP-18812 辅助 ID:ERIERL-997

  • 将某些文件中有意使用 Apache License 2.0 标头替换了无意的 Erlang Public License 1.1 标头。

    自有 ID:OTP-18815 辅助 ID:PR-7780

  • 修复了如果客户端进程既监视组/范围又加入了组,pg 中的 Bug。此类进程的终止会导致 pg 服务器进程崩溃。

    自有 ID:OTP-18833 辅助 ID:GH-7625,PR-7659

  • 修复了当使用 file:consult 且在读取时底层文件读取返回错误时发生的崩溃。

    自有 ID:OTP-18873 辅助 ID:PR-7831

  • 更正了 gen_tcp_socket 监听选项处理。

    自有 ID:OTP-18883 辅助 ID:#7764

改进和新功能

  • 添加了对 DGRAM 套接字连接的 Windows 支持。

    自有 ID:OTP-18762

  • 记录了先前不透明的类型 select_tag() 和 completion_tag()。

    自有 ID:OTP-18818 辅助 ID:#7337

Kernel 9.1

修复的 Bug 和故障

  • 修复了模拟器启动失败时崩溃标语被截断的问题。

    自有 ID:OTP-18623 辅助 ID:GH-7344

  • 修复了 shell:start_interactive 函数规范。

    自有 ID:OTP-18628 辅助 ID:GH-7280

  • 修复了 code:get_doc/1 在无法找到 erts 时返回 missing 而不是崩溃的问题。

    自有 ID:OTP-18654 辅助 ID:PR-7404

  • 函数 socket:close/1 可能会导致 Windows 上的 VM 崩溃。

    自有 ID:OTP-18669 辅助 ID:OTP-18029

  • 修复了在 Windows 上将 erl.exe 用作管道的一部分并尝试设置 standard_io 设备的编码时发生的死锁。

    自有 ID:OTP-18675 辅助 ID:PR-7473 GH-7459

  • 扩展了有关如何使用 standard_iostandard_erroruser I/O 设备的文档。

    添加了类型 io:standard_io/0io:standard:error/0io:user/0

    自有 ID:OTP-18676 辅助 ID:PR-7473 GH-7459

  • 修复了 logger 的过载保护机制,以便仅在需要时获取消息使用的内存。

    自有 ID:OTP-18677 辅助 ID:PR-7418 GH-7417

  • 修复了许多与套接字相关的问题,这些问题导致与 gen_tcp 和 gen_udp 分别不兼容。

    自有 ID:OTP-18685

  • 带有套接字地址和套接字 (inet-) 后端的 gen_tcp:connect 因缺少回调函数而失败。

    自有 ID:OTP-18707 辅助 ID:#7530

  • `inet_res` 使用的 DNS RR 缓存已修复为保留插入顺序,这在 DNS 服务器出于例如负载平衡目的以某种特定顺序返回 RR 时很有益处。

    自有 ID:OTP-18731 辅助 ID:GH-7577,PR-7578

  • `reuseport`、`reuseport_lb` 和 `exclusiveaddruse` 选项在例如 `gen_udp:open/1,2` 中被意外禁止,现在已得到纠正。

    自有 ID:OTP-18734 辅助 ID:OTP-18344,PR-6522,GH-6461,GH-7569

  • 已修复用于二进制模式和被动模式下 Unix 域套接字的 gen_udp:recv/* 不会崩溃的问题。

    自有 ID:OTP-18747 辅助 ID:GH-7605

  • 修复了在导航 shell 历史记录时,光标不会放在表达式末尾的问题。

    自有 ID:OTP-18757 辅助 ID:PR-7631

改进和新功能

  • 更新 gen_tcp_socket 和 gen_udp_socket 以处理“完成”(Windows 上的套接字)。

    自有 ID:OTP-18586 辅助 ID:OTP-18029

  • 为 Windows 上用于“套接字”的 Unix 域套接字(仅用于 STREAM 套接字)添加了基本支持。

    自有 ID:OTP-18611 辅助 ID:OTP-18029,#5024

  • 为 Windows 上的套接字 ioctl 添加了基本支持。

    自有 ID:OTP-18660

  • file:location/0 类型现在已导出。

    自有 ID:OTP-18681

  • 添加了对(Windows)套接字选项 exclusiveaddruse 的支持。

    自有 ID:OTP-18686

  • [套接字] 添加了对“nopush”选项的支持。

    自有 ID:OTP-18687

  • 添加了对套接字选项“BSP STATE”的支持。

    自有 ID:OTP-18693

  • 添加了 tcp 套接字选项“keepcnt”、“keepidle”和“keepintvl”。

    自有 ID:OTP-18698

  • 添加了对 misc (Windows) 套接字选项(“max_msg_size”和“maxdg”)的支持。

    自有 ID:OTP-18710

  • shell 的键盘快捷键现在可配置。

    自有 ID:OTP-18754 辅助 ID:PR-7604 PR-7647

  • 优化了 code_server,以减少并发加载同一模块时的重复工作。

    自有 ID:OTP-18755 辅助 ID:PR-7503

Kernel 9.0.2

修复的 Bug 和故障

  • 修复了在终端中输入 Alt+Enter 时,光标会移动到最后一行而不是移动到下一行的 Bug。

    自有 ID:OTP-18580 辅助 ID:PR-7242

  • 修复了当 termcap 不可用时,shell 不会在启动时崩溃的问题。

    自有 ID:OTP-18624 辅助 ID:GH-7296

  • 多个 socket:accept 调用问题。进行多个 accept 调用时,只有最后一个调用处于活动状态。

    自有 ID:OTP-18635 辅助 ID:#7328

  • 修复了 shell,使其在终端功能报告应该使用时忽略终端延迟。

    自有 ID:OTP-18636 辅助 ID:PR-7352 GH-7308

  • 修复了 "oldshell" 以在 Windows 上键入时回显字符。

    自有 ID:OTP-18637 辅助 ID:PR-7359 GH-7324

  • 修复了在使用 -noshell 启动 erlang 时从 stdin 读取时的 eof 处理。

    自有 ID:OTP-18640 辅助 ID:PR-7384 GH-7368 GH-7286 GH-6881

  • 在 Windows 上,当有等待读取、写入或接受函数的活动调用时,调用函数 socket:close 可能会挂起。

    自有 ID:OTP-18646

  • 修复了在 Windows 上使用 -noshell 标志启动 erl.exe 时读取或配置 standard_io 时出现的问题。

    自有 ID:OTP-18649 辅助 ID:GH-7261 PR-7400

  • 当地址是主机名(字符串或原子)时,带有 inet_backend = socket 的 gen_udp:connect 失败。

    自有 ID:OTP-18650

  • 修复了如果将特定转义序列写入 stdout,会导致 shell 崩溃的问题。

    自有 ID:OTP-18651 辅助 ID:PR-7242

  • 修复了如果在 shell 中写入提示后收到输出,则输出会消失的问题。

    自有 ID:OTP-18652 辅助 ID:PR-7242

  • 修复了无法在 rebar3 开发版本中找到 erts 位置的崩溃问题。

    自有 ID:OTP-18656 辅助 ID:PR-7404 GH-7390

  • 引入了 KERNEL 应用程序参数 standard_io_encoding,该参数可用于设置 standard_io 的默认编码。如果应用程序希望将所有输入数据视为字节而不是 utf-8 编码的字符,则此选项需要设置为 latin1

    自有 ID:OTP-18657 辅助 ID:GH-7230 PR-7384

Kernel 9.0.1

修复的 Bug 和故障

  • POSIX 错误 exdev 有时在某些错误消息中被错误地描述为“跨域链接”。

    自有 ID:OTP-18578 辅助 ID:GH-7213

  • 更正了套接字发送函数描述(使用 Timeout = nowait 发送)。发送函数无法返回 {ok, {RestData, SelectInfo}}

    自有 ID:OTP-18584 辅助 ID:#7238

内核 9.0

修复的错误和故障

  • 修复了应用程序的 .app 文件中允许重复键的错误。现在会拒绝重复键,如果存在重复键,应用程序将无法启动。

    *潜在的不兼容性*

    自有 ID:OTP-18210 辅助 ID:GH-5877 PR-5878

  • 修复了在条件分支中 logger_formatter 对分支值处理不一致的问题。例如,在此修复之前,在条件分支中使用 msg 将不会按预期格式化。

    自有 ID:OTP-18225 辅助 ID:PR-6036

  • 修复了 logger_std_h 处理程序,使其在因任何原因无法记录到 standard_io 时,将日志记录到 standard_error。

    自有 ID:OTP-18226 辅助 ID:PR-6253

  • 修复了在嵌入模式下启动 Erlang 且在内核完全启动之前完成连接时,TLS 分发无法工作的问题。

    自有 ID:OTP-18248 辅助 ID:PR-6227 GH-6085

  • 改进了 erl -remsh,以提供更好的错误原因,并在使用没有终端支持的 shell(即“oldshell”)时工作。

    自有 ID:OTP-18271 辅助 ID:PR-6279

  • 修复了在内核启动之前生成的日志事件,使其在格式化这些日志消息的代码尚未加载时不会失败。

    自有 ID:OTP-18286 辅助 ID:PR-5955

  • 当启动的进程失败时,proc_lib:start*/* 已变为同步。这要求失败的进程使用新函数 proc_lib:init_fail/2,3 或退出以指示失败。所有 OTP 行为都已修复以执行此操作。

    现在,所有这些启动函数都会为所有错误返回消耗来自进程链接的 'EXIT' 消息。以前,只有 start_link/* 函数执行此操作,并且仅在启动的函数退出时,而不是在使用 init_ack/1,2init_fail/2,3 创建返回值时。

    *潜在的不兼容性*

    自有 ID:OTP-18471 辅助 ID:GH-6339, PR-6843

  • 修复了 file:read(standard_io, ...) 在二进制模式下意外返回 eof 的错误。

    自有 ID:OTP-18486 辅助 ID:PR-6881

  • 修复了 seq_trace:get_token/1 的返回类型。

    自有 ID:OTP-18528 辅助 ID:PR-7009

  • 现在,查找、连接和发送到名称为空的主机,是通过尝试查找根域的地址来处理的,这将会失败。以前,其中一些操作会导致内部异常,这与类型规范相矛盾。

    自有 ID:OTP-18543 辅助 ID:GH-6353

  • 用 ANSI 选择图形再现转义字符的特殊情况处理替换了正则表达式,以加快使用这些转义序列的 io 输出。

    自有 ID:OTP-18547 辅助 ID:PR-7092

改进和新功能

  • Erlang shell 已得到改进,以支持以下功能

    • 自动完成变量、记录名称、记录字段名称、映射键、函数参数类型和文件名。
    • 在 shell 中打开外部编辑器(使用 C-o)以在编辑器中编辑当前表达式。
    • 支持在 shell 中定义记录(带类型)、函数和函数类型规范以及自定义类型。
    • 不要在历史记录中保存寻呼机命令和 io:getline 的输入。

    自有 ID:OTP-14835 辅助 ID:PR-5924

  • TTY/终端子系统已重写,将更多代码从旧的链接驱动程序移动到 Erlang,并在 NIF 中实现了所有需要的 I/O 原语。

    在 Unix 平台上,除了更好地处理 Unicode 字符和修复一些长期存在的错误外,用户应该不会注意到太多差异。

    Windows 用户会注意到 erl.exe 具有与普通 Unix shell 相同的功能,并且 werl.exe 已被删除并替换为指向 erl.exe 的符号链接。这使得 Windows Erlang 终端体验与 Unix 的体验相同。

    重写带来了许多错误修复和功能添加

    • 现在,当 Erlang 退出时,TTY 会被重置,从而修复了 zsh 在终止 Erlang 会话时不会崩溃的问题。
    • standard_error 现在使用与 standard_io 相同的 Unicode 模式。
    • 在使用空搜索字符串搜索 shell 历史记录时,按退格键不再会使 shell 崩溃。
    • 现在,在使用 JCL 接口启动的远程节点上可以使用制表符扩展。
    • 现在可以配置 shell 标语和会话标语(即在启动 Erlang shell 时显示的文本)。有关更多详细信息,请参阅内核文档。
    • 添加了 shell:start_interactive,用于从非交互式 Erlang 会话(例如 escript)启动交互式 shell。
    • 在 Windows 上,当以分离模式启动时,标准处理程序现在设置为 nul 设备,而不是取消设置。
    • 如果支持,标准 I/O 现在始终默认为 unicode 模式。以前,如果运行时系统已使用 -oldshell-noshell 启动(例如在 escript 中),则默认值为 latin1。要通过标准输出发送原始字节,现在必须显式指定 io:setopts(standard_io, [{encoding, latin1}]).

    *潜在的不兼容性*

    自有 ID:OTP-17932 辅助 ID:PR-6144 GH-3150 GH-3390 GH-4343 GH-4225

  • 添加了对 Windows 上套接字的支持。

    • 预发布状态。
    • 错误代码尚未最终确定。
    • 没有对 Windows 特定选项的显式支持(套接字选项、读取和写入的标志)。
    • Windows 的新异步 API(完成)。请参阅(套接字用法)用户指南中的“异步调用”章节。
    • 为确保平台独立性,*计划*使用 gen_tcp 和 gen_udp(尚未更新)。

    自有 ID:OTP-18029

  • 自 OTP 24 版本发布以来宣布,现在强制使用

    • 外部项格式中的版本 4 节点容器类型。也就是说,引用支持多达 5 个 32 位整数标识符,以及支持 64 位数据存储的进程和端口标识符。因此,分发标志 DFLAG_V4_NC 现在也是强制性的。自 OTP 24 以来,OTP 支持此功能。另请注意,term_to_binary()term_to_iovec() 生成的外部格式将无条件地生成支持此更大格式的 pid、端口和引用。
    • 在 OTP 23.3 中引入的新链接协议 现在是强制性的。因此,分发标志 DFLAG_UNLINK_ID 现在也是强制性的。

    由于上述原因,OTP 26 节点将拒绝连接到 OTP 24 之前版本的 OTP 节点。

    *潜在的不兼容性*

    自有 ID:OTP-18140 辅助 ID:PR-6072

  • 已将对内核 TLS (kTLS) 的支持添加到 SSL 应用程序中,用于 TLS 分发(-proto_dist inet_tls)和 SSL 选项 {ktls, true}。将此用于常规 SSL 套接字是不方便、未记录且不推荐的,因为它需要非常依赖于平台的原始选项。

    目前,这仅适用于一些不太旧的 Linux 发行版。大致来说,需要支持用户空间协议和内核模块 tls 的 5.2.0 或更高版本的内核。

    自有 ID:OTP-18235 辅助 ID:PR-6104, PR-5840

  • 添加了 code:get_doc/2,它支持使用 debug_info 块而不是 eep48 doc 块来获取函数的文档框架。

    自有 ID:OTP-18261 辅助 ID:PR-5924

  • Erlang shell 在键入 tab 时的自动完成已更改为在编辑当前行之后而不是之前发生。

    此行为可以使用 shell_expand_location STDLIB 配置参数进行配置。

    自有 ID:OTP-18278 辅助 ID:PR-6260

  • 现在,在 shell 中键入 Ctrl+L 会清除屏幕并重绘当前行,而不仅仅是重绘当前行。要仅重绘当前行,现在必须键入 Alt+L。这使 Ctrl+L 的行为更接近 bash 和其他 shell 的工作方式。

    *潜在的不兼容性*

    自有 ID:OTP-18285 辅助 ID:PR-6262

  • 通过缓存回调函数优化了 gen_server

    自有 ID:OTP-18305 辅助 ID:PR-5831

  • 为升级准备 pg 通信协议。计划是使 OTP-28 节点能够使用升级的 pg 协议,同时仍然能够与 OTP 26 节点通信。

    自有 ID:OTP-18327 辅助 ID:PR-6433

  • 新的 disk_log 日志类型 rotate,其中日志文件在轮换时压缩。

    自有 ID:OTP-18331 辅助 ID:ERIERL-870

  • 引入了以下 inet:setopts/2 选项

    • reuseport - 重用本地端口。可能会或可能不会根据底层操作系统提供负载平衡。

    • reuseport_lb - 重用本地端口。提供负载平衡。

    • exclusiveaddruse - Windows 上的独占地址/端口使用。此套接字选项特定于 Windows,在其他系统上将被静默忽略。

    在 Windows 上设置 reuseaddr 的行为已以*向后不兼容*的方式更改。现在,只有在设置了 reusaddrreuseport inet 选项的情况下,才会设置底层 SO_REUSEADDR 套接字选项。这是因为 Windows 上的底层 SO_REUSEADDR 套接字选项的行为类似于在设置了底层套接字选项 SO_REUSEADDRSO_REUSEPORT 时 BSD 的行为。有关更多信息,请参阅 reuseaddr 选项的文档。

    *潜在的不兼容性*

    自有 ID:OTP-18344 辅助 ID:PR-6522, PR-6944, OTP-18324, PR-6481, GH-6461

  • 将 size/1 替换为 tuple_size/1 或 byte_size/1

    JIT 不会优化 size/1 BIF,并且其使用会导致 Dialyzer 的类型更差。

    当已知正在测试的值必须是元组时,应始终首选 tuple_size/1

    当已知正在测试的值必须是二进制时,应首选 byte_size/1。但是,byte_size/1 也接受位串(将大小向上舍入为整数个字节),因此必须确保在调用 byte_size/ 之前调用 is_binary/1,以确保拒绝位串。请注意,编译器会删除对 is_binary/1 的冗余调用,因此如果不确定以前的代码是否已确保参数是二进制,则在调用 byte_size/1 之前添加 is_binary/1 测试不会造成损害。

    自有 ID: OTP-18405 辅助 ID: GH-6672,PR-6702,PR-6768,PR-6700,PR-6769,PR-6812,PR-6814

  • 函数 file:pid2name/1 已弃用,将在 Erlang/OTP 27 中移除。

    自有 ID: OTP-18419

  • Erlang DNS 解析器模块 inet_res 和辅助模块已更新以支持 RFC6891;可以处理带有 DNSSEC OK (DO) 位的 OPT RR。

    自有 ID: OTP-18442 辅助 ID: PR-6786, GH-6606

  • 引入了 application:get_supervisor/1

    自有 ID: OTP-18444 辅助 ID: PR-6035

  • 通过在嵌入模式的启动顺序中添加一个额外的步骤来改进 on_load 模块在启动时的处理,该步骤运行所有 on_load 处理程序,而不是依赖于稍后在内核监管树启动时显式调用它们。

    这主要是一个代码改进和 OTP 内部简化,以避免未来的错误并简化代码维护。

    自有 ID: OTP-18447

  • 通过在客户端进行代码准备来减少 code_server 上的争用。

    自有 ID: OTP-18448 辅助 ID: PR-6736

  • 添加了一种模式来确保所有加载,以并发启动子应用程序及其依赖项。

    自有 ID: OTP-18451 辅助 ID: PR-6737

  • 缓存 OTP 启动代码路径,以限制模块查找期间访问的文件夹数量。可以使用 -cache_boot_path false 禁用。OTP 启动代码路径由 ERL_LIB 环境变量组成。各种 otp/*/ebin 文件夹。以及 init 脚本中的 {path, ...} 子句。

    自有 ID: OTP-18452 辅助 ID: PR-6729

  • 内核和 SSL 中的 Erlang 分布代码进行了一些重构,以方便调试和重用,这不应该对行为或性能产生任何明显的影响。

    自有 ID: OTP-18456

  • 向代码路径 API 添加缓存属性。

    向所有 code:add_path、code:set_path 和 code:replace_path* 函数添加了一个可选的 cache/nocache 参数。如果它们被缓存,这些函数将避免进行文件访问。可以使用 code:clear_cache/0 清除缓存。添加了 code:del_paths/1,以便更容易清除多个路径。

    自有 ID: OTP-18466 辅助 ID: PR-6832

  • 弃用 dbg:stop_clear/0,因为它只是 dbg:stop/0 的函数别名。

    自有 ID: OTP-18478 辅助 ID: GH-6903

  • 改进了 code:ensure_modules_loaded/1:之前它会准备模块,如果这些模块有 on_load 回调,则会放弃对这些模块的引用。此拉取请求使其保留这些引用,然后串行加载它们,而无需再次获取对象代码并准备它们。

    自有 ID: OTP-18484 辅助 ID: PR-6844

  • 内部 DNS 解析器已更新以处理 DNS LOC RR:s (RFC 1876)。这是一个未记录的模块,但仍被高级用户使用。请参阅源代码。

    自有 ID: OTP-18510 辅助 ID: GH-6098, PR-6982

  • 减少了在 global 中通知其他节点关于连接丢失时的内存消耗。

    自有 ID: OTP-18521 辅助 ID: PR-7025

  • net_kernelglobalglobal_group 服务器现在始终启用完全异步的分布式信号,这可以防止它们在发送分布式信号时被阻塞。

    关于阻塞分布式信号的文档也得到了改进。

    自有 ID: OTP-18533 辅助 ID: PR-7061

  • 允许将 IPv6 地址作为主机,在 erlang:decode_packet/3gen_tcp 数据包选项解码的 http 数据包中。根据 RFC2732,IPv6 地址应括在 [] 中。

    自有 ID: OTP-18540 辅助 ID: PR-6900

  • 移除 OTP-26 中已弃用的函数

    自有 ID: OTP-18542

  • 移除了 code:is_module_native/1,因为 HiPE 已被移除。自 OTP 24 起,它已被弃用,并计划在 OTP 26 中移除。

    移除了 code:rehash/0,因为代码路径功能不再存在。自 OTP 19 起,它已被弃用,自 OTP 24 起,计划在 OTP 26 中移除。

    *潜在的不兼容性*

    自有 ID: OTP-18551 辅助 ID: PR-7106

  • 在 shell 中添加了对多行表达式和导航的支持。添加了新的快捷键

    • 向上导航 (ctrl+up)/(alt+up)
    • 向下导航 (ctrl+down)/(alt+down)
    • 在行中间插入换行符 (alt+enter)
    • 导航到顶部 (alt+<)/(alt+shift+up)
    • 导航到底部 (alt+>)/(alt+shift+down)
    • 清除当前表达式 (alt+c)
    • 取消搜索 (alt+c)
    • 在 mac 上打开编辑器 (option+o)/(alt+o)

    修改新行的提示符,使其更清楚地表明提示符已进入多行模式。支持窗口大小较小的终端,建议不低于 7 行和 40 列。修改搜索提示符以支持多行语句。从 JCL 菜单继续后重绘提示符。

    自有 ID: OTP-18575 辅助 ID: PR-7169

Kernel 8.5.4.3

修复的错误和故障

  • 修复了 gen_udp:open/2 类型规范,以包含已支持的模块套接字地址类型。

    自有 ID: OTP-19050 辅助 ID: OTP-18990

Kernel 8.5.4.2

修复的错误和故障

  • 带有套接字地址和套接字 (inet-) 后端的 gen_tcp:connect 因缺少回调函数而失败。

    自有 ID:OTP-18707 辅助 ID:#7530

Kernel 8.5.4.1

修复的错误和故障

  • 多个 socket:accept 调用问题。进行多个 accept 调用时,只有最后一个调用处于活动状态。

    自有 ID:OTP-18635 辅助 ID:#7328

  • 当地址是主机名(字符串或原子)时,带有 inet_backend = socket 的 gen_udp:connect 失败。

    自有 ID:OTP-18650

Kernel 8.5.4

修复的错误和故障

  • 修复了 Windows 上的一个错误,其中 file:read_file_info/1 对于具有损坏元数据的文件会失败。

    自有 ID: OTP-18348 辅助 ID: GH-6356

  • 接受来自未使用 epmd 的 OTP 23 和 24 节点的连接设置。

    自有 ID: OTP-18404 辅助 ID: GH-6595, PR-6625

Kernel 8.5.3

修复的错误和故障

  • tcp 连接选项 'bind_to_device' 不能与 inet_backend = 'socket' 一起使用。'inet' 需要值类型 binarry(),'socket' 需要值类型 'string()'。

    自有 ID: OTP-18357 辅助 ID: #6509

  • 在调用 gen_tcp:connect 时,当使用 sockaddr() 和 inet_backend = socket 时,处理选项的小问题。

    自有 ID: OTP-18358 辅助 ID: #6528

Kernel 8.5.2

修复的错误和故障

  • 修复了当另一端关闭套接字时,gen_tcp 套接字后端中的关闭崩溃。

    自有 ID: OTP-18270 辅助 ID: #6331

  • erl_tar 现在可以读取经过填充的 gzip 压缩的 tar 文件。 file:open/2 有一个新的选项 compressed_one,它将从 gzip 文件中读取单个成员。

    自有 ID: OTP-18289 辅助 ID: PR-6343

  • 修复了 os:cmd 不将抛出的所有异常转换为 badarg 的问题。例如,来自 erlang:open_portemfile 被转换为 badarg

    此错误自 Erlang/OTP 24 以来一直存在。

    自有 ID: OTP-18291 辅助 ID: PR-6382

  • 函数 net:if_names/0 的规范不正确

    自有 ID: OTP-18296 辅助 ID: OTP-16464

  • 当使用带有 'socket' inet_backend 的 gen_udp 时,缺少 TOS 和 TTL 的 ctrl 选项名称转换(在 FreeBSD 上)。

    自有 ID: OTP-18315

  • 带有选项 add_membership 或 drop_membership 的 gen_udp:open/2 会删除较早的选项。

    自有 ID: OTP-18323 辅助 ID: #6476

  • 除非套接字是 UDP 套接字,否则在 Windows 上将忽略 inet:setopts/2 {reuseaddr, true} 选项。有关更多信息,请参阅 inet:setopts/2 文档中关于 reuseaddr 选项的文档。

    在 OTP 25 之前,在 Windows 上所有套接字都忽略了 {reuseaddr, true} 选项,但从 OTP 25.0 开始,此选项已更改为不忽略任何套接字。

    *潜在的不兼容性*

    自有 ID: OTP-18324 辅助 ID: GH-6461, PR-6481

改进和新功能

  • 清理了 inet_tcp_dist 中的分布式套接字选项处理,以明确哪些是必需的,哪些只是具有默认值。

    自有 ID: OTP-18293

  • 改进 gen_tcp_socket 的警告消息格式。

    自有 ID: OTP-18317

Kernel 8.5.1

修复的错误和故障

  • 使用套接字模块创建的侦听套接字泄漏了 (erlang-) 监视器。

    自有 ID: OTP-18240 辅助 ID: #6285

  • 当监管控制连接的进程崩溃时,peer 节点未能停止。当使用备用控制连接时,当 peer 节点被启动它的节点停止时,此监管进程也经常崩溃,这会导致 peer 节点在没有停止的情况下徘徊。

    自有 ID: OTP-18249 辅助 ID: PR-6301

Kernel 8.5

修复的错误和故障

  • 修复了由于 nodeup/nodedown 消息在连接上的流量之前/之后未传递而导致的 global 中的不一致性错误。还修复了 global_groupglobal 中的各种其他不一致性错误和死锁。

    作为这些修复的基础,引入了一个新的 BIF erlang:nodes/2,并扩展了 net_kernel:monitor_nodes/2

    如果命令行上存在多个实例,-hidden-connect_all 命令行参数将无法工作,此问题已得到修复。为了替换 -connect_all 命令行参数,还引入了新的内核参数 connect_all

    自有 ID:OTP-17934 辅助 ID:PR-6007

  • 修复了 IPv6 multicast_if 和成员套接字选项。

    自有 ID:OTP-18091 辅助 ID:#5789

  • 修复了在纯 IPv6 Windows 上 inet:getifaddrs 挂起的问题

    自有 ID:OTP-18102 辅助 ID:#5904

  • 关于 SCTP 选项,inet:getopts/2inet:setopts/2 的类型规范已更正。

    自有 ID:OTP-18115 辅助 ID:PR-5939

  • inet:parse_* 的类型规范已收紧。

    自有 ID:OTP-18121 辅助 ID:PR-5972

  • 修复了 gen_tcp:connect/3 规范以包含 inet_backend 选项。

    自有 ID:OTP-18171 辅助 ID:PR-6131

  • 修复了当调用 logger:log(Level, Format, Args)(或任何其他日志记录函数)时,使用二进制格式会导致崩溃或日志记录不正确的问题。

    自有 ID:OTP-18229 辅助 ID:PR-6212

改进和新功能

  • 为基于 inet-driver 的套接字(如 gen_tcp 和 gen_udp)添加了基本的调试功能(选项)。

    自有 ID:OTP-18032

  • net_kernel:start/2 中引入了 hiddendist_listen 选项。

    还记录了 -dist_listen 命令行参数,该参数错误地记录为 kernel 参数,而不是命令行参数。

    自有 ID:OTP-18107 辅助 ID:PR-6009

  • pg 中引入了作用域和组监视。有关更多信息,请参阅 pg:monitor_scope()pg:monitor()pg:demonitor() 的文档。

    自有 ID:OTP-18163 辅助 ID:PR-6058,PR-6275

  • 引入了一个新函数 global:disconnect/0,可以使用它来干净地断开节点与 global 节点集群中所有其他节点的连接。

    自有 ID:OTP-18232 辅助 ID:OTP-17843,PR-6264

Kernel 8.4.2

已修复的错误和故障

  • 在建立连接的同时调用 net_kernel:setopts(new, Opts) 可能会导致 net_kernel 进程和建立连接的进程之间发生死锁。

    自有 ID:OTP-18198 辅助 ID:GH-6129,PR-6216

Kernel 8.4.1

已修复的错误和故障

  • DNS 解析器 inet_res 已被修复,在验证响应时,它会忽略发送的请求和接收的响应之间请求域中的尾随点差异。

    自有 ID:OTP-18112 辅助 ID:ERIERL-811

  • 修复了 inet_res 中的一个错误,其中缺少内部的 {ok,_} 包装器导致 inet_res:resolve/* 在解析 IP 地址或作为 IP 地址字符串的主机名时,返回计算的主机名而不是 {ok,Msg} 元组。

    自有 ID:OTP-18122 辅助 ID:GH-6015,PR-6020

  • 在配置的分布式服务可用之前,erlang:is_alive() BIF 可能会返回 true。此错误是在 OTP 25.0 ERTS 版本 13.0 中引入的。

    即使配置的分布式服务可用,erlang:monitor_node()erlang:monitor() BIF 也可能错误地失败。如果这些 BIF 在使用动态节点名称分配启动分布式服务之后但在分配名称之前被调用,则会发生这种情况。

    自有 ID:OTP-18124 辅助 ID:OTP-17558,PR-6032

  • gen_tcp_dist 示例中添加了缺少的强制性 address/0 回调。

    自有 ID:OTP-18136

Kernel 8.4

已修复的错误和故障

  • DNS 解析器实现已重写,以更彻底地验证回复,并进行了一些优化以减少垃圾的产生。

    自有 ID:OTP-17323

  • 套接字选项“reuseaddr”在 Windows 上不再被忽略。

    自有 ID:OTP-17447 辅助 ID:GH-4819

  • 修复了当调用 logger:log(Level, Format, Args)(或任何其他日志记录函数)时,使用原子 stringreport 作为格式会导致崩溃或日志记录不正确的问题。

    自有 ID:OTP-17551 辅助 ID:GH-5071 PR-5075

  • 从 OTP 25 开始,global 默认情况下将通过主动断开与报告已丢失与其他节点连接的节点的连接来防止由于网络问题而导致的重叠分区。这将导致形成完全连接的分区,而不是将网络置于具有重叠分区的状态。

    可以使用 prevent_overlapping_partitions kernel(6) 参数禁用防止重叠分区,使 global 的行为像以前一样。然而,对于所有期望提供完全连接的网络的应用程序(例如 mnesia),以及对于 global 本身,这都是有问题的。重叠分区的网络可能会导致 global 的内部状态变得不一致。即使在将这些分区合并在一起以再次形成完全连接的网络之后,这种不一致性仍然可能存在。对期望保持完全连接网络的其他应用程序的影响可能会有所不同,但在这种分区期间,它们可能会以非常微妙且难以检测的方式发生故障。由于您可能会遇到难以检测的问题而没有此修复程序,因此强烈建议您不要禁用此修复程序。另请注意,此修复程序必须在网络中的所有节点上启用才能正常工作。

    *潜在的不兼容性*

    自有 ID:OTP-17911 辅助 ID:PR-5687,PR-5611,OTP-17843

  • 启动用于名称解析的辅助程序;inet_gethost,已得到改进,可以使用绝对文件系统路径来确保启动正确的程序。

    如果无法启动辅助程序,则系统现在会停止运行,以避免在名称解析器静默损坏的情况下运行。

    自有 ID:OTP-17958 辅助 ID:OTP-17978

  • inet_res:getbyname/2,3 的类型规范已更正,以反映它可以返回特殊的 #hostent{} 记录。

    自有 ID:OTP-17986 辅助 ID:PR-5412,PR-5803

  • code:module_status/1 总是会将从存档加载的 BEAM 文件报告为 modified,并且 code:modified_modules/0 总是会返回从存档加载的所有模块的名称。

    自有 ID:OTP-17990 辅助 ID:GH-5801

  • 在日志记录器中,通过使用 erlang 定时器而不是定时器模块的定时器来修复文件处理程序关闭延迟。

    自有 ID:OTP-18001 辅助 ID:GH-5780 PR-5829

  • 修复了在失败时日志记录器生成的日志事件中的元数据不包含原始日志事件的元数据的问题。

    自有 ID:OTP-18003 辅助 ID:PR-5771

  • 修复日志记录器文件后端以重新创建已删除的日志文件夹。

    自有 ID:OTP-18015 辅助 ID:GH-5828 PR-5845

  • [套接字] sockaddr 的编码已得到改进。

    自有 ID:OTP-18020

  • 修复了使用不完整的 unicode 数据向 io 服务器发出的 put_chars 请求,使其以 no_translation 错误退出。

    自有 ID:OTP-18070 辅助 ID:PR-5885

改进和新功能

  • net 模块现在可以在 Windows 上运行。

    自有 ID:OTP-16464

  • Erlang 安装目录现在可以在文件系统上重定位,前提是安装的 RELEASES 文件中的路径是相对于安装根目录的路径。如果将其 RootDir 参数设置为空字符串,则 `release_handler:create_RELEASES/4 函数可以生成一个具有相对路径的 RELEASES 文件。

    自有 ID:OTP-17304

  • 以下分发标志现在是强制性的:DFLAG_BIT_BINARIESDFLAG_EXPORT_PTR_TAGDFLAG_MAP_TAGSDFLAG_NEW_FLOATSDFLAG_FUN_TAGS。这主要涉及自己实现分发协议的库或应用程序。

    自有 ID:OTP-17318 辅助 ID:PR-4972

  • 修复 os:cmd 使其在 Android 操作系统上工作。

    自有 ID:OTP-17479 辅助 ID:PR-4917

  • 配置文件 .erlang.erlang.cookie.erlang.crypt 现在可以位于 XDG 配置主目录中。

    有关更多详细信息,请参阅每个文件的文档和 filename:basedir/2

    自有 ID:OTP-17554 辅助 ID:GH-5016 PR-5408 OTP-17821

  • 动态节点名称改进:erlang:is_alive/0 更改为对挂起的动态节点名称返回 true,以及新函数 net_kernel:get_state/0

    自有 ID:OTP-17558 辅助 ID:OTP-17538,PR-5111,GH-5402

  • gen_statem 中,回调结果类型的类型已通过元数为 2 的类型进行了扩充,其中回调模块可以指定回调数据的类型,以便回调模块可以获得它的类型验证。

    自有 ID:OTP-17589 辅助 ID:PR-4926

  • 标记的元组测试和函数调用已得到优化,现在比以前稍微便宜一些。

    通过确保所有装箱的项在元数字字之后至少分配一个字,这些优化成为可能。这是通过让所有空元组引用相同的空元组文字来实现的,这也减少了空元组的内存使用。

    自有 ID:OTP-17608

  • 引入了 net_ticker_spawn_options kernel 配置参数,可以使用它为分发通道定时器进程设置生成选项。

    自有 ID:OTP-17617 辅助 ID:PR-5069

  • 大多数(或至少是最常用的)rpc 操作现在需要 erpc 支持才能与其他 Erlang 节点通信。erpc 是在 OTP 23 中引入的。也就是说,针对 OTP 23 之前版本的 Erlang 节点的 rpc 操作将会失败。

    *潜在的不兼容性*

    自有 ID:OTP-17681 辅助 ID:PR-5307

  • 新模块 peer 取代了 slave 模块。slave 模块现在已弃用,将在 OTP 27 中删除。

    peer 包含一个扩展且更强大的 API 用于启动 erlang 节点。

    自有 ID:OTP-17720 辅助 ID:PR-5162

  • 为了方便用户管理多个未完成的异步 call 请求,erpcgen_servergen_statemgen_event 中引入了使用请求标识符集合的新功能。

    自有 ID:OTP-17784 辅助 ID:PR-5792

  • 类型规范已添加到 gen_server 中,并且文档已更新以使用此规范。

    这暴露了一些类型违规,这些违规已在 globallogger_olprpc 中得到纠正。

    自有 ID:OTP-17915 辅助 ID:PR-5751、GH-2375、GH-2690

  • IP 地址验证函数 is_ipv4_address/1is_ipv6_address/1is_ip_address/1 已添加到 Kernel 中的模块 inet 中。

    自有 ID:OTP-17923 辅助 ID:PR-5646

  • gen_sctp:connectx_init/* 的形式添加了多宿主 SCTP 连接的 API。

    自有 ID:OTP-17951 辅助 ID:PR-5656

  • [socket] 添加了类型 sockaddr_ll(系列 'packet')的字段 hatype 的编码。

    自有 ID:OTP-17968 辅助 ID:OTP-16464

  • 添加了对 EEP-60 中描述的可配置功能的支持。可以在编译期间使用选项(-enable-feature Feature-disable-feature Feature+{feature, Feature, enable|disable})到 erlc 以及使用文件中的指令(-feature(Feature, enable|disable).)启用/禁用功能。类似的选项可以用于 erl,以启用/禁用运行时允许的功能。新的 maybe 表达式(EEP-49)完全支持作为功能 maybe_expr。该功能支持已在参考手册中进行了文档说明。

    自有 ID:OTP-17988

Kernel 8.3.2.4

已修复的 Bug 和故障

  • 带有套接字地址和套接字 (inet-) 后端的 gen_tcp:connect 因缺少回调函数而失败。

    自有 ID:OTP-18707 辅助 ID:#7530

Kernel 8.3.2.3

已修复的 Bug 和故障

  • 函数 net:if_names/0 的规范不正确

    自有 ID: OTP-18296 辅助 ID: OTP-16464

  • 当使用带有 'socket' inet_backend 的 gen_udp 时,缺少 TOS 和 TTL 的 ctrl 选项名称转换(在 FreeBSD 上)。

    自有 ID: OTP-18315

  • tcp 连接选项 'bind_to_device' 不能与 inet_backend = 'socket' 一起使用。'inet' 需要值类型 binarry(),'socket' 需要值类型 'string()'。

    自有 ID: OTP-18357 辅助 ID: #6509

  • 在调用 gen_tcp:connect 时,当使用 sockaddr() 和 inet_backend = socket 时,处理选项的小问题。

    自有 ID: OTP-18358 辅助 ID: #6528

改进和新功能

  • 改进 gen_tcp_socket 的警告消息格式。

    自有 ID: OTP-18317

Kernel 8.3.2.2

改进和新功能

  • 引入了一个新函数 global:disconnect/0,可以使用它来干净地断开节点与 global 节点集群中所有其他节点的连接。

    自有 ID:OTP-18232 辅助 ID:OTP-17843,PR-6264

Kernel 8.3.2.1

已修复的 Bug 和故障

  • 在建立连接的同时调用 net_kernel:setopts(new, Opts) 可能会导致 net_kernel 进程和建立连接的进程之间发生死锁。

    自有 ID:OTP-18198 辅助 ID:GH-6129,PR-6216

Kernel 8.3.2

已修复的 Bug 和故障

  • 使用 inet-backend 'socket' 创建的套接字的 'raw' 选项的 inet:getopts/2 失败。

    自有 ID:OTP-18078 辅助 ID:GH-5930

  • 在使用 inet_backend = socket 时,更正了关闭函数的行为。它与“旧” gen_tcp 的兼容性不够。

    自有 ID:OTP-18080 辅助 ID:GH-5930

Kernel 8.3.1

已修复的 Bug 和故障

  • 修复了从同一节点静默关闭先前建立的连接后,接受连接设置失败的问题。

    自有 ID:OTP-17979 辅助 ID:ERIERL-780

  • 修复了如果历史记录日志文件存在问题,在 shell 中键入 Ctrl-R 可能导致挂起的问题。

    自有 ID:OTP-17981 辅助 ID:PR-5791

Kernel 8.3

已修复的 Bug 和故障

  • 已更正 gen_tcpsend_timeout 的处理,以便在发送 0 个字节时也遵守超时。

    自有 ID:OTP-17840

  • 默认情况下,当由于网络问题导致连接丢失时,global 不会采取任何措施来恢复完全连接的网络。对于所有期望提供完全连接网络的应用程序(例如 mnesia),以及 global 本身,这都是有问题的。重叠分区的网络可能导致 global 的内部状态不一致。即使在将这些分区合并在一起形成完全连接的网络之后,这种不一致性也可能仍然存在。对期望维护完全连接网络的其他应用程序的影响可能会有所不同,但在这种分区期间,它们可能会以非常微妙且难以检测的方式发生错误。

    为了防止此类问题,我们引入了一个防止重叠分区的修复程序,可以使用 prevent_overlapping_partitions kernel(6) 参数启用该修复程序。启用此修复程序后,global 将主动断开与报告已断开与其他节点连接的节点的连接。这将导致形成完全连接的分区,而不是使网络处于具有重叠分区的状态。请注意,为了正常工作,必须在网络中的所有节点上启用此修复程序。由于这会相当大地改变行为,因此目前默认情况下禁用此修复程序。但是,由于您可能会在没有此修复程序的情况下遇到难以检测到的问题,因此强烈建议您启用此修复程序以避免出现上述问题。从 OTP 25 开始,此修复程序将默认启用。

    自有 ID:OTP-17843 辅助 ID:ERIERL-732、PR-5611

  • 修复了当记录包含不正确列表的报告时 logger 会崩溃的 bug。

    自有 ID:OTP-17851

  • 使 erlang:set_cookie 适用于动态节点名称。

    自有 ID:OTP-17902 辅助 ID:GH-5402、PR-5670

改进和新功能

  • 添加了在使用 gen_sctp、gen_tcp 和 gen_udp 时使用 socket:sockaddr_in() 和 socket:sockaddr_in6() 的支持。这将使得可以使用链路本地 IPv6 地址。

    自有 ID:OTP-17455 辅助 ID:GH-4852

  • 引入了 net_tickintensity kernel 参数。它可以用于控制在 net_ticktime 期间的刻度数。

    还引入了新的 net_kernel:start/2 函数,以便更容易添加新选项。已弃用 net_kernel:start/1 的使用。

    自有 ID:OTP-17905 辅助 ID:ERIERL-732、PR-5740

  • 改进了动态节点名称功能的文档。

    自有 ID:OTP-17918

Kernel 8.2

已修复的 Bug 和故障

  • socket:which_sockets( pid() ) 在查找套接字所有者时使用错误的关键字('ctrl' 而不是 'owner')。

    自有 ID:OTP-17716

  • 在 epmd_ntop 中,#if defined(EPMD6) 条件被反转,并且仅当 EPMD6 未定义时才包含特定于 IPv6 的代码。这导致 IPv6 地址被解释为 IPv4 地址,并生成无意义的 IPv4 地址作为输出。

    有几个地方错误地使用 'num_sockets' 而不是 'i' 来索引到 iserv_addr 数组中进行错误记录。这将导致读取 iserv_addr 数组中未初始化的数据。

    感谢 John Eckersberg 提供此修复程序。

    自有 ID:OTP-17730

  • erl_uds_dist 分布模块示例进行微小的修复。

    自有 ID:OTP-17765 辅助 ID:PR-5289

  • 已修复传统 TCP 套接字适配模块 gen_tcp_socket 的一个 bug,它在给定文件描述符时绑定到套接字地址,但不应如此。

    自有 ID:OTP-17793 辅助 ID:PR-5348、OTP-17451、PR-4787、GH-4680、PR-2989、OTP-17216

  • 改进了由于参数无效导致 open_port/2 失败时的错误打印输出。

    自有 ID:OTP-17805 辅助 ID:PR-5406

  • 在已关闭的套接字上调用 socket:monitor/1 应该成功并导致立即的 DOWN 消息。现在已修复此问题。

    自有 ID:OTP-17806

  • 修复了配置选项 logger_metadata 以使其正常工作。

    自有 ID:OTP-17807 辅助 ID:PR-5418

  • 修复了 tls 和非 tls 分布,以使用 erl_epmd:address_please 来确定在连接到远程节点时应使用 IPv4 还是 IPv6 地址。

    在此修复之前,远程节点主机名的 DNS 查找确定了要使用的 IP 版本,这意味着主机名必须解析为有效的 IP 地址。

    自有 ID:OTP-17809 辅助 ID:PR-5337 GH-5334

改进和新功能

  • 添加 logger:reconfigure/0

    自有 ID:OTP-17375 辅助 ID:PR-4663 PR-5186

  • 添加套接字设备控制的套接字函数 ioctl/2,3,4。

    自有 ID:OTP-17528

  • 为 gen_tcp_socket 和 gen_udp_socket 添加了对 socknames/1 的简单支持。

    自有 ID:OTP-17531

  • gen_statem 中,回调结果类型的类型已通过元数为 2 的类型进行了扩充,其中回调模块可以指定回调数据的类型,以便回调模块可以获得它的类型验证。

    自有 ID:OTP-17738 辅助 ID:PR-4926、OTP-17589

Kernel 8.1.3

已修复的 Bug 和故障

  • 已修复内部、未记录但已使用的模块 inet_dns,以处理 Class 字段的 mDNS 高位使用。

    使用先前过时、未记录且未使用的记录字段 #dns_rr.func 的代码需要更新,因为该字段现在用作 mDNS 高 Class 位的布尔标志。使用同样未记录的记录 #dns_query 的代码需要重新编译,因为已为 mDNS 高 Class 位添加了布尔字段 #dns_query.unicast_response

    *潜在的不兼容性*

    自有 ID:OTP-17734 辅助 ID:GH-5327、OTP-17659

  • 在 OTP-24.1.2 中发布的 PR-5120 中,针对 Linux 在重新连接 UDP 套接字时的行为的修复已得到改进,仅在套接字已连接的情况下,即仅在重新连接时,才在连接之前断开套接字的连接。

    这允许代码使用临时端口打开套接字,获取端口号并连接;而端口号不会更改(在 Linux 上)。事实证明,这至少有一个有效的用例(除了测试用例外)。

    如果重新连接套接字,则端口号可能会在 Linux 上更改;这是一个已知的怪癖,可以通过在打开套接字时绑定到特定端口号来解决。如果可以不用临时端口,那就好了...

    自有 ID:OTP-17736 辅助 ID:GH-5279、PR-5120、OTP-17559

Kernel 8.1.2

已修复的 Bug 和故障

  • 已清理未记录的 DNS 编码/解码模块 inet_dns,以便以更一致的方式处理“符号”记录和“原始”记录之间的差异。

    PR-5145/OTP-17584 引入了一个变更,加剧了已经存在的混淆,此更正旨在补救这种情况。

    自有 ID:OTP-17659 辅助 ID:ERIERL-702

Kernel 8.1.1

修复的 Bug 和故障

  • 当监视套接字时,为 DOWN 消息添加更多关于套接字“类型”(“socket”或“port”)的信息。

    自有 ID:OTP-17640

Kernel 8.1

修复的 Bug 和故障

  • 以下 BIF 的扩展错误信息已得到更正和改进:binary_to_existing_atom/2, list_to_existing_atom/1, erlang:send_after/{3,4}, 和 erlang:start_timer/{3,4}.

    自有 ID:OTP-17449 辅助 ID:GH-4900

  • 修复了罕见的 Bug,该 Bug 可能导致 net_kernel 进程永远挂起。据观察,当远程节点重启时,使用大量 TLS 连接会发生这种情况。该 Bug 自 OTP-22.0 以来就存在。

    自有 ID:OTP-17476 辅助 ID:GH-4931, PR-4934

  • 改进了对 inet:info/1 的已关闭套接字的处理。

    自有 ID:OTP-17492

  • 此更改修复了在 pull-request #2675 中引入的性能问题。Pull-request #2675 使得系统尝试启动已启动应用程序的子项,这是不必要的。此更改修复了此性能问题。

    自有 ID:OTP-17519

  • 修复了当模块位于 escript 中时 code:get_doc/1 会崩溃的问题。

    自有 ID:OTP-17570 辅助 ID:PR-5139 GH-4256 ERL-1261

  • 原生 DNS 解析器中对结果值的解析已加强了防御能力,以防止不正确的结果。

    自有 ID:OTP-17578 辅助 ID:ERIERL-683

  • 修复了旧式套接字适配器的选项处理中的一个 Bug,即当使用 inet_backend = socket 时。现在,套接字选项在 bind() 调用之前设置,因此例如关于地址重用的选项具有预期的效果。

    自有 ID:OTP-17580 辅助 ID:GH-5122

  • inet:ntoa/1 已修复为不接受无效的数字地址。

    自有 ID:OTP-17583 辅助 ID:GH-5136

  • 改进了对已知类型的 DNS 记录的解析,以不接受并以原始格式呈现格式错误的记录。

    自有 ID:OTP-17584 辅助 ID:PR-5145

  • {ip,add_membership}{ip,drop_membership} 套接字选项的 ip_mreq() 类型已更正为具有 interface 字段,而不是错误地具有 address 字段。

    自有 ID:OTP-17590 辅助 ID:PR-5170

改进和新功能

  • 添加了一个简单的实用函数,用于在 erlang shell 中显示现有套接字 (socket:i/0)。

    自有 ID:OTP-17376 辅助 ID:OTP-17157

  • gen_udp 现在可以配置为使用套接字 inet-backend(与 gen_tcp 相同的方式)。

    自有 ID:OTP-17410

  • 添加了函数 erlang:set_cookie(Cookie)erlang:get_cookie(Node),以完善功能并方便配置具有不同 cookie 的分布式节点。

    关于分发 cookie 的文档已得到改进,不再那么含糊不清。

    自有 ID:OTP-17538 辅助 ID:GH-5063, PR-5111

  • 针对 Linux 的怪异行为(当连接连接的(重新连接的)UDP 套接字时,不调整源 IP 地址)实施了解决方法。

    解决方法是,在 Linux 上,始终在连接 UDP 套接字之前解除任何连接。

    自有 ID:OTP-17559 辅助 ID:GH-5092, PR-5120

  • 记录了我们关于不建议使用 file:open/2 打开 NFS 挂载的文件、FIFO、设备和类似文件的建议。

    自有 ID:OTP-17576 辅助 ID:ERIERL-685

Kernel 8.0.2

修复的 Bug 和故障

  • 对于 gen_tcp:connect/3,4,可以指定特定的源端口,这应该足以在连接之前将套接字绑定到具有该端口的地址。

    不幸的是,该功能在 OTP-17216 中丢失了,该版本强制指定源地址以获取地址绑定,并且如果未指定源地址,则忽略指定的源端口。

    该 Bug 现在已得到纠正。

    自有 ID:OTP-17536 辅助 ID:OTP-17216, ERIERL-677

Kernel 8.0.1

修复的 Bug 和故障

  • 修复了 Global 中的竞争条件。

    自有 ID:OTP-16033 辅助 ID:ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923

  • 在节点使用 init:restart/0,1 重启后,模块 socket 不可用,因为支持表已被清除且未重新初始化。现在已修复此问题。

    将“.”域作为搜索域的处理不正确,导致 DNS 解析器 inet_res 崩溃,现在已修复此问题。

    自有 ID:OTP-17439 辅助 ID:GH-4827, PR-4888, GH-4838

  • 更正了 fd 选项和绑定到地址的组合处理,特别是对于 local 地址族。

    自有 ID:OTP-17451 辅助 ID:OTP-17374

  • socket 实现的 Bug 修复和代码清理,例如

    在适当的情况下,已在 NIF 代码中添加了对取消监视结果的断言。

    已审查 NIF 代码中套接字关闭的内部状态处理。

    已删除 NIF 代码中针对 EINTRclose() 循环,因为在 Linux 上强烈建议不要这样做,并且 Posix 对于是否允许这样做并不明确。

    已记录旧式 gen_tcp 套接字的 inet_backend 临时套接字选项。

    更正了 net:getaddrinfo/2 的返回值:protocol 字段现在是 atom/0,而不是错误地是 list(atom())。关于此返回类型的文档也已更正。

    延迟关闭 socket:sendfile/* 文件已损坏,现已更正。

    已更正套接字 NIF 中的一些调试代码(默认情况下未启用),以避免因调试打印或多或少无害的事件而意外地核心转储。

    自有 ID:OTP-17452

Kernel 8.0

修复的 Bug 和故障

  • 修复了内部 inet_res 解析器缓存的一个 Bug,该 Bug 错误地处理了解析器配置文件的状态计时器,并因许多不必要的文件系统访问而导致性能问题。

    自有 ID:OTP-14700 辅助 ID:PR-2848

  • disk_log:info/1 返回的标签 head 的值从 {ok, Head} 更改为仅 Head

    *潜在的不兼容性*

    自有 ID:OTP-16809 辅助 ID:ERL-1313

  • 已向 erl_call 添加了两个选项。-fetch_stdout 选项获取 erl_call 调用的代码产生的标准输出数据。-fetch_stdout 选项禁用结果项的打印。为了实现这两个选项中的第一个,已向 erl_interface 添加了一个名为 ei_xrpc_from 的新函数。有关详细信息,请参阅 erl_call 文档和 erl_interface 文档。

    自有 ID:OTP-17132

  • 已将缺少的运行时依赖项添加到此应用程序。

    自有 ID:OTP-17243 辅助 ID:PR-4557

  • 已更正 inet:get_rc/0,以将主机条目作为单独的条目返回,而不是(错误地)在列表内的列表中返回。此 Bug 由 OTP-23.0-rc1 中的 OTP-16487 引入。

    自有 ID:OTP-17262 辅助 ID:GH-4588, PR-4604, OTP-16487

  • 类型 gen_tcp:option_name() 有一个重复的 pktoptions 值。

    自有 ID:OTP-17277

  • 修复了从 pg 中的内部状态删除空组的问题。

    自有 ID:OTP-17286 辅助 ID:PR-4619

  • erl -remsh 无法连接到远程节点时,现在会打印错误消息。

    自有 ID:OTP-17287 辅助 ID:PR-4581

  • 修复了与损坏的 shell 历史文件相关的 Bug。

    shell 历史记录打印的错误消息现在作为记录器错误报告记录,而不是写入标准错误。

    自有 ID:OTP-17288 辅助 ID:PR-4581

  • 现在,当给 -name-sname 提供了太多参数时,会发出记录器警告。示例:erl -name a b

    自有 ID:OTP-17315 辅助 ID:GH-4626

  • inet_res 使用的缓存现在可以再次处理每个域名多个 IP 地址,从而修复了在 PR-3041 (OTP-13126) 和 PR-2891 (OTP-14485) 中引入的 Bug。

    自有 ID:OTP-17344 辅助 ID:PR-4633, GH-4631, OTP-14485, OTP-12136

  • 使用 socket:accept 创建的套接字未计数 (socket:info/0)。

    自有 ID:OTP-17372

  • gen_tcp:listen/2{fd, Fd} 选项不适用于 inet_backend socket,现已修复。

    自有 ID:OTP-17374 辅助 ID:PR-4787, GH-4680, PR-2989, OTP-17216

改进和新功能

  • 已改进 DNS 解析器 inet_res 使用的缓存,以使用 ETS 查找而不是服务器调用。这对于缓存命中来说是一个相当大的速度提升。

    自有 ID:OTP-13126 辅助 ID:PR-3041

  • 内部 DNS 解析器 inet_res 的缓存 ETS 表类型(在内部)已更改类型,以获得更好的速度和原子性。

    自有 ID:OTP-14485 辅助 ID:PR-2891

  • 实验性 socket 模块现在可以使用操作系统支持的任何协议(按名称)。在 PR-2641 中提出,在 PR-2670 中实现。

    自有 ID:OTP-14601 辅助 ID:PR-2641, PR-2670, OTP-16749

  • 已更新 DNS 解析器 inet_res,以支持 CAA (RFC 6844) 和 URI (RFC 7553) 记录。

    自有 ID:OTP-16517 辅助 ID:PR-2827

  • 已实现用于 gen_tcp 以使用新的 socket API 的兼容性适配器 (gen_tcp_socket)。在设置内核应用程序变量 inet_backend = socket 时使用。

    自有 ID:OTP-16611 辅助 ID:OTP-16749

  • 已实现 EEP 54 中提议的失败 BIF 调用的扩展错误信息,https://github.com/erlang/eep/blob/master/eeps/eep-0054.md

    当 Erlang shell 中的 BIF 调用失败时,将打印有关哪个或哪些参数出错的更多信息。当 BIF 调用失败时,proc_libcommon_testqlc 将使用相同的扩展错误信息。

    对于希望提供相同扩展错误信息的应用程序,有新的函数 erl_error:format_exception/3erl_error:format_exception/4

    现在有一个新的 error/3 BIF,它允许应用程序或库以相同的方式为它们自己的异常提供扩展的错误信息。

    内部 ID: OTP-16686

  • 现在可以使用 raw 选项在 file:delete/1,2 中绕过文件服务器。

    内部 ID: OTP-16698 辅助 ID: PR-2634

  • 引入了使用分布进程通过 UDS 实现 Erlang 分布的示例。

    感谢 Jérôme de Bretagne

    内部 ID: OTP-16703 辅助 ID: PR-2620

  • 引入了 进程别名 功能,如 EEP 53 中所述。引入它的目的是提供一种轻量级的机制,可以防止超时或连接丢失后出现延迟回复。更多信息,请参阅 EEP 53 以及新的 alias/1 BIF 和 monitor/3 BIF 的新选项的文档。

    gen_servergen_statemgen_event 使用的框架中的 call 操作已更新为利用别名来防止延迟响应。 gen_statem 行为在分布式情况下仍然使用代理进程,因为它一直可以防止延迟回复,并且别名不能用于 OTP 24 之前的节点。代理进程可以在 OTP 26 中移除。

    别名功能还使得引入类似于 erpc:receive_response() 函数的 gen 行为中的新函数成为可能,因此也引入了新函数 gen_server:receive_response()gen_statem:receive_response()gen_event:receive_response()

    内部 ID: OTP-16718 辅助 ID: PR-2735

  • 实验性的新套接字 API 得到了进一步的开发。 相对于 OTP 23,进行了一些不向后兼容的更改。

    控制消息格式已更改,因此解码后的值现在位于“value”字段中,而不是“data”字段中。“data”字段现在始终包含二进制数据。

    一些类型名称已更改,涉及消息头和控制消息头。

    socket:bind/2 现在返回纯 ok,而不是 {ok, Port},后者仅与 inetinet6 地址族相关,并且通常不有趣。 要找出选择了哪个端口,请使用 socket:sockname/1

    *潜在的不兼容性*

    内部 ID: OTP-16749 辅助 ID: OTP-14601

  • 新函数 os:env/0 将所有操作系统环境变量作为 2 元组列表返回。

    内部 ID: OTP-16793 辅助 ID: ERL-1332, PR-2740

  • 删除了对分布式磁盘日志的支持。新函数 disk_log:all/0 将代替 disk_log:accessible_logs/0 使用。 函数 disk_log:close/1 将代替 disk_log:lclose/1,2 使用。

    *潜在的不兼容性*

    内部 ID: OTP-16811

  • 扩展了 erl_epmd:listen_port_please/2 的规范以镜像 erl_epmd:port_please/2

    内部 ID: OTP-16947 辅助 ID: PR-2781

  • 添加了一个新的 erl 参数,用于指定带有配置数据的文件描述符。这使得在执行 erl 命令时可以传递参数“-configfd FD”。 当给出此选项时,系统将尝试从文件描述符中读取和解析配置参数。

    内部 ID: OTP-16952

  • 实验性的 HiPE 应用程序已删除,以及其他应用程序中的所有相关功能。

    *潜在的不兼容性*

    内部 ID: OTP-16963

  • pg2 模块已删除。

    *潜在的不兼容性*

    内部 ID: OTP-16968

  • 接受来自远程节点的最大 160 位大小的引用。这是在未来的 OTP 版本中使用最大 160 位大小的引用的升级路径中的第一步。

    内部 ID: OTP-17005 辅助 ID: OTP-16718

  • 允许将 utf-8 二进制文件作为 logger_formatter 模板的一部分。

    内部 ID: OTP-17015

  • 如果首次打开包装日志,即磁盘日志进程不存在,并且选项 size 的值与磁盘日志的当前大小不匹配,则允许 disk_log:open/1 更改大小。

    *潜在的不兼容性*

    内部 ID: OTP-17062 辅助 ID: ERL-1418, GH-4469, ERIERL-537

  • 允许使用自定义回调模块获取和存储 erlang 节点的 shell 历史记录。 有关更多详细信息,请参阅 内核文档 中的 shell_history 配置参数。

    内部 ID: OTP-17103 辅助 ID: PR-2949

  • 已改进简单记录器(用于记录内核启动之前发生的事件),以打印更漂亮的错误消息。

    内部 ID: OTP-17106 辅助 ID: PR-2885

  • 对于支持底层套接字库调用的平台,已实现 socket:sendfile/2,3,4,5

    内部 ID: OTP-17154 辅助 ID: OTP-16749

  • 为所有类型的套接字添加套接字监视器。

    内部 ID: OTP-17155

  • 修复了 gen_tcp_socket 的各种问题。 包括记录一些不兼容之处。

    *潜在的不兼容性*

    内部 ID: OTP-17156

  • inet:i/0 现在也显示现有的基于“socket”的 gen_tcp 兼容性套接字。

    内部 ID: OTP-17157

  • 在记录器中添加了对设置主元数据的支持。 主元数据作为基本元数据传递给系统中所有日志事件。 有关更多详细信息,请参阅内核用户指南的记录器章节中的 元数据

    内部 ID: OTP-17181 辅助 ID: PR-2457

  • 识别应用程序资源文件中的新键“optional_applications”。

    内部 ID: OTP-17189 辅助 ID: PR-2675

  • 传递给 logger:log/2,3,4 的 Fun 现在可以返回仅在需要时才获取的元数据。 有关更多详细信息,请参阅 logger:log/2,3,4

    内部 ID: OTP-17198 辅助 ID: PR-2721

  • erpc:multicall() 已重写,以便能够利用新引入和改进的选择性接收优化。

    内部 ID: OTP-17201 辅助 ID: PR-4534

  • 添加实用函数 inet:info/1 以提供有关套接字的各种信息。

    内部 ID: OTP-17203 辅助 ID: OTP-17156

  • gen_tcp:connect/3,4 的行为已更改为默认不绑定到地址,这允许网络堆栈将地址和端口选择延迟到已知远程地址时。 这允许更好地重用端口,从而启用更多的出站连接,因为临时端口范围不再需要是一个硬性限制。

    从理论上讲,此行为更改可能会影响可能的错误值集,或对某些平台产生其他细微影响。

    *潜在的不兼容性*

    内部 ID: OTP-17216 辅助 ID: PR-2989

  • DNS 解析器 inet_res 中实现了一个选项 {nxdomain_reply, boolean()}。 它很有用,因为来自名称服务器的 nxdomain 错误确实包含 SOA 记录(如果域确实存在)。 此记录对于确定失败条目的负缓存的 TTL 很有用。

    内部 ID: OTP-17266 辅助 ID: PR-4564

  • 优化了 pg 中作为组一部分的本地进程的查找。

    内部 ID: OTP-17284 辅助 ID: PR-4615

  • 模块 socket 函数 send()sendto()sendmsg()sendfile()recv() 的返回值已更改为在返回 SelectInfo 时返回带有 select 标记的元组,而不是有时带有 ok 标记。

    这是一个不向后兼容的更改,它提高了使用异步操作的代码的可用性。

    *潜在的不兼容性*

    内部 ID: OTP-17355 辅助 ID: OTP-17154

  • 修复了匹配以下划线前缀的变量的代码中的警告。

    内部 ID: OTP-17385 辅助 ID: OTP-17123

内核 7.3.1.7

改进和新特性

  • 引入了一个新函数 global:disconnect/0,可以使用它来干净地断开节点与 global 节点集群中所有其他节点的连接。

    自有 ID:OTP-18232 辅助 ID:OTP-17843,PR-6264

内核 7.3.1.6

修复的 Bug 和故障

  • 在建立连接的同时调用 net_kernel:setopts(new, Opts) 可能会导致 net_kernel 进程和建立连接的进程之间发生死锁。

    自有 ID:OTP-18198 辅助 ID:GH-6129,PR-6216

内核 7.3.1.5

修复的 Bug 和故障

  • 默认情况下,当由于网络问题导致连接丢失时,global 不会采取任何措施来恢复完全连接的网络。对于所有期望提供完全连接网络的应用程序(例如 mnesia),以及 global 本身,这都是有问题的。重叠分区的网络可能导致 global 的内部状态不一致。即使在将这些分区合并在一起形成完全连接的网络之后,这种不一致性也可能仍然存在。对期望维护完全连接网络的其他应用程序的影响可能会有所不同,但在这种分区期间,它们可能会以非常微妙且难以检测的方式发生错误。

    为了防止此类问题,我们引入了一个防止重叠分区的修复程序,可以使用 prevent_overlapping_partitions kernel(6) 参数启用该修复程序。启用此修复程序后,global 将主动断开与报告已断开与其他节点连接的节点的连接。这将导致形成完全连接的分区,而不是使网络处于具有重叠分区的状态。请注意,为了正常工作,必须在网络中的所有节点上启用此修复程序。由于这会相当大地改变行为,因此目前默认情况下禁用此修复程序。但是,由于您可能会在没有此修复程序的情况下遇到难以检测到的问题,因此强烈建议您启用此修复程序以避免出现上述问题。从 OTP 25 开始,此修复程序将默认启用。

    自有 ID:OTP-17843 辅助 ID:ERIERL-732、PR-5611

  • 修复了从同一节点静默关闭先前建立的连接后,接受连接设置失败的问题。

    自有 ID:OTP-17979 辅助 ID:ERIERL-780

改进和新特性

内核 7.3.1.4

修复的 Bug 和故障

  • 原生 DNS 解析器中对结果值的解析已加强了防御能力,以防止不正确的结果。

    自有 ID:OTP-17578 辅助 ID:ERIERL-683

内核 7.3.1.3

修复的 Bug 和故障

  • 修复了当模块位于 escript 中时 code:get_doc/1 会崩溃的问题。

    自有 ID:OTP-17570 辅助 ID:PR-5139 GH-4256 ERL-1261

内核 7.3.1.2

修复的 Bug 和故障

  • 将“.”域作为搜索域的处理不正确,导致 DNS 解析器 inet_res 崩溃,现在已修复此问题。

    内部 ID: OTP-17473 辅助 ID: GH-4838, OTP-17439

  • 修复了罕见的 Bug,该 Bug 可能导致 net_kernel 进程永远挂起。据观察,当远程节点重启时,使用大量 TLS 连接会发生这种情况。该 Bug 自 OTP-22.0 以来就存在。

    自有 ID:OTP-17476 辅助 ID:GH-4931, PR-4934

内核 7.3.1.1

修复的 Bug 和故障

  • 修复了 Global 中的竞争条件。

    自有 ID:OTP-16033 辅助 ID:ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923

内核 7.3.1

修复的 Bug 和故障

  • Erlang DNS 解析器中存在一个 bug 已被修复。当从 DNS 服务器收到不正确的回复(对 IN CNAME 查询的 IN A 回复)并在未验证其类型的情况下使用回复记录的值时,该 bug 会导致内核 supervisor 崩溃,从而导致整个节点崩溃。

    自有 ID:OTP-17361

内核 7.3

修复的 Bug 和故障

  • DNS 编码中压缩指针的范围检查存在缺陷,导致超大 DNS 消息(大于约 16 kBytes,例如 AXFR 响应)的标签压缩编码不正确。这个存在超过 11 年的 bug 现已修复。

    自有 ID:OTP-13641 辅助 ID:PR-2959

  • 修复了 erpc 文档中的内部链接。

    自有 ID:OTP-17202 辅助 ID:PR-4516

  • 修复了复杂的 seq_trace 令牌(即列表、元组、映射等)可能被 GC 损坏的 bug。该 bug 在 OTP-21 中引入。

    自有 ID:OTP-17209 辅助 ID:PR-3039

  • modules 模式下运行 Xref 时,Debugger 应用程序会显示为 Kernel 应用程序的依赖项。

    自有 ID:OTP-17223 辅助 ID:GH-4546, PR-4554

改进和新功能

  • erl_epmd(epmd 客户端)现在会在连接断开时尝试重新连接到本地 EPMD。

    自有 ID:OTP-17178 辅助 ID:PR-3003

内核 7.2.1

修复的 Bug 和故障

  • 当使用 DNS 解析器选项 servfail_retry_timeout 时,它没有遵守例如 inet_res:getbyname/3 中的整体调用超时。此错误行为现已修复。此外,servfail_retry_timeout 的行为已得到改进,仅对提供 servfail 答案的服务器强制执行。

    自有 ID:OTP-12960 辅助 ID:ERIERL-598, PR-4509

内核 7.2

修复的 Bug 和故障

  • logger.hrl 中的 apply 调用现在使用 erlang 前缀调用,以避免与本地 apply/3 函数冲突。

    自有 ID:OTP-16976 辅助 ID:PR-2807

  • 修复了 pg 中的内存泄漏。

    自有 ID:OTP-17034 辅助 ID:PR-2866

  • 修复了由于未处理的错误 gen_server:call 回复而导致的 logger_proxy 崩溃。当记录器在高负载下且流量控制机制达到其限制时,会出现错误回复。

    自有 ID:OTP-17038

  • 修复了 erl_epmd:names() 中的一个 bug,该 bug 导致它返回非法返回值 noport 而不是 {error, Reason},其中 Reason 是实际的错误原因。这个 bug 也传播到了 net_adm:names()

    此 bug 在 kernel 版本 7.1 (OTP 23.1) 中引入。

    自有 ID:OTP-17054 辅助 ID:ERL-1424

改进和新功能

  • 添加了对一些已记录的解析器类型的导出。

    自有 ID:OTP-16954 辅助 ID:ERIERL-544

  • 为解析器查找添加了可配置的重试超时。

    自有 ID:OTP-16956 辅助 ID:ERIERL-547

  • gen_server:multi_call() 在仅使用设置为 infinity 的超时调用本地节点的特殊情况下进行了优化。

    自有 ID:OTP-17058 辅助 ID:PR-2887

内核 7.1

修复的 Bug 和故障

  • 当使用 inet_backend 套接字时,已为 file:sendfile 实现了回退。

    自有 ID:OTP-15187 辅助 ID:ERL-1293

  • 使默认 TCP 分发遵守 inet_dist_listen_options 中的选项 backlog

    自有 ID:OTP-16694 辅助 ID:PR-2625

  • 实验性 gen_tcp_socket 后端的原始选项处理已损坏,因此所有原始选项都被 gen_tcp:listen/2 等忽略了,此 bug 现已修复。由 Jan Uhlig 报告。

    自有 ID:OTP-16743 辅助 ID:ERL-1287

  • 使用 inet-backend 套接字时,Accept 失败。

    自有 ID:OTP-16748 辅助 ID:ERL-1284

  • 修复了 gen_tcp 的套接字后端中的各种小错误。

    自有 ID:OTP-16754

  • 更正 disk_log:truncate/1 以计算标头。同时更正了文档,声明 disk_log:truncate/1 可以与外部磁盘日志一起使用。

    自有 ID:OTP-16768 辅助 ID:ERL-1312

  • 修复 erl_epmd:port_please/2,3 类型规范以包含所有可能的错误值。

    自有 ID:OTP-16783

  • 修复了 erl -erl_epmd_port 以使其正常工作。在此修复之前,它根本不起作用。

    自有 ID:OTP-16785

  • 修复内部函数 erlang:seq_trace_info/1 的类型规范,以允许 term/0 作为返回的标签。这反过来修复了 seq_trace:get_token/1 的调用,以便可以由 dialyzer 正确分析。

    自有 ID:OTP-16823 辅助 ID:PR-2722

  • 修复了在动态启动分发时 pg 中进程的错误重复注册。

    自有 ID:OTP-16832 辅助 ID:PR-2738

改进和新功能

  • 使套接字注册表成为可选的(默认情况下仍启用)。现在可以使用关闭的套接字注册表构建 OTP,可以通过设置环境变量和在运行时(通过函数调用和创建套接字时的参数)控制它。

    自有 ID:OTP-16763

  • 当与动态节点名一起使用时,erl -remsh nodename 不再需要提供主机名。

    自有 ID:OTP-16784

内核 7.0

修复的 Bug 和故障

  • 修复了启用 shell_history 时关闭期间的竞争条件。此竞争条件会导致 disk_log 崩溃。

    自有 ID:OTP-16008 辅助 ID:PR-2302

  • 修复了 Erlang 分发,以处理节点连接时可以处理消息分片但不能处理原子缓存的情况。此 bug 仅影响已实现自定义分发载体的用户。它自 OTP-21 起就存在。

    DFLAG_FRAGMENT 分发标志已添加到分发实现可以拒绝的标志集中。

    自有 ID:OTP-16284

  • 修复了二进制文件不允许作为 logger:log 调用中的格式字符串的 bug。

    自有 ID:OTP-16395 辅助 ID:PR-2444

  • 修复了 logger 在尝试记录处理程序或格式化程序崩溃时最终进入无限循环的 bug。

    自有 ID:OTP-16489 辅助 ID:ERL-1134

  • code:lib_dir/1 已修复,也可返回 erts 的 lib 目录。

    这已被标记为与任何依赖于为 erts 返回 {error,bad_name} 的应用程序不兼容。

    *潜在的不兼容性*

    自有 ID:OTP-16502

  • 如果应用程序的主应用程序终止,则不会调用应用程序 stop/1 回调。

    自有 ID:OTP-16504 辅助 ID:PR-2328

  • 修复了 application:loaded_applications/0 中的一个 bug,如果例如正在运行并发升级/降级,可能会导致它失败并返回 badarg

    自有 ID:OTP-16627 辅助 ID:PR-2601

改进和新功能

  • kernel 应用程序中引入了一个新的模块 erpcerpc 模块实现了 rpc 模块提供的操作的增强子集。增强之处在于它使得可以区分返回值、引发的异常和其他错误。erpc 还比原始 rpc 实现具有更好的性能和可扩展性。这是通过利用新引入的 spawn_request() BIF 来实现的。此外,rpc 模块在可能的情况下通过利用 erpc 也从这些改进中受益。

    此更改已被标记为潜在的不兼容,因为 rpc:block_call() 现在仅保证阻止其他 block_call() 操作。该文档之前声称它会阻止所有 rpc 操作。但这从来都不是这种情况。它以前不会阻止节点本地 block_call() 操作。

    *潜在的不兼容性*

    自有 ID:OTP-13450 辅助 ID:OTP-15251

  • 客户端节点可以从其首次连接的节点动态接收其节点名称。此功能可以通过以下方式使用

    • 使用 erl -sname undefined 启动
    • erl_interface 函数 ei_connect_init 及其友元
    • erl_call -R

    自有 ID:OTP-13812

  • 改进了 STDLIB 和 Kernel 中大多数 OTP 行为的单行记录器事件的打印输出。这包括 proc_libgen_servergen_eventgen_statemgen_fsmsupervisorsupervisor_bridgeapplication

    改进了 proc_lib 中以及格式化异常时对 chars_limitdepth 的处理。

    自有 ID:OTP-15299

  • 删除 I/O 协议的旧请求的使用和文档。

    自有 ID:OTP-15695

  • 现在可以通过传递 directory 选项使用 file:open/2 打开目录。

    自有 ID:OTP-15835 辅助 ID:PR-2212

  • 通过使用 persistent_term 存储日志级别,优化了 logger 中基于日志级别是否记录的检查。

    自有 ID:OTP-15948 辅助 ID:PR-2356

  • file:read_file_info/2 现在可以用于打开的文件和目录。

    自有 ID:OTP-15956 辅助 ID:PR-2231

  • 现在 erl-config 选项可以采用多个配置文件,而无需重复 -config 选项。示例

    erl -config sys local

    自有 ID:OTP-16148 辅助 ID:PR-2373

  • 改进了节点连接设置握手协议。使在不依赖 epmd 或其他对等节点版本预先了解的情况下就协议版本达成一致成为可能。还添加了节点化身(“创建”)值的交换,并将分发能力标志字段从 32 位扩展到 64 位。

    自有 ID:OTP-16229

  • 扩展了在不依赖 EPMD 的情况下运行 Erlang 分发的可能性。为了实现这一点,为 inet 分发添加了一些新选项。

    • -dist_listen false - 设置分布式通道,但不监听传入的连接。当您希望使用当前节点与同一台机器上的另一个节点交互,而无需加入整个集群时,此选项非常有用。

    • -erl_epmd_port Port - 配置内置 EPMD 客户端应返回的默认端口。这允许本地节点知道要连接到集群中任何其他节点的端口。

    erl_epmd 回调 API 也已扩展,允许返回 -1 作为创建值,这意味着节点将创建随机的创建值。

    此外,还添加了一个名为 listen_port_please 的新回调函数,允许回调返回分布式应使用的监听端口。如果要从外部服务获取监听端口,则可以使用此函数代替 inet_dist_listen_min/max

    自身 ID:OTP-16250

  • 第一个实验性模块已经实现,它是 gen_tcpinetsocket 后端。后续会跟进其他模块。欢迎提供反馈。

    自身 ID:OTP-16260 辅助 ID:OTP-15403

  • 新的实验性 socket 模块已移至 Kernel 应用程序。

    自身 ID:OTP-16312

  • 替换 group 模块中已弃用函数的使用。

    自身 ID:OTP-16345

  • 由于新的 spawn 改进,进行了小的更新。

    自身 ID:OTP-16368 辅助 ID:OTP-15251

  • 更新了顺序跟踪,以支持消息传递以外的其他信息传输。

    自身 ID:OTP-16370 辅助 ID:OTP-15251, OTP-15232

  • code:module_status/1 现在接受模块列表。code:module_status/0 已添加,它返回所有已加载模块的状态。

    自身 ID:OTP-16402

  • 当模式中包含双星号 (**) 时,filelib:wildcard/1,2 现在速度提高了一倍。

    自身 ID:OTP-16419

  • 引入了分布式命名进程组的新实现。它在pg模块中可用。

    请注意,此 pg 模块仅与 OTP 17 之前的 stdlib 中存在的实验性 pg 模块名称相同。

    感谢 Maxim Fedorov 的实现。

    自身 ID:OTP-16453 辅助 ID:PR-2524

  • pg2 模块已被弃用。它也计划在 OTP 24 中移除。

    建议您使用新引入的 pg 模块替换 pg2 的使用。pg 具有类似的 API,但具有更具可扩展性的实现。

    *潜在的不兼容性*

    自身 ID:OTP-16455

  • 重构了已弃用和已删除函数的内部处理。

    自身 ID:OTP-16469

  • 内部主机文件解析器缓存 inet_hosts 已被重写,以便在主机文件更改时更好地工作。例如,缓存是按条目更新,而不是清除和重新加载,因此在重新加载期间查找不会暂时失败;并且当多个进程同时请求重新加载时,这些请求现在被合并为一个,而不是按顺序完成。由 Maxim Fedorov 报告并首次提出解决方案建议。

    自身 ID:OTP-16487 辅助 ID:PR-2516

  • 添加了 code:all_available/0,可用于获取所有可用的模块。

    自身 ID:OTP-16494

  • 从 OTP 23 开始,分布式 disk_log 功能已被弃用。它也计划在 OTP 24 中移除。

    *潜在的不兼容性*

    自身 ID:OTP-16495

  • 添加了函数 code:fetch_docs/1,用于获取 Erlang 模块的嵌入式文档。

    自身 ID:OTP-16499

  • 改进了 net nif 的配置,这将提高可移植性。

    自身 ID:OTP-16530 辅助 ID:OTP-16464

  • socket: socket 计数器和 socket 全局计数器现在表示为映射(而不是属性列表)。

    自身 ID:OTP-16535

  • 实验性 socket 模块已取消限制,因此现在“seqpacket” socket 类型应该适用于 OS 支持的任何通信域(协议族),通常是 Unix 域。

    自身 ID:OTP-16550 辅助 ID:ERIERL-476

  • 允许在 logger_std_h 中使用自定义 IO 设备。

    自身 ID:OTP-16563 辅助 ID:PR-2523

  • 添加了 file:del_dir_r/1,它会删除一个目录及其所有内容,类似于 Unix 系统上的 rm -rf

    自身 ID:OTP-16570 辅助 ID:PR-2565

  • socket:默认情况下,socket 选项 rcvtimeo 和 sndtimeo 现在已禁用。要启用这些选项,现在必须使用配置选项 --enable-esock-rcvsndtimeo 构建 OTP。

    自身 ID:OTP-16620

  • 当接收指定数量的字节时,利用 socket 模块的实验性 gen_tcp 兼容代码可能会丢失缓冲的数据。此错误已修复。由 Maksim Lapshin 在 bugs.erlang.org ERL-1234 上报告。

    自身 ID:OTP-16632 辅助 ID:ERL-1234

Kernel 6.5.2.5

修复的错误和故障

  • 默认情况下,当由于网络问题导致连接丢失时,global 不会采取任何措施来恢复完全连接的网络。对于所有期望提供完全连接网络的应用程序(例如 mnesia),以及 global 本身,这都是有问题的。重叠分区的网络可能导致 global 的内部状态不一致。即使在将这些分区合并在一起形成完全连接的网络之后,这种不一致性也可能仍然存在。对期望维护完全连接网络的其他应用程序的影响可能会有所不同,但在这种分区期间,它们可能会以非常微妙且难以检测的方式发生错误。

    为了防止此类问题,我们引入了一个防止重叠分区的修复,可以使用 prevent_overlapping_partitions kernel(6) 参数启用。启用此修复后,global 将主动断开与报告已失去与其他节点连接的节点的连接。这将导致形成完全连接的分区,而不是使网络处于重叠分区的状态。请注意,此修复必须在网络中的所有节点上启用才能正常工作。由于这会相当大地改变行为,因此此修复目前默认禁用。由于如果没有此修复,您可能会遇到难以检测到的问题,因此强烈建议您启用此修复,以避免出现上述问题。从 OTP 25 开始,此修复将默认启用。

    自有 ID:OTP-17843 辅助 ID:ERIERL-732、PR-5611

改进和新功能

  • 引入了 net_tickintensity kernel 参数。它可用于控制 net_ticktime 期间的 tick 次数。

    还引入了新的 net_kernel:start/2 函数,以便更容易添加新选项。已弃用 net_kernel:start/1 的使用。

    自有 ID:OTP-17905 辅助 ID:ERIERL-732、PR-5740

Kernel 6.5.2.4

修复的错误和故障

  • 修复了罕见的 Bug,该 Bug 可能导致 net_kernel 进程永远挂起。据观察,当远程节点重启时,使用大量 TLS 连接会发生这种情况。该 Bug 自 OTP-22.0 以来就存在。

    自有 ID:OTP-17476 辅助 ID:GH-4931, PR-4934

Kernel 6.5.2.3

修复的错误和故障

  • 修复了 Global 中的竞争条件。

    自有 ID:OTP-16033 辅助 ID:ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923

Kernel 6.5.2.2

修复的错误和故障

  • modules 模式下运行 Xref 时,Debugger 应用程序会显示为 Kernel 应用程序的依赖项。

    自有 ID:OTP-17223 辅助 ID:GH-4546, PR-4554

Kernel 6.5.2.1

修复的错误和故障

  • 修复了 application:loaded_applications/0 中的一个 bug,如果例如正在运行并发升级/降级,可能会导致它失败并返回 badarg

    自有 ID:OTP-16627 辅助 ID:PR-2601

Kernel 6.5.2

修复的错误和故障

  • DNS 解析器 `inet_res` 已修复,以便在后续请求超时时返回最后一个中间错误。

    自身 ID:OTP-16414 辅助 ID:ERIERL-452

  • prim_net nif (net/kernel) 使用了未定义的原子 notsup。现在已更正。

    自身 ID:OTP-16440

  • 修复了在早期启动期间尝试在加载文件时记录故障时发生的崩溃。

    自身 ID:OTP-16491

  • 修复了在启动期间记录到远程节点时 logger 中发生的崩溃。

    自身 ID:OTP-16493 辅助 ID:ERIERL-459

改进和新功能

  • 改进了 net_kernel 调试功能。

    自身 ID:OTP-16458 辅助 ID:PR-2525

Kernel 6.5.1

修复的错误和故障

  • inet info 函数提供的“socket 状态”信息已得到改进

    自身 ID:OTP-16043 辅助 ID:ERL-1036

  • 修复了当需要轮换和压缩非常大的日志文件时,logger 在启动时崩溃的错误。

    自身 ID:OTP-16145 辅助 ID:ERL-1034

  • 修复了导致 net_kernel:monitor_nodes(true, [nodedown_reason]) 报告的实际节点关闭原因丢失并被原因 killed 替换的错误。

    自身 ID:OTP-16216

  • 已更新 rpc:call/4,5/ 的文档,以描述当被调用的函数抛出或返回 'EXIT' 元组时会发生什么。

    自身 ID:OTP-16279 辅助 ID:ERL-1066

Kernel 6.5

修复的错误和故障

  • 已更正 gen_sctp:connect/4,5 的类型规范。

    自身 ID:OTP-15344 辅助 ID:ERL-947

  • 提供给 erl 的额外 -mode 标志将被忽略,并发出警告。

    自身 ID:OTP-15852

  • 修复 seq_trace:set_token/2 的类型规范。

    自身 ID:OTP-15858 辅助 ID:ERL-700

  • 如果给定值 allnone 作为任何参数,则 logger:compare_levels/2 将会失败并出现 badarg 异常。现在已更正。

    自身 ID:OTP-15942 辅助 ID:PR-2301

  • 修复了当文件 inode 更改时,logger_std_h 中的日志文件不会关闭的错误。这反过来会在使用 logrotate 等工具时导致文件描述符泄漏。

    自有 ID: OTP-15997 辅助 ID: PR-2331

  • 修复调试函数 net_kernel:nodes_info/0 中的竞态条件。

    自有 ID: OTP-16022

  • 修复在 compresseddelayed_write 模式下关闭打开的文件时的竞态条件。

    自有 ID: OTP-16023

改进和新特性

  • gen_udp:send/4,5 添加了发送辅助数据的可能性,特别是 TOS 字段。

    自有 ID: OTP-15747 辅助 ID: ERIERL-294

  • 如果日志文件使用相对路径给出,则标准日志处理程序 (logger_std_h) 将以相对路径存储文件名。如果节点当前目录随后被更改,则将相对于新的当前目录创建新文件,如果新目录不存在,则可能会因 enoent 错误而失败。现在已对此进行更正,logger_std_h 始终将日志文件名存储为绝对路径,该路径从处理程序启动时的当前目录计算得出。

    自有 ID: OTP-15850

  • 支持使用 inet:i/0 的本地套接字。

    自有 ID: OTP-15935 辅助 ID: PR-2299

Kernel 6.4.1

已修复的 Bug 和故障

  • user/user_drv 可能会在 IO 请求被处理之前响应它们,如果在调用 io:format/2 后不久(例如在 escript 中)模拟器停止,可能会导致数据丢失。

    自有 ID: OTP-15805

Kernel 6.4

已修复的 Bug 和故障

  • 修复当向 erl 提供多个 -sname-name 时,选择第一个。在此修复之前,当给出多个名称选项时,根本不会启动分布式。

    自有 ID: OTP-15786 辅助 ID: ERL-918

  • 修复指向不存在文件的 inet_res 配置以使其再次工作。这在 KERNEL-6.3 (OTP-21.3) 中被破坏。

    自有 ID: OTP-15806

改进和新特性

  • 通过 socket 模块提供了一个简单的套接字 API。这是一个底层的 API,它会取代 gen_[tcp|udp|sctp]。它的目的是最终取代 inet 驱动程序,而不是高级 gen 模块(gen_tcp、gen_udp 和 gen_sctp)。它还提供了一个基本的 API,方便实现其他协议,即 TCP、UDP 和 SCTP。

    已知问题是:不(当前)支持 Windows 操作系统。

    自有 ID: OTP-14831

  • 改进了对 linger 选项的文档说明。

    自有 ID: OTP-15491 辅助 ID: PR-2019

  • 在连接到其他节点时,全局不再尝试多次。

    自有 ID: OTP-15607 辅助 ID: ERIERL-280

  • dist 消息 EXIT、EXIT2 和 MONITOR_DOWN 已使用新版本更新,这些新版本将原因项作为消息有效负载的一部分发送,而不是作为控制消息的一部分发送。

    旧版本仍然存在,并且可以在与不支持新版本的节点通信时使用。

    自有 ID: OTP-15611

  • 添加了 Kernel 配置参数 start_distribution = boolean()。如果设置为 false,则系统启动时将禁用所有分布式功能。默认为 true

    自有 ID: OTP-15668 辅助 ID: PR-2088

  • 在 OTP-21.3 中,引入了针对配置中重复的应用程序/键的警告。当配置在系统启动时作为文件给出时,以及在运行时通过 application:set_env/1,2 时,都会显示此警告。

    现在,该警告在 application:set_env/1,2 中更改为 badarg 异常。如果在系统启动时在配置文件中给出了错误的配置,则启动将失败。

    *潜在的不兼容性*

    自有 ID: OTP-15692 辅助 ID: PR-2170

Kernel 6.3.1.3

已修复的 Bug 和故障

  • 修复了当文件 inode 更改时,logger_std_h 中的日志文件不会关闭的错误。这反过来会在使用 logrotate 等工具时导致文件描述符泄漏。

    自有 ID: OTP-15997 辅助 ID: PR-2331

Kernel 6.3.1.2

改进和新特性

  • gen_udp:send/4,5 添加了发送辅助数据的可能性,特别是 TOS 字段。

    自有 ID: OTP-15747 辅助 ID: ERIERL-294

Kernel 6.3.1.1

已修复的 Bug 和故障

Kernel 6.3.1

已修复的 Bug 和故障

  • 修复了读取使用 compressed 标志打开的文件时的性能下降问题。

    自有 ID: OTP-15706 辅助 ID: ERIERL-336

Kernel 6.3

已修复的 Bug 和故障

  • 例如,如果 /etc/hosts 在内核应用程序启动后才出现,则永远不会读取其内容。此 Bug 现已得到纠正。

    自有 ID: OTP-14702 辅助 ID: PR-2066

  • 修复了在另一个进程正在进行垃圾回收时执行 seq_trace:reset_trace() 可能会导致运行时系统崩溃的 Bug。

    自有 ID: OTP-15490

  • 修复 erl_epmd:port_please 规范以包含 atom/0string/0

    自有 ID: OTP-15557 辅助 ID: PR-2117

  • Logger 处理程序 logger_std_h 现在会跟踪其日志文件的 inode,以便在 inode 更改时重新打开该文件。例如,如果日志文件被编辑器打开和保存,则可能会发生这种情况。

    自有 ID: OTP-15578 辅助 ID: ERL-850

  • 当将用户特定的文件模式提供给日志处理程序 logger_std_h 时,它们早先在没有任何控制的情况下被接受。现在对此进行了更改,因此 Logger 将按如下方式调整文件模式

    - 如果列表中未找到 raw,则会添加它。
    - 如果列表中没有找到 writeappendexclusive,则会添加 append
    - 如果列表中没有找到 delayed_write{delayed_write,Size,Delay},则会添加 delayed_write

    自有 ID: OTP-15602

改进和新特性

  • 标准日志处理程序 logger_std_h 现在具有用于日志轮换的新内部功能。轮换方案如下

    处理程序当前写入的日志文件始终具有相同的名称,即为处理程序配置的名称。存档文件具有相同的名称,但带有扩展名“.N”,其中 N 是一个整数。最新的存档的扩展名为“.0”,而最旧的存档的编号最高。

    日志文件轮换的大小以及保留的存档文件数,分别使用处理程序特定的配置参数 max_no_bytesmax_no_files 指定。

    存档可以压缩,在这种情况下,它们会在整数后获得“.gz”文件扩展名。压缩使用处理程序特定的配置参数 compress_on_rotate 指定。

    自有 ID: OTP-15479

  • 添加了新函数 logger:i/0logger:i/1。这些函数提供与 logger:get_config/0 和其他 logger:get_*_config 函数相同的信息,但信息更符合逻辑排序且更易读。

    自有 ID: OTP-15600

  • Logger 现在可以防止由于来自模拟器或远程节点的大量日志事件而导致的过载。

    自有 ID: OTP-15601

  • Logger 现在使用 os:system_time/1 而不是 erlang:system_time/1 来生成日志事件时间戳。

    自有 ID: OTP-15625

  • 添加函数 application:set_env/1,2application:set_env/2。这些函数接受应用程序配置参数列表,其行为等同于为每个应用程序/键组合单独调用 application:set_env/4,只是效率更高。

    set_env/1,2 会警告重复的应用程序或键。如果在启动期间,应用程序或键在一个配置文件(例如 sys.config)中重复,也会发出此警告。

    自有 ID: OTP-15642 辅助 ID: PR-2164

  • 更改了标准处理程序 logger_std_h 的处理程序特定配置参数,使其更加直观,并且更类似于 disk_log 处理程序。

    早期只有一个参数 type,它可以具有值 standard_iostandard_error{file,FileName}{file,FileName,Modes}

    现在对此进行了更改,因此允许以下参数

    type = standard_io | standard_error | file
    file = file:filename()
    modes = [file:mode()]

    所有参数都是可选的。type 默认为 standard_io,除非给出了文件名,在这种情况下,它默认为 file。如果 type 设置为 file,则文件名默认为与处理程序 ID 相同。

    潜在的不兼容之处在于,即使配置是使用旧变体设置的,例如 #{type=>{file,FileName}}logger:get_config/0logger:get_handler_config/1 现在也会返回新的参数。

    *潜在的不兼容性*

    自有 ID: OTP-15662

  • 将新的配置参数 file_check 添加到 Logger 处理程序 logger_std_h。此参数指定处理程序在检查日志文件是否仍然存在且 inode 与打开时相同时,可以等待多长时间(以毫秒为单位)。

    默认值为 0,表示在每次写入操作之前都会执行此检查。设置更高的数值可能会提高性能,但会增加丢失日志事件的风险。

    自有 ID:OTP-15663

Kernel 6.2.1

修复的错误和故障

  • 设置 inet 套接字的 recbuf 大小时,buffer 也会自动增加。修复了即使已显式设置 inet 缓冲区大小,也会触发 inet 缓冲区大小自动调整的错误。

    自有 ID:OTP-15651 辅助 ID:ERIERL-304

Kernel 6.2

修复的错误和故障

  • 添加了一个新函数 logger:update_handler_config/3,并且处理程序回调 changing_config 现在有一个新参数 SetOrUpdate,它指示配置更改是来自 set_handler_config/2,3 还是 update_handler_config/2,3

    这允许处理程序将新配置与旧配置(如果更改来自 update_handler_config/2,3)或默认配置(如果更改来自 set_handler_config/2,3)一致地合并。

    内置处理程序 logger_std_hlogger_disk_log_h 已相应更新。还纠正了一个可能导致处理程序的内部状态与存储的配置之间不一致的错误。

    *潜在的不兼容性*

    自有 ID:OTP-15364

  • 修复了当自定义 erl_epmd 客户端未实现 address_please 时回退的问题。

    自有 ID:OTP-15388 辅助 ID:PR-1983

  • logger ets 表格没有 read_concurrency 选项。现在已添加。

    自有 ID:OTP-15453 辅助 ID:ERL-782

  • 在系统启动期间,logger 有一个简单的处理程序,它将输出打印到 stdout。内核监管启动后,此处理程序将被删除并替换为默认处理程序。由于一个错误,logger 之前会发出调试打印输出,表明它收到了意外的消息,即来自简单处理程序进程的 EXIT 消息。现在已更正。简单处理程序的进程现在在终止之前会从 logger 进程取消链接。

    自有 ID:OTP-15466 辅助 ID:ERL-788

  • 如果删除 logger 处理程序 logger_std_h,则不会重新创建其日志文件。因此,它不能与 'logrotate' 等工具一起使用。现在已更正。

    自有 ID:OTP-15469

改进和新功能

  • 添加了一个函数 inet:getifaddrs/1,它接受一个带有命名空间选项的列表,适用于支持该功能的平台,例如 Linux(仅限?)

    自有 ID:OTP-15121 辅助 ID:ERIERL-189,PR-1974

  • 为 TCP 套接字添加了 nopush 选项,它对应于 *BSD 上的 TCP_NOPUSH 和 Linux 上的 TCP_CORK

    这也用于 file:sendfile 的内部,以减少后续发送操作的延迟。

    自有 ID:OTP-15357 辅助 ID:ERL-698

  • 优化了 TCP 套接字的 send_delay 处理,以更好地与 OTP-21 中引入的新 pollthread 实现配合使用。

    自有 ID:OTP-15471 辅助 ID:ERIERL-229

Kernel 6.1.1

修复的错误和故障

  • 修复了导致 net_kernel 进程在从名称与本地节点相同的节点尝试连接时崩溃的错误。

    自有 ID:OTP-15438 辅助 ID:ERL-781

Kernel 6.1

修复的错误和故障

  • allnone 被记录为 Kernel 配置参数 logger_level 的有效值,但会导致节点启动时崩溃。现在已更正。

    自有 ID:OTP-15143

  • 修复了节点间分发连接上发送刻度的某些潜在错误行为。即使有未发送的缓冲数据,现在也会向 c 节点发送刻度,因为 c 节点需要刻度才能发送回复刻度。当由于未发送的缓冲数据而抑制刻度时,发送的数据量计算也错误。

    自有 ID:OTP-15162 辅助 ID:ERIERL-191

  • dist_util.erl 中非语义更改,以消除 dialyzer 警告。

    自有 ID:OTP-15170

  • 修复了 net_kernel:connect_node(node()) 以返回 true(并且不执行任何操作),因为它在 OTP-21.0 之前一直如此。还将这种成功的“自我连接”记录为预期行为。

    自有 ID:OTP-15182 辅助 ID:ERL-643

  • logger_formatter 上的 single_line 选项在某些情况下会在映射中的关联箭头后添加不需要的逗号。现在已更正。

    自有 ID:OTP-15228

  • 提高了分发连接设置的稳健性。在 OTP-21.0 中,引入了真正的异步连接设置。这是对该工作的进一步改进,以使模拟器更加稳健,并且能够在涉及的 Erlang 进程行为不端时进行恢复。

    自有 ID:OTP-15297 辅助 ID:OTP-15279,OTP-15280

改进和新功能

  • 添加了一个新宏 ?LOG(Level,...)。这等效于现有的 ?LOG_<LEVEL>(...) 宏。

    添加了 Logger 报告回调的新变体,它接受一个额外的参数,其中包含大小限制和换行符的选项。STDLIB 中的模块 proc_lib 将其用于崩溃报告。

    现在对 Logger 配置进行了更多错误检查。

    自有 ID:OTP-15132

  • 套接字模块中已实现套接字选项 recvtosrecvttlrecvtclasspktoptions。有关详细信息,请参阅 gen_tcpgen_udpinet 模块的文档。请注意,运行时系统中对这些选项的支持取决于平台。特别是对于 pktoptions,它是 Linux 特有的,并且已被定义它的 RFC 弃用。

    自有 ID:OTP-15145 辅助 ID:ERIERL-187

  • 添加 logger:set_application_level/2 用于设置一个应用程序中所有模块的日志级别。

    自有 ID:OTP-15146

Kernel 6.0.1

修复的错误和故障

  • 修复了 net_kernel 中的一个错误,该错误可能在某些连接尝试失败时导致模拟器崩溃。该错误自 kernel-6.0 (OTP-21.0) 起就已存在。

    自有 ID:OTP-15280 辅助 ID:ERIERL-226,OTP-15279

Kernel 6.0

修复的错误和故障

  • 澄清了 rpc:multicall/5 的文档。

    自有 ID:OTP-10551

  • DNS 解析器在从服务器获取 econnrefused 时保留了无效的套接字,因此对下一个服务器的查找也失败了。

    自有 ID:OTP-13133 辅助 ID:PR-1557

  • 没有任何解析器后端再返回 V4Mapped IPv6 地址。以前这不一致,有些返回,有些不返回。为了方便使用此类地址,添加了一个新函数 inet:ipv4_mapped_ipv6_address/1

    *潜在的不兼容性*

    自有 ID:OTP-13761 辅助 ID:ERL-503

  • 已根据文件和套接字操作应能够返回的错误更新了 file:posix/0inet:posix/0 的类型规范。

    自有 ID:OTP-14019 辅助 ID:ERL-550

  • 修复了在进行初始分布式连接时,仅在 IPv6 环境中的名称解析问题。

    自有 ID:OTP-14501

  • 文件操作过去接受包含空字符(整数值零)的 文件名。这会导致名称被截断,并且在某些情况下,原始操作的参数会被混淆。现在拒绝包含空字符的文件名,并且会导致原始文件操作失败。

    此外,环境变量操作过去接受包含空字符(整数值零)的环境变量的 名称。这会导致操作静默地产生错误的结果。现在拒绝包含空字符的环境变量名称和值,并且会导致环境变量操作失败。

    原始环境变量操作还过去接受环境变量名称中的 $= 字符,从而导致各种问题。现在也拒绝环境变量名称中的 $= 字符。

    此外,os:cmd/1 现在拒绝其 命令 中的空字符。

    从现在开始,erlang:open_port/2 也将拒绝端口名称中的空字符。

    *潜在的不兼容性*

    自有 ID:OTP-14543 辅助 ID:ERL-370

  • os:putenvos:getenv 不再直接访问进程环境,而是使用线程安全模拟。唯一可观察到的区别是它与 libc getenv(3) / putenv(3) 保持同步,因此那些依赖于驱动程序或 NIF 中该行为的用户将需要添加手动同步。

    在 Windows 上,这意味着您不能再通过在加载驱动程序/NIF 之前修改 PATH 来解决 DLL 依赖项。为了减少这个问题,模拟器现在会将目标 DLL 的文件夹添加到 DLL 搜索路径。

    *潜在的不兼容性*

    自有 ID:OTP-14666

  • 修复了发送到原始隐藏节点 (erl_interface) 的连接刻度,当有效负载数据发送到隐藏节点但未收到时,可能会在极少数情况下导致错误的刻度超时。

    自有 ID:OTP-14681

  • 使组立即对来自 shell(例如 ssh)的 EXIT 信号做出反应。

    自有 ID:OTP-14991 辅助 ID:PR1705

  • 现在对关闭的套接字调用 gen_tcp:send/2 返回 {error, closed} 而不是 {error,enotconn}

    自有 ID:OTP-15001

  • included_applications 键不再作为应用程序环境变量重复。之前,包含的应用程序既可以使用 application:get[_all]_env(...) 函数读取,也可以使用 application:get[_all]_key(...) 函数读取。现在,只能使用 application:get[_all]_key(...) 读取。

    *潜在的不兼容性*

    自有 ID:OTP-15071

  • 通过 file:write_file_infofile:change_ownerfile:change_group 进行的所有者和组更改将不再在权限错误时报告成功。

    *潜在的不兼容性*

    自有 ID:OTP-15118

改进和新特性

  • Erlang/OTP 中新增了一个日志记录 API,请参阅 logger 手册页和 Kernel 用户指南中的 日志记录 部分。

    error_logger 的调用会自动重定向到新的 API,并且仍然可以使用旧的错误日志记录事件处理程序。但是,建议在编写新代码时直接使用 Logger API。

    请注意以下潜在的不兼容性

    • 内核配置参数 error_logger 仍然有效,但如果默认处理程序的输出目标配置了内核配置参数 logger,则会被覆盖。

      通常,用于配置错误日志记录器的参数会被用于配置 Logger 的新参数覆盖。

    • SASL 错误日志记录的概念已弃用,这意味着默认情况下,SASL 应用程序不会影响记录哪些日志事件。

      默认情况下,supervisor 报告和崩溃报告由 Kernel 启动的默认 Logger 处理程序记录,并最终与来自 Erlang/OTP 的其他标准日志事件到达相同的目标(终端或文件)。

      默认情况下不记录进度报告,但可以通过将主日志级别设置为 info 来启用,例如使用内核配置参数 logger_level

      要获得与早期版本中的 SASL 错误日志记录功能向后兼容的能力,请将内核配置参数 logger_sasl_compatible 设置为 true。这会阻止默认的 Logger 处理程序记录任何 supervisor 报告、崩溃报告或进度报告。相反,SASL 在应用程序启动期间添加一个单独的 Logger 处理程序,该处理程序负责这些日志事件。SASL 配置参数 sasl_error_loggersasl_errlog_type 指定这些事件的日志记录目标(终端或文件)和严重级别。

    由于 Logger 是 Erlang/OTP 21.0 中的新功能,我们保留在此版本之后的补丁中对 Logger API 和功能进行更改的权利。这些更改可能与初始版本向后兼容,也可能不兼容。

    *潜在的不兼容性*

    自有 ID:OTP-13295

  • 函数 inet:i/0 已被记录。

    自有 ID:OTP-13713 辅助 ID:PR-1645

  • netnsbind_to_device 选项的类型规范已添加到 gen_tcpgen_udpgen_sctp 函数中。

    自有 ID:OTP-14359 辅助 ID:PR-1816

  • 引入了用于实现 Erlang 分布的替代载体的新功能。这主要包括对使用分布控制器进程的支持(以前只能将端口用作分布控制器)。有关更多信息,请参阅 ERTS 用户指南 ➜ 如何为 Erlang 分布实现替代载体 ➜ 分布模块

    自有 ID:OTP-14459

  • seq_trace 标签现在可以是任何 erlang 项。

    自有 ID:OTP-14899

  • SSL 分布协议 -proto inet_tls 已停止设置 SSL 选项 server_name_indication。在 inet_tls_dist 中添加了新的客户端和服务器验证函数,尚未记录,如果对等证书中存在节点名称,则会检查节点名称。用法也尚未记录。

    自有 ID:OTP-14969 辅助 ID:OTP-14465、ERL-598

  • gen_server 调用到 auth 服务器的超时时间从默认的 5 秒更改为 infinity

    自有 ID:OTP-15009 辅助 ID:ERL-601

  • 传递给 erl 的 -epmd_module 的回调模块已扩展为能够执行名称和端口解析。

    文档也已添加到 erl_epmd 参考手册和 ERTS 用户指南 如何为 Erlang 分布实现替代节点发现 中。

    自有 ID:OTP-15086 辅助 ID:PR-1694

  • 在 sys.config 中使用相对路径指定的包含配置文件现在首先相对于 sys.config 本身的目录进行搜索。如果找不到,也会相对于当前工作目录进行搜索。后者是为了向后兼容。

    自有 ID:OTP-15137 辅助 ID:PR-1838

Kernel 5.4.3.2

修复的错误和故障

  • dist_util.erl 中非语义更改,以消除 dialyzer 警告。

    自有 ID:OTP-15170

Kernel 5.4.3.1

修复的错误和故障

  • 修复了在节点间分布连接上发送心跳的方式中一些潜在的错误行为。即使有未发送的缓冲数据,现在也会向 c 节点发送心跳,因为 c 节点需要心跳才能发送回复心跳。当由于未发送的缓冲数据而抑制心跳时,发送的数据量计算错误。

    自有 ID:OTP-15162 辅助 ID:ERIERL-191

Kernel 5.4.3

修复的错误和故障

  • 更正了一些合约。

    自有 ID:OTP-14889

  • 拒绝加载名称包含目录分隔符(Windows 上为 '/' 或 '\')的模块。

    自有 ID:OTP-14933 辅助 ID:ERL-564、PR-1716

  • 修复了 Windows 上 os:cmd/2 选项 max_size 的处理错误。

    自有 ID:OTP-14940

Kernel 5.4.2

修复的错误和故障

  • 添加了 os:cmd/2,它将选项映射作为第二个参数。

    max_size 作为 os:cmd/2 的一个选项添加,用于控制 os:cmd/2 将返回的结果的最大大小。

    自有 ID:OTP-14823

Kernel 5.4.1

修复的错误和故障

  • 重构了一个内部 API。

    自有 ID:OTP-14784

Kernel 5.4

修复的错误和故障

  • 切换作业 (Ctrl+G) 后进行输出的进程可能会永远卡在 I/O 请求中。

    自有 ID:OTP-14571 辅助 ID:ERL-472

改进和新特性

  • 现在可以在锁计数模拟器中运行时完全切换锁计数 (-emu_type lcnt)。默认情况下,一切都处于启用状态以匹配旧的行为,但是当禁用时,可以使用最小的运行时开销随意切换特定的类别。有关详细信息,请参阅 lcnt:rt_mask/1 上的文档。

    自有 ID:OTP-13170

  • lcnt:collectlcnt:clear 将不再阻止运行时系统中的所有其他线程。

    自有 ID:OTP-14412

  • 常规 Unicode 改进。

    自有 ID:OTP-14462

Kernel 5.3.1

修复的错误和故障

  • disk_log:open/1 中 'quiet' 选项的文档具有不正确的默认值。

    自有 ID:OTP-14498

Kernel 5.3

修复的错误和故障

  • 已修复函数 inet:ntoa/1,使其根据编写此函数后批准的 RFC 5935 返回小写字母。以前返回大写字母,因此这可能是一个向后不兼容的更改,具体取决于返回的地址字符串的使用方式。

    已修复函数 inet:parse_address/1 以接受作用域地址上的 % 后缀。这些地址尚不起作用,但不会产生解析错误。

    *潜在的不兼容性*

    自有 ID:OTP-13006 辅助 ID:ERIERL-20、ERL-429

  • 修复了在 Linux 上 gethostname 错误地因 enametoolong 而失败的错误。

    自有 ID:OTP-14310

  • 修复了当为模块启用 local 调用跟踪时,导致 code:is_module_native 错误返回 true 的错误。

    自有 ID:OTP-14390

  • 添加了对来自分布式节点的无效节点名称的早期拒绝。

    自有 ID:OTP-14426

改进和新特性

  • 由于现在允许在原子中使用 Unicode,因此需要对节点名称进行额外的检查,这些名称被限制为 Latin-1。

    自有 ID:OTP-13805

  • 替换了已弃用的符号 时间单位 表示法的使用。

    自有 ID:OTP-13831 辅助 ID:OTP-13735

  • file:write_file(Name, Data, [raw]) 会在写入之前将 Data 转换为单个二进制文件。这意味着如果给定二进制文件列表并告知使用 raw 模式写入,则无法利用 writev() 系统调用。

    自有 ID:OTP-13909

  • 在某些极端情况下(大项),disk_log 的性能得到了一定的提高,并且文档已得到澄清。

    自有 ID:OTP-14057 辅助 ID:PR-1245

  • 已添加用于检测已更改代码的功能。code:modified_modules/0 返回所有当前加载的、在磁盘上已更改的模块。code:module_status/1 返回模块的状态。在 shell 和 c 模块中,mm/0code:modified_modules/0 的简写,而 lm/0 重新加载所有当前加载的、在磁盘上已更改的模块。

    自有 ID:OTP-14059

  • 在 Erlang 中引入一个事件管理器来处理操作系统信号。可以订阅操作系统信号的子集,这些信号在 Kernel 应用程序中描述。

    自有 ID:OTP-14186

  • 现在,在支持的平台上,套接字可以绑定到设备 (SO_BINDTODEVICE)。

    例如,这已实现以支持 Linux 下的 VRF-Lite;请参阅 VRF 和 GitHub 拉取请求 #1326

    自有 ID:OTP-14357 辅助 ID:PR-1326

  • 添加了将 shell_history 存储在磁盘上的选项,以便可以在会话之间重用历史记录。

    自有 ID:OTP-14409 辅助 ID:PR-1420

  • gen_servergen_statemproc_lib 创建的崩溃报告的大小通过 Kernel 应用程序变量 error_logger_format_depth 来限制。目的是限制当具有巨大消息队列或状态的进程崩溃时发送到 error_logger 进程的消息的大小。

    proc_lib 生成的崩溃报告包括新的标签 message_queue_len。邻居报告也包括新的标签 current_stacktrace。最后,邻居报告不再包括标签 messagesdictionary

    可以使用新函数 error_logger:get_format_depth/0 来检索 Kernel 应用程序变量 error_logger_format_depth 的值。

    自有 ID:OTP-14417

  • global 模块使用的其中一个 ETS 表格使用 {read_concurrency, true} 创建,以减少争用。

    自有 ID:OTP-14419

  • 已在相关文档中添加警告,说明不要在暴露的环境中使用不安全的分布式节点。

    自有 ID:OTP-14425

Kernel 5.2

修复的错误和故障

  • 修复了 os:cmd 清理期间的竞争,该竞争可能导致 os:cmd 无限期挂起。

    自有 ID:OTP-14232 辅助 ID:seq13275

改进和新功能

  • 在 'file' 模块中接受路径列表的函数(例如 file:path_consult/2)现在如果路径包含非目录的内容,将继续在路径中搜索。

    自有 ID:OTP-14191

  • 已知接收大量消息的两个 OTP 进程是 'rex'(由 'rpc' 使用)和 'error_logger'。这些进程现在将未处理的消息存储在进程堆之外,这可能会降低垃圾回收的成本。

    自有 ID:OTP-14192

Kernel 5.1.1

修复的错误和故障

  • code:add_pathsa/1 和命令行选项 -pa 在代码路径的开头添加给定目录列表时都会反转该列表。现在已经记录在案。

    自有 ID:OTP-13920 辅助 ID:ERL-267

  • 添加了对 erts-8.1 的丢失运行时依赖项。这应该在 kernel-5.1 (OTP-19.1) 中完成,因为它至少在 erts-8.1 (OTP-19.1) 的情况下才能运行。

    自有 ID:OTP-14003

  • 改进了 gen_{tcp,udp,sctp}:controlling_process/2 的类型和文档。

    自有 ID:OTP-14022 辅助 ID:PR-1208

Kernel 5.1

修复的错误和故障

  • 修复了调用 seq_trace:get_system_tracer() 时出现的内存泄漏。

    自有 ID:OTP-13742

  • 修复了当将应用程序的 ebin 目录添加到代码路径时,code:priv_dir/1 函数返回相同应用程序的 priv 目录的错误路径的问题。

    自有 ID:OTP-13758 辅助 ID:ERL-195

  • 修复了添加两层代码路径时代码服务器崩溃的问题。

    自有 ID:OTP-13765 辅助 ID:ERL-194

  • 在连接到 EPMD 时遵守 -proto_dist 开关

    自有 ID:OTP-13770 辅助 ID:PR-1129

  • 修复了一个错误,该错误会导致当具有无限关闭超时(例如,主管)的进程在终止时尝试加载代码时,init:stop 可能会死锁。

    自有 ID:OTP-13802

  • 关闭 os:cmd 中运行的命令的 stdin。这是一个向后兼容性修复,恢复了 19.0 之前 os:cmd 的行为。

    自有 ID:OTP-13867 辅助 ID:seq13178

改进和新功能

  • 添加 net_kernel:setopts/2net_kernel:getopts/2 以在运行时控制分发套接字的选项。

    自有 ID:OTP-13564

  • 以 IPv6 套接字的 tclass 套接字选项的形式实现了对 DSCP 的基本支持。

    自有 ID:OTP-13582

Kernel 5.0.2

修复的错误和故障

  • 当从将 trap_exit 设置为 true 的进程调用 os:cmd 时,'EXIT' 消息将保留在消息队列中。此错误是在 kernel vsn 5.0.1 中引入的。

    自有 ID:OTP-13813

Kernel 5.0.1

修复的错误和故障

  • 修复了一个 os:cmd 错误,其中使用 & 创建后台作业会导致 os:cmd 挂起,直到后台作业终止或关闭其 stdout 和 stderr 文件描述符。此错误从 kernel 5.0 开始就存在。

    自有 ID:OTP-13741

Kernel 5.0

修复的错误和故障

  • 改进了 on_load 函数的处理。主要的改进是,如果由于 on_load 函数失败导致代码升级失败,则现在将保留该模块的先前版本。

    自有 ID:OTP-12593

  • rpc:call()rpc:block_call() 有时会引发异常(文档中未提及)。此问题已得到纠正,因此将改为返回 {badrpc,Reason}

    自有 ID:OTP-13409

  • 在 Windows 上,对于早期加载的模块(例如 lists 模块),code:which/1 将返回带有混合斜杠和反斜杠的路径,例如:"C:\\Program Files\\erl8.0/lib/stdlib-2.7/ebin/lists.beam"。此问题已得到纠正。

    自有 ID:OTP-13410

  • 使 file:datasync 在 Mac OSX 上使用 fsync 而不是 fdatasync。

    自有 ID:OTP-13411

  • 为了减少连接问题,在没有本机 sendfile 的平台上使用的备用 sendfile 实现的默认块大小已减小。

    自有 ID:OTP-13444

  • 在某些 Unix 平台(例如,OS X 和 FreeBSD)上,大文件写入(2Gb 或更多)可能会失败。

    自有 ID:OTP-13461

  • 修复了一个错误,其中 DNS 解析器 inet_res 在启动后没有立即刷新其对例如 resolv.conf 内容的视图,因此导致名称解析失败。由 Michal Ptaszek 在 GitHUB 拉取请求 #949 中报告并提出了修复建议。

    自有 ID:OTP-13470 辅助 ID:Pull #969

  • 修复了 global_group 中的进程泄漏。

    自有 ID:OTP-13516 辅助 ID:PR-1008

  • 函数 inet:gethostbyname/1 现在遵循解析器选项 inet6,而不是始终查找 IPv4 地址。

    *潜在的不兼容性*

    自有 ID:OTP-13622 辅助 ID:PR-1065

  • 现在会对 init:stop/1Status 参数进行健全性检查,以确保 erlang:halt 不会失败。

    自有 ID:OTP-13631 辅助 ID:PR-911

改进和新功能

  • 向 inet:setopts/2 和 decode_packet/3 添加 {line_delim, byte()} 选项

    自有 ID:OTP-12837

  • 添加了 os:perf_counter/1

    perf_counter 是一个非常非常廉价且高分辨率的定时器,可用于为系统事件添加时间戳。它没有单调性保证,但在大多数操作系统上都应该显示单调时间。

    自有 ID:OTP-12908

  • 在 unix 平台上优化了 os:cmd 调用,以便更好地随调度器数量进行缩放。

    自有 ID:OTP-13089

  • 已将可以一次加载多个模块的新函数添加到 'code' 模块。这些函数是 code:atomic_load/1code:prepare_loading/1code:finish_loading/1code:ensure_modules_loaded/1

    自有 ID:OTP-13111

  • 结果证明代码路径缓存功能在实践中不是很有用,因此已被删除。如果尝试启用代码路径缓存,将有一个警告报告通知用户该功能已被删除。

    自有 ID:OTP-13191

  • 当尝试使用与现有节点相同的名称启动分布式 Erlang 节点时,错误消息将比以前更短且更易于阅读。示例

    协议 'inet_tcp':名称 somename@somehost 似乎已被另一个 Erlang 节点使用

    自有 ID:OTP-13294

  • 默认错误记录器的输出稍微漂亮且更易于阅读。默认错误记录器在 OTP 系统启动期间使用。如果启动失败,输出将更易于阅读。

    自有 ID:OTP-13325

  • 已删除 R12B 中已弃用的函数 rpc:safe_multi_server_call/2,3

    *潜在的不兼容性*

    自有 ID:OTP-13449

  • 更新 dist_util 中的错误原因,并在调用了 net_kernel:verbose(1) 的情况下在日志中显示它们。

    自有 ID:OTP-13458

  • 已实现对 Unix 域套接字的实验性支持。如果您想尝试一下,请阅读源代码。示例:gen_udp:open(0, [{ifaddr,{local,"/tmp/socket"}}])。在收到用户对实验性 API 的反馈后,将编写文档。

    自有 ID:OTP-13572 辅助 ID:PR-612

  • 允许将 heart 配置为在调用 HEART_COMMAND 之前不杀死先前的仿真器。这是通过将环境变量 HEART_NO_KILL 设置为 TRUE 来完成的。

    自有 ID:OTP-13650

Kernel 4.2

修复的错误和故障

  • code:load_abs([10100]) 将导致整个运行时系统崩溃并创建崩溃转储。已更正为在调用进程中生成错误异常。

    还更正了代码加载函数的规范,并在文档中添加了有关代码加载函数返回的错误原因的更多信息。

    自有 ID:OTP-9375

  • gen_tcp:accept/2 并非时间扭曲安全的。这是因为它在计算超时时使用了与 erlang:now/0 返回的相同时间。现在这个问题已得到修复。

    自有 ID:OTP-13254 辅助 ID:OTP-11997,OTP-13222

  • 修正了 inet:getifaddrs/1 的契约。

    自有 ID:OTP-13335 辅助 ID:ERL-95

改进和新特性

  • 改进了时间扭曲安全性。

    在跟踪、顺序跟踪和系统性能分析功能中引入了 monotonic_timestampstrict_monotonic_timestamp 选项。这是因为已有的 timestamp 选项不是时间扭曲安全的。

    ets:info/2dets:info/2 中引入了 safe_fixed_monotonic_time 选项。这是因为已有的 safe_fixed 选项不是时间扭曲安全的。

    自有 ID:OTP-13222 辅助 ID:OTP-11997

  • 为 heart 添加验证回调

    erlang heart 进程现在可以安装验证回调。如果存在验证回调,则在任何心跳发送到 heart 端口程序之前执行该回调。如果验证失败或停滞,则不会发送心跳,并且节点将关闭。

    使用选项 'check_schedulers',heart 在心跳发送到端口程序之前执行调度程序的响应性检查。如果响应性检查失败,则不会执行心跳(如预期)。

    自有 ID:OTP-13250

  • 澄清了 net_kernel:allow/1 的文档

    自有 ID:OTP-13299

  • EPMD 同时支持 IPv4 和 IPv6

    也影响了最早支持的 Windows 版本。

    自有 ID:OTP-13364

Kernel 4.1.1

修复的 Bug 和故障

  • 现在,根据 RFC 4343,通过 inet_res(Erlang DNS 解析器)进行的主机名查找是不区分大小写的。由 Holger Weiß 提交的补丁。

    自有 ID:OTP-12836

  • IPv6 分发处理程序已更新为与 IPv4 共享代码,以便在 IPv6 中也支持所有功能。修复了使用 IPv4 地址作为主机名时出现的错误。

    自有 ID:OTP-13040

  • 根据 RFC 4343,内部 DNS 解析器 inet_res 中主机名的缓存已设置为不区分大小写。

    自有 ID:OTP-13083

  • 修复了 cooked 文件模式缓冲,因此在 Posix 系统上,file:position/2 现在按照 Posix 的规定工作,即当 file:position/2 返回错误时,文件指针不受影响。

    但是,Windows 系统文档在这方面尚不明确,因此 file:position/2 的文档仍然不承诺任何内容。

    已修正 cooked 文件模式 file:pread/2,3 和 file:pwrite/2,3 以遵循字符编码,就像 file:position/2 和 file:read/2 或 file:write/2 的组合一样。这可能不是很有用,因为调用者端的字符表示形式始终是 latin1。

    自有 ID:OTP-13155 辅助 ID:PR#646

改进和新特性

  • 向 inet:setopts/2 和 decode_packet/3 添加 {line_delim, byte()} 选项

    自有 ID:OTP-12837

Kernel 4.1

改进和新特性

  • 引入了一种机制,用于限制内置错误记录器事件将产生的文本量。它对于限制日志文件的大小和用于生成日志文件的 CPU 时间都很有用。

    此机制是实验性的,这意味着如果事实证明它没有解决它应该解决的问题,则可能会进行更改。在这种情况下,此机制可能会有向后不兼容的改进。

    有关如何启用此功能的信息,请参阅 Kernel 应用程序中配置参数 error_logger_format_depth 的文档。

    自有 ID:OTP-12864

Kernel 4.0

修复的 Bug 和故障

  • 修复了 file:read_line/1 对 Unicode 内容的错误处理。

    自有 ID:OTP-12144

  • 引入了 os:getenv/2,它类似于 os:getenv/1,但如果所需的 环境变量未定义,则返回传递的默认值。

    自有 ID:OTP-12342

  • 现在可以在 JCL 模式下(使用 Ctrl-Y)粘贴在之前的 shell 会话中复制的文本。还修复了粘贴文本时导致 JCL 模式崩溃的错误。

    自有 ID:OTP-12673

  • 确保从字符串解析 IPv6 地址时,每个段的最大位数为 4 个十六进制数字

    自有 ID:OTP-12773

改进和新特性

  • 新的 BIF:erlang:get_keys/0,列出与进程字典关联的所有键。注意:erlang:get_keys/0 是自动导入的。

    *潜在的不兼容性*

    自有 ID:OTP-12151 辅助 ID:seq12521

  • 内部 group 到 user_drv 协议已更改为同步,以保证发送到实现 user_drv 协议的进程的输出在回复之前被打印。此协议由 standard_output 设备和 ssh 应用程序在充当客户端时使用。

    此更改将以前打印到 standard_io 和最终进入 user_drv 的其他设备时的无限缓冲区更改为 1KB。

    *潜在的不兼容性*

    自有 ID:OTP-12240

  • inflateInit/2deflateInit/6 函数现在接受等于 8 和 -8 的 WindowBits 参数。

    自有 ID:OTP-12564

  • 默认情况下,将错误记录器警告映射到警告消息。

    自有 ID:OTP-12755

  • 默认情况下,将 beam 错误记录器警告映射到警告消息。以前,这些消息默认映射到错误通道。

    自有 ID:OTP-12781

  • gen_tcp:shutdown/2 现在是异步的

    这解决了旧实现中的以下问题

    当 TCP 对等方空闲或速度较慢时,它不会阻塞。这是调用 shutdown() 时的预期行为:调用方需要能够继续从套接字读取,而不是被阻止这样做。

    它不会截断输出。如果 TCP 对等方空闲或速度较慢,当前版本的 gen_tcp:shutdown/2 将在大约 10 秒后截断驱动程序队列中的任何出站数据。更糟糕的是,它甚至不会通知任何人数据已被截断:向调用方返回“ok”;并且向 TCP 对等方发送 FIN 而不是 RST。

    *潜在的不兼容性*

    自有 ID:OTP-12797

  • 在许多情况下,用户代码需要能够区分正常关闭的套接字和中止的套接字。设置选项 {show_econnreset, true} 使用户能够在主动和被动套接字上接收 ECONNRESET 错误。

    自有 ID:OTP-12843

Kernel 3.2.0.1

修复的 Bug 和故障

  • 由于只使用了一个选项,因此无法在对任何 gen_tcp 函数的一次调用中多次使用“raw”套接字选项。此错误已得到修复,并且还修复了一个关于从 inet:setopts/2 中传播错误代码的小错误。

    自有 ID:OTP-11482 辅助 ID:seq12872

Kernel 3.2

修复的 Bug 和故障

  • 更正了导致主机名解析中无限循环的错误。要触发此错误,您必须从配置文件(例如 .inetrc)输入错误的搜索方法。

    由 Emil Holmström 发现的错误

    自有 ID:OTP-12133

  • standard_error 进程现在可以正确处理 getopts I/O 协议请求,并以与 standard_io 相同的方式存储其编码。

    此外,io:put_chars(standard_error, [oops]) 之前可能会使 standard_error 进程崩溃。现在已更正此问题。

    自有 ID:OTP-12424

改进和新特性

  • 添加了 Kernel 应用程序的配置参数,允许为分发套接字设置套接字选项。请参阅应用程序 Kernel 文档;参数“inet_dist_listen_options”和“inet_dist_connect_options”。

    自有 ID:OTP-12476 辅助 ID:OTP-12476

Kernel 3.1

修复的 Bug 和故障

  • 确保在需要时安装 .hrl 文件

    自有 ID:OTP-12197

  • 从 kernel 应用程序中删除了未记录的应用程序环境变量“raw_files”。每次要在 file 模块中打开原始文件时,都会检查此变量(通过调用 application:get_env/2)。

    自有 ID:OTP-12276

  • 修复了在 gen_udp 中使用 netns 选项时出现的错误,该错误仅在它是最后一个选项时才起作用。

    自有 ID:OTP-12314

改进和新特性

  • 更新了有关 inet 缓冲区大小选项的文档。

    自有 ID:OTP-12296

  • 在 file_info 和 link_info 函数中引入了新选项“raw”。此选项允许调用方不通过文件服务器获取有关保证是本地文件的信息。

    自有 ID:OTP-12325

内核 3.0.3

已修复的错误和故障

  • 在 net_adm:names/1 中接受 inet:ip_address()

    自有 ID:OTP-12154

内核 3.0.2

已修复的错误和故障

  • OTP-11850 修复了 filelib:wildcard/1 以使其能够处理损坏的符号链接。然而,此修复引入了问题,因为对于 filelib:ensure_dir/1、filelib:is_dir/1、filelib:file_size/1 等函数,不再跟踪符号链接。现在已对此进行纠正。

    自有 ID:OTP-12054 辅助 ID:seq12660

内核 3.0.1

已修复的错误和故障

  • 如果传递给 application_controller:change_application_data 的配置包含其他配置文件,则只会为已存在的(已加载的)应用程序展开。如果升级添加了一个新的应用程序,该应用程序在包含的配置文件中有配置数据,则新的应用程序不会获得正确的配置数据。

    现在已更改为将为所有应用程序展开配置数据。

    自有 ID:OTP-11864

  • 允许重新加载预加载的模块,例如 erlang,但这可能会导致奇怪和不希望发生的事情,例如调用 apply/3 进入循环。预加载的模块现在默认是粘性的。(感谢 Loïc Hoguin 报告此错误。)

    code:add_path("/ending/in/slash/") 删除尾部的斜杠,将 /ending/in/slash 添加到代码路径。然而,code:del_path("/ending/in/slash/") 将无法删除路径,因为它没有删除尾部的斜杠。此问题已修复。

    自有 ID:OTP-11913

  • 修复 erts_debug:size/1 以处理 Map 大小

    自有 ID:OTP-11923

  • 已删除 file:file_info/1 的文档。该函数本身很久以前就被删除了。

    自有 ID:OTP-11982

内核 3.0

已修复的错误和故障

  • 修复了终止应用程序中的死锁可能性

    自有 ID:OTP-11171

  • 修复了当套接字处于被动模式时,sendfile 会为远程关闭的套接字返回错误代码的错误。(感谢 Vincent Siliakus 报告此错误。)

    自有 ID:OTP-11614

  • 新的选项 persistent 已添加到 application:set_env/4application:unset_env/3。使用 persistent 选项设置的环境键不会被加载时在应用程序资源文件中配置的环境键覆盖。这意味着持久值将在应用程序加载后以及应用程序重新加载时保持不变。(感谢 José Valim)

    自有 ID:OTP-11708

  • file:set_cwd/1 的规范已修改为也接受二进制文件作为参数。这在代码中一直允许,但它没有反映在规范中,因为二进制文件主要用于原始文件名。原始文件名是未根据 file:native_name_encoding() 编码的名称,这些名称在 file:set_cwd/1 中是不允许的。但是,为了避免不必要的 dialyzer 警告,规范现在更加宽容。原始文件名仍然会在运行时因“no_translation”的原因而失败。(感谢 José Valim)

    自有 ID:OTP-11787

改进和新功能

  • heart:set_cmd/1 已更新,允许给定的 heart 命令中使用 Unicode 代码点 > 255

    自有 ID:OTP-10843

  • Dialyzer 的 unmatched_return 警告已得到纠正。

    自有 ID:OTP-10908

  • 使 erlang:open_port/2 spawn 和 spawn_executable 处理 Unicode。

    自有 ID:OTP-11105

  • Erlang/OTP 已移植到实时操作系统 OSE。该端口支持 smp 和非 smp 仿真器。有关该端口以及如何启动的详细信息,请参阅 ose 应用程序中的用户指南。

    请注意,并非 Erlang/OTP 的所有部分都已移植。

    有效的主要功能包括:非 smp 和 smp 仿真器、OSE 信号交互、crypto、asn1、run_erl/to_erl、tcp、epmd、分布以及 Erlang 的大多数(如果不是全部)非操作系统特定功能。

    无效的主要功能包括:udp/sctp、os_mon、erl_interface、调度程序绑定。

    自有 ID:OTP-11334

  • 为 TCP、UDP 和 SCTP 添加 {active,N} 套接字选项,其中 N 是范围在 -32768..32767 之间的整数,允许调用者指定要传递给控制进程的数据消息数。一旦套接字的已传递消息计数达到 0 或通过 inet:setopts/2 显式设置为 0,或者在创建套接字时将 {active,0} 作为选项包含在内,则套接字将转换为被动 ({active, false}) 模式,并且套接字的控制进程会收到一条消息以通知其转换。TCP 套接字接收 {tcp_passive,Socket},UDP 套接字接收 {udp_passive,Socket},SCTP 套接字接收 {sctp_passive,Socket}。

    套接字的已传递消息计数器默认为 0,但可以通过任何将套接字选项作为参数的 gen_tcp、gen_udp 或 gen_sctp 函数,或通过 inet:setopts/2 使用 {active,N} 来设置。新的 N 值会添加到套接字的当前计数器值中,并且可以使用负数来减少计数器值。指定一个会导致套接字的计数器值超过 32767 的数字会导致 einval 错误。如果指定的负数会导致计数器值变为负数,则套接字的计数器值将设置为 0,并且套接字将转换为被动模式。如果计数器值已为 0,并且指定了 inet:setopts(Socket, [{active,0}]),则计数器值仍为 0,但会为套接字生成相应的被动模式转换消息。

    感谢 Steve Vinoski

    自有 ID:OTP-11368

  • 调用 garbage_collect/1 BIF 或 check_process_code/2 BIF 可能会触发对调用 BIF 的进程以外的其他进程的垃圾回收。之前的实现执行这些类型的垃圾回收时没有考虑正在垃圾回收的进程的内部状态。为了能够更轻松、更高效地实现产生本机代码,这些类型的垃圾回收已被重写。这样的垃圾回收现在由异步请求信号触发,实际的垃圾回收由正在垃圾回收的进程本身执行,并通过向发出请求的进程发送回复信号来完成。使用这种方法,进程可以禁用垃圾回收并产生,而无需将堆设置为可以进行垃圾回收的状态。

    引入了 garbage_collect/2check_process_code/3 BIF。两者都将选项列表作为最后一个参数。使用这些选项,可以发出异步请求。

    code:purge/1code:soft_purge/1 已重写,以利用异步 check_process_code 请求来并行化工作。

    特性影响:调用 garbage_collect/1 BIF 或 check_process_code/2 BIF 通常需要更长的时间才能完成,而系统整体上不会像以前那样受到操作的负面影响。调用 code:purge/1code:soft_purge/1 可能会更快或更慢地完成,具体取决于系统的状态,而系统整体上不会像以前那样受到操作的负面影响。

    自有 ID:OTP-11388 辅助 ID:OTP-11535, OTP-11648

  • 向 file:open/2 添加 sync 选项。

    sync 选项将 POSIX O_SYNC 标志添加到支持该标志或其等效标志的平台上的 open 系统调用中,例如 Windows 上的 FILE_FLAG_WRITE_THROUGH。对于不支持该标志的平台,如果传入 sync 选项,则 file:open/2 将返回 {error, enotsup}。感谢 Steve Vinoski 和 Joseph Blomstedt

    自有 ID:OTP-11498

  • 已纠正 inet:ntoa/1 的约定。

    感谢 Max Treskin。

    自有 ID:OTP-11730

内核 2.16.4.1

已知错误和问题

  • 当使用 gen_tcp:connect 和带有 port 和/或 ipfd 选项时,将忽略 portip 选项。这已修复,以便如果 port 和/或 ipfd 一起指定,则会为该 fd 请求绑定。如果未指定 port 和/或 ip,则不会调用绑定。

    自有 ID:OTP-12061

内核 2.16.4

已修复的错误和故障

  • 修复 inet:ifget/2 和 inet:ifget/3 返回值的类型规范。感谢 Ali Sabil。

    自有 ID:OTP-11377

  • 修复 erts、kernel 和 ssh 中的各种拼写错误。感谢 Martin Hässler。

    自有 ID:OTP-11414

  • 修复 rpc 多次调用示例代码。感谢 Edwin Fine。

    自有 ID:OTP-11471

  • 在极少数情况下,调用 inet:close/1gen_tcp:close/1gen_udp:close/1gen_sctp:close/1 的进程可能会无限期地挂起。

    自有 ID:OTP-11491

改进和新特性

  • 根据 RFC 4960 的描述,添加更多 SCTP 错误。感谢 Artem Teslenko。

    内部编号:OTP-11379

  • 添加新的 BIF os:unsetenv/1,用于删除环境变量。感谢 Martin Hässler。

    内部编号:OTP-11446

Kernel 2.16.3

修复的 Bug 和故障

  • 修复 Erlang shell 中用户切换命令帮助的缩进问题。感谢 Sylvain Benner。

    内部编号:OTP-11209

改进和新特性

  • 之前未记录的函数 ntoa/1 已添加到 inet 文档中,并在 inet 模块中导出。

    内部编号:OTP-10676 辅助编号:OTP-10314

  • 修复 abcast() 函数注释中的拼写错误。感谢 Johannes Weissl。

    内部编号:OTP-11219

  • 添加 application:ensure_all_started/1-2。感谢 Fred Hebert。

    内部编号:OTP-11250

  • 使 edlin 理解一些重要的控制键。感谢 Stefan Zegenhagen。

    内部编号:OTP-11251

  • 清理 hipe_unified_loader,消除规范中使用 is_subtype/2 的情况,将模块本地 void 函数更改为返回 'ok' 而不是 [],并确保使用 --Wunmatched_returns 时没有 dialyzer 警告。感谢 Kostis Sagonas。

    内部编号:OTP-11301

Kernel 2.16.2

修复的 Bug 和故障

  • 修复了 prim_inet 中的一个错误。如果在关闭套接字端口时,端口所有者在不恰当的时间被杀死,端口可能会变成孤立状态,从而导致端口和套接字泄漏。由 Fred Herbert、Dmitry Belyaev 和其他人报告。

    内部编号:OTP-10497 辅助编号:OTP-10562

  • 修复了一些在使用内部查找类型(例如“file”和“dns”)时,主机名解析中关于大小写敏感性的错误。根据 RFC 4343 “域名系统 (DNS) 大小写不敏感性澄清”,查找主机名时,ASCII 字母 a-z 应被视为与 A-Z 相同,而以前并非总是如此。

    内部编号:OTP-10689 辅助编号:seq12227

改进和新特性

  • 添加 application:ensure_started/1,2。它等效于 application:start/1,2,只是对于已经启动的应用程序,它返回 ok

    内部编号:OTP-10910

  • 优化与文件 IO 服务器的通信。感谢 Anthony Ramine。

    内部编号:OTP-11040

  • 包含非 ASCII 字符的 Erlang 源文件现在使用 UTF-8 编码(而不是 latin1)。

    内部编号:OTP-11041 辅助编号:OTP-10907

  • 通过使用无锁实现,优化在同一套接字上同时进行的 inet_db 操作。

    对系统特性的影响:性能得到提升。

    内部编号:OTP-11074

  • 在 OTP-R16A 中引入的 high_msgq_watermarklow_msgq_watermark inet 套接字选项只能在 TCP 套接字上设置。这些选项现在是通用的,可以在所有类型的套接字上设置。

    内部编号:OTP-11075 辅助编号:OTP-10336

  • 修复 Windows 下 os:cmd/1 中深度列表参数错误。感谢 Aleksandr Vinokurov。

    内部编号:OTP-11104

Kernel 2.16.1

修复的 Bug 和故障

  • 修复了 application_controller 模块中可能导致崩溃并出现错误原因的错误。

    内部编号:OTP-10754

  • 修复了 code:is_module_native/1,在 R16A 中,有时对于包含 BIF(如 lists)的 hipe 编译模块会返回 false。

    内部编号:OTP-10870

  • 当接收失败(例如,由于格式错误的包)时,在非被动模式下,尊重 tcp 套接字上的 {exit_on_close,false} 选项,仅执行半关闭,仍然允许在该套接字上发送。(感谢 Anthony Molinaro 和 Steve Vinoski 报告此问题)

    内部编号:OTP-10879

改进和新特性

  • 当由于名称重复导致节点启动失败时,显示稍微友好的错误消息。感谢 Magnus Henoch。

    内部编号:OTP-10797

  • 由于 Unicode 支持进行的各种更新。

    内部编号:OTP-10820

  • 添加了一个新函数 code:get_mode(),可用于检测代码服务器的行为方式。感谢 Vlad Dumitrescu

    内部编号:OTP-10823

  • 修复 gen_tcp:send/2 中错误原因的类型。感谢 Sean Cribbs。

    内部编号:OTP-10839

  • 添加了可以处理原始文件名的 file:list_dir_all/1file:read_link_all/1。有关原始文件名的信息,请参阅 STDLIB 用户指南。

    内部编号:OTP-10852

Kernel 2.16

修复的 Bug 和故障

  • 在 .app 文件中,'modules' 列表中不再可能包含 {Mod,Vsn}

    虽然从未在 .app 文件参考手册中记录过,但早期是允许的。但它在 application:load/[1,2] 的文档中可见,其中与 .app 文件中相同的术语可以用作第一个参数。

    该可能性已被删除,因为 Vsn 部分从未使用过。

    *潜在的不兼容性*

    内部编号:OTP-10417

  • 更正了 erl_ddll:format_error/1 的约定。(感谢 Joseph Wayne Norton。)

    内部编号:OTP-10473

  • 更改启动时应用程序崩溃消息的打印输出为格式化字符串 (感谢 Serge Aleynikov)

    内部编号:OTP-10620

  • 更正了 base64 模块中的类型 ascii_string()。清理了类型 file:file_info()。在文档中,类型 file:fd() 已被设为不透明。

    内部编号:OTP-10624 辅助编号:kunagi-352 [263]

改进和新特性

  • Inet 导出的功能

    inet:parse_ipv4_address/1, inet:parse_ipv4strict_address/1, inet:parse_ipv6_address/1, inet:parse_ipv6strict_address/1, inet:parse_address/1 和 inet:parse_strict_address 现在从 inet 模块导出。

    内部编号:OTP-8067 辅助编号:kunagi-274 [185]

  • 添加了用于 IPv6 套接字的布尔套接字选项“ipv6_v6only”。该选项的默认值取决于操作系统,因此旨在实现可移植性的应用程序在创建 inet6 监听/目标套接字时应考虑使用 {ipv6_v6only,true},如有必要,还应在同一端口上创建一个 inet 套接字以处理 IPv4 流量。请参阅文档。

    内部编号:OTP-8928 辅助编号:kunagi-193 [104]

  • 实现了对 Unicode 的支持。

    内部编号:OTP-10302

  • 更新了 global:register_name/3 的文档,以提及将 {Module,Function} 作为方法参数(解析函数)的使用已弃用。

    内部编号:OTP-10419

  • 修复了在 Oracle Solaris 上执行 sendfile 时,如果完成部分发送将返回错误的 bug。

    内部编号:OTP-10549

  • 如果尝试调用现有模块中不存在的函数,则 error_handler 模块现在将调用 '$handle_undefined_function'/2。有关详细信息,请参阅 error_handler 模块的文档。

    内部编号:OTP-10617 辅助编号:kunagi-340 [251]

  • 在必要的情况下,Erlang 文件中添加了声明编码的注释。该注释旨在在 Erlang/OTP R17B 中删除,届时 UTF-8 将成为默认编码。

    内部编号:OTP-10630

  • 不要不必要地返回错误的术语。(感谢 Kostis Sagonas。)

    内部编号:OTP-10662

  • 更正了一些溢出 PDF 页面宽度的示例。

    内部编号:OTP-10665

  • 添加 file:allocate/3 操作

    此操作允许预先分配文件的空间。仅在支持此类操作的系统上才能成功。(感谢 Filipe David Manana)

    内部编号:OTP-10680

  • 添加 application:get_key/3。新函数为配置参数提供默认值。感谢 Serge Aleynikov。

    内部编号:OTP-10694

  • 向 Erlang shell 的历史记录添加搜索功能。感谢 Fred Herbert。

    内部编号:OTP-10739

Kernel 2.15.3

修复的 Bug 和故障

  • 确保在需要时生成“erl_crash.dump”。这将更改 erl_crash.dump 的行为。

    * 如果未设置 ERL_CRASH_DUMP_SECONDS,则现在在崩溃时会立即终止 beam,而不会写入崩溃转储文件。

    * 将 ERL_CRASH_DUMP_SECONDS 设置为 0 也会在崩溃时立即终止 beam,而不会写入崩溃转储文件,即与未设置 ERL_CRASH_DUMP_SECONDS 环境变量相同。

    * 将 ERL_CRASH_DUMP_SECONDS 设置为负值将使 beam 无限期地等待写入崩溃转储文件。

    * 将 ERL_CRASH_DUMP_SECONDS 设置为正值将使 beam 等待指定的秒数写入崩溃转储文件。

    如果 heart 正在运行,则正值会在 beam 和 heart 中设置一个警报/超时以重新启动。

    *潜在的不兼容性*

    内部编号:OTP-10422 辅助编号:kunagi-250 [161]

Kernel 2.15.2

修复的 Bug 和故障

  • 修复了当使用 controlling_process/2 且第二个参数为 self() 时,如果 self() 崩溃会导致端口泄漏的问题。(感谢 Ricardo Catalinas Jiménez)

    内部 ID: OTP-10094

  • 修复了使用 file:sendfile 回退时发送大文件会导致 file:sendfile 崩溃的问题。

    内部 ID: OTP-10098

  • 修复了 rpc:call/5 对于有限超时时间的本地调用的问题。(感谢 Tomer Chachamu)

    内部 ID: OTP-10149

  • 修复了 escript/主归档重新加载的问题

    如果 escript/主归档文件添加到代码路径后其 mtime 发生更改,则正确重新加载归档并更新缓存。(感谢 Tuncer Ayaz)

    内部 ID: OTP-10151

  • 在以 Unicode 文件模式运行的系统上(例如,在 MacOSX 或 Linux 上,使用启动参数 +fnu 或 +fna 以及正确的 LOCALE)支持使用非 ASCII 字符(代码点大于 127)命名的主目录。此外,在适用的环境中,也支持包含 Unicode 内容的环境变量。

    内部 ID: OTP-10160

  • 允许混合 IPv4 和 IPv6 地址用于 sctp_bindx

    还允许混合地址族进行绑定,因为多宿主 sctp 套接字上的第一个地址必须使用 bind 进行绑定,而其余地址则使用 sctp_bindx 进行绑定。至少 Linux 支持添加混合族的地址。即使在未定义 HAVE_SCTP 的情况下,也使 inet_set_faddress 函数可用,因为我们使用它来查找用于绑定的地址,以便能够混合 ipv4 和 ipv6 地址。感谢 Tomas Abrahamsson

    内部 ID: OTP-10217

改进和新特性

  • 记录 inet 选项:high_watermark、priority、linger 以及一些以前未记录的其他选项。

    内部 ID: OTP-10053

  • 从 inet 中删除 bit8 选项支持

    内部 ID: OTP-10056

  • 修正了磁盘日志头的类型。(感谢 Niclas Eklund)

    内部 ID: OTP-10131

内核 2.15.1

修复的错误和故障

  • 修正了驱动程序的输出,现在输出大型二进制文件(> 4 GiB)不会静默失败或使模拟器崩溃,而是输出二进制文件或使调用失败。这意味着现在可以将大于 4 Gib 的二进制文件写入文件,但在例如 64 位 Windows 上(其具有 32 位的分散/聚集 I/O 缓冲区段长度)会失败。将来可能会更改行为以始终写入二进制文件,必要时分部分写入。

    内部 ID: OTP-9820 辅助 ID: OTP-9795

  • erts:对不必要的条件进行小的修复 erts:将 SENDFILE_CHUNK_SIZE 从有符号更改为无符号(感谢 jovi zhang)

    内部 ID: OTP-9872

  • 更正了 gen_sctp 中的两个合约。

    内部 ID: OTP-9874

  • 如果进程调用具有正在运行的 on_load 处理程序的模块,则该进程应该被挂起。但是,如果带有 on_load 处理程序的模块正在加载时使用 code:load_binary/3,则该调用将失败并抛出 undef 异常。

    内部 ID: OTP-9875

  • 如果 cookie 创建失败,现在将返回文件名和错误原因。(感谢 Magnus Henoch)

    内部 ID: OTP-9954

  • 修复了当将无效数据传递给 compress,uncompress,zip,unzip,gzip,gunzipzlib 中的端口泄漏问题。

    内部 ID: OTP-9981

  • 更正了 global、error_logger、etop、lists、ets 和 supervisor 模块以及 c_portdriver 和 kernel_app 文档中各种拼写错误。(感谢 Ricardo Catalinas Jiménez)

    内部 ID: OTP-9987

  • 修复了当端口耗尽时 gen_tcp:accept/1,2 返回的错误。

    对于这种情况,{error, enfile} 返回值具有很强的误导性并且令人困惑,因为 Posix ENFILE 错误号具有明确的含义,与 Erlang 端口无关。该修复将返回值更改为 {error, system_limit},这与例如各种 file(3) 函数一致。inet:format_error/1 也已更新为以与 file:format_error/1 相同的方式支持 system_limit。(感谢 Per Hedeland)

    内部 ID: OTP-9990

  • 已更正 erts_debug:size/1 以考虑 funs 环境中的共享。对于 funs,它过去总是给出与 erts_debug:flat_size/1 相同的结果。

    内部 ID: OTP-9991

  • 在某些情况下,当执行 file:sendfile 的进程在发送文件时崩溃时,efile_drv 代码不会正确清理自身。现在已经修复了这个问题。

    内部 ID: OTP-9993

  • 在基于 BSD 的平台上,当发送大文件时,file:sendfile 有时会进入无限循环。现在已经修复了这个问题。

    内部 ID: OTP-9994

  • 尽管 disk_log 为了更好的性能而积极地收集记录的术语,但收集过多数据可能会阻塞系统并导致写入巨大的二进制文件。

    问题已在 OTP-9764 中解决,但并非在所有情况下都得到了改进。

    (感谢 Richard Carlsson。)

    内部 ID: OTP-9999 辅助 ID: OTP-9764

  • .app 文件的文档错误地指出 mod 参数的默认值为 undefined。现在已更正为 []

    内部 ID: OTP-10002

内核 2.15

修复的错误和故障

  • 已将对 global:whereis_name/1 的调用替换为对 global:safe_whereis_name/1 的调用,因为后者根本不安全。

    之前不这样做的原因是设置全局锁掩盖了与受监控子项的重新启动有关的错误。现在已通过修改 global:whereis_name/1 修复了该错误。(感谢 Ulf Wiger 的代码贡献。)

    修复了 gen_fsm:start* 中的一个小竞争条件:如果这些函数之一返回 {error, Reason} 或 ignore,则该名称仍然可以注册(本地或在 global 中)。(这与在 OTP-7669 中为 gen_server 所做的修改相同。)

    已删除未记录的函数 global:safe_whereis_name/1

    内部 ID: OTP-9212 辅助 ID: seq7117, OTP-4174

  • 通过 TCP 套接字和 erlang:decode_packet,对 http 数据包解析采用 packet_size 选项。这使您可以接受大于默认设置的 HTTP 标头,还可以通过仅接受您希望允许的长度的行来避免 DoS 攻击。为了保持一致性,数据包类型 line 也采用 packet_size 选项。(感谢 Steve Vinoski)

    内部 ID: OTP-9389

  • disk_log:reopen/2,3disk_log:breopen/3 可能会从 file:rename/2 返回错误原因,而不是 {file_error, Filename, Reason}。此错误已修复。

    根据文档,当截断或重新打开磁盘日志失败时,将发送的消息 {disk_log, Node, {error, disk_log_stopped}} 有时会变成回复。此错误已修复。

    *潜在的不兼容性*

    内部 ID: OTP-9508

  • 将环境变量“shutdown_timeout”添加到内核应用程序。以前,如果应用程序的顶级监督者在关闭请求时未终止,则 application_controller 将永远挂起。如果将此新环境变量设置为正整数 T,则应用程序控制器现在将在 T 毫秒后放弃,并改为强制终止应用程序。为了向后兼容,shutdown_timeout 的默认值为“infinity”。

    内部 ID: OTP-9540

  • 在 stdlib 的行为中添加“-callback”属性

    将 stdlib 行为中的 behaviour_info(callbacks) 导出替换为所有回调的 '-callback' 属性。使用有关回调属性的信息更新文档 从 '-callback' 属性自动生成 'behaviour_info' 函数

    'behaviour_info(callbacks)' 是在描述行为的模块中定义的特殊函数,并返回其回调的列表。

    现在使用 '-callback' 规范自动生成此函数。如果用户同时定义了 '-callback' 属性和 behaviour_info/1 函数,则 lint 将返回错误。如果回调不需要类型信息,请为其使用通用规范。将 '-callback' 属性添加到语言语法

    行为可以使用熟悉的 spec 语法为回调定义规范,并将 '-spec' 关键字替换为 '-callback'。执行简单的 lint 检查以确保没有重复定义回调,并且所有引用的类型都已声明。

    然后,工具可以使用这些属性为行为提供文档或查找回调模块中回调定义中的差异。

    将回调规范添加到内核中的“application”模块中 根据 Internet 文档将回调规范添加到 tftp 模块 根据可能已弃用的注释将回调规范添加到 inets_service 模块

    内部 ID: OTP-9621

  • 使 Tab 补全在远程 shell 中工作(感谢 Mats Cronqvist)

    内部 ID: OTP-9673

  • 在 heart 文档中添加缺少的括号。

    在参考手册的分布式部分中添加缺少的空格。

    在文档的 HTML 版本中,这些空格是分隔这些单词所必需的。

    内部 ID: OTP-9693

  • 修复 net_kernel:get_net_ticktime() 文档

    添加返回“ignored”时缺少的描述。(感谢 Ricardo Catalinas Jiménez)

    内部 ID: OTP-9713

  • 尽管 disk_log 为了更好的性能而积极地收集记录的术语,但收集过多数据可能会阻塞系统并导致写入巨大的二进制文件。为了纠正这种情况,引入了在写入磁盘之前收集的数据量(小)限制。

    内部 ID: OTP-9764

    • 更正应用程序模块中的回调规范
    • 改进有关具有额外范围的回调规范的警告
    • 清理 autoimport 编译器指令
    • 修复 typer 中 Dialyzer 的警告
    • 修复 Dialyzer 自身代码的警告
    • 修复 Dialyzer 行为分析中的错误
    • 修复 Dialyzer 中的崩溃
    • 变量替换没有泛化任何未知变量。

    内部 ID: OTP-9776

  • 修复使用无效日期调用 file:change_time/2,3 时发生的崩溃

    使用无效日期元组调用 file:change_time/2,3(例如 file:change_time("file.txt", {undefined, undefined})) 将导致 file_server_2 崩溃。error_logger 将关闭,并且整个虚拟机将停止。更改行为以验证系统边界上给定的日期。(即在发出服务器调用之前)。(感谢 Ahmed Omar)

    内部 ID: OTP-9785

改进和新特性

  • 现在可以向 file:read_file_info/2, file:read_link_info/2file:write_file_info/3 传递一个选项列表参数,并在调用中设置时间类型信息。有效的选项是 {time, local}, {time, universal}{time, posix}。在使用 posix 时间的情况下,不会进行转换,这使得操作速度更快一些。

    内部ID:OTP-7687

  • file:list_dir/1,2 现在会先用 efile 驱动程序中的文件名填充整个缓冲区,然后再将其发送到 Erlang 进程。这将会在大多数情况下加速此文件操作。

    内部ID:OTP-9023

  • 如果不支持 SCTP,gen_sctp:open/0-2 现在可能会返回 {error,eprotonosupport}

    gen_sctp:peeloff/1 已经实现,并创建了一个一对一的套接字,现在也支持这种套接字。

    *潜在的不兼容性*

    内部ID:OTP-9239

  • Sendfile 已添加到文件模块的 API 中。 sendfile/2 用于从文件中读取数据,并使用零拷贝机制将其发送到 TCP 套接字(如果操作系统支持)。

    感谢 Tuncer Ayaz 和 Steve Vinovski 的原始实现

    内部ID:OTP-9240

  • 元组函数(包含模块名和函数的双元素元组)现在已被正式弃用,并将在 R16 中删除。请改用 'fun M:F/A'。为了让您了解您的系统正在使用元组函数,第一次应用元组函数时,将会向错误日志发送警告。

    内部ID:OTP-9649

Kernel 2.14.5

修复的 Bug 和故障

  • 修复 gen_tcp:send/2 和 gen_udp:send/4 的 Packet 参数类型

    该类型被标记为 binary() 或 string(),但实际上它可以是 iodata()。测试套件已更新,以确认 gen_tcp/2 和 gen_udp:send/4 函数接受 iodata() (iolist) 数据包。(感谢 Filipe David Manana)

    内部ID:OTP-9514

  • XML 文件已更正。

    内部ID:OTP-9550 辅助ID:OTP-9541

改进和新特性

  • inet 模块的类型和规范已得到改进。

    内部ID:OTP-9260

  • 已添加类型和规范。

    内部ID:OTP-9356

  • STDLIB 和 Kernel 中的合约已得到改进,并且类型错误已得到纠正。

    内部ID:OTP-9485

  • 更新了一些 zlib 函数的文档和规范。

    内部ID:OTP-9506

Kernel 2.14.4

修复的 Bug 和故障

  • gen_tcp 中的 send_timeout 选项在主动模式或使用 {active,once} 选项时无法正常工作。现在已更正。

    内部ID:OTP-9145

  • 修复了文档中的各种拼写错误(感谢 Tuncer Ayaz)

    内部ID:OTP-9154

  • 修复了 rpc:pmap/3 的文档中的拼写错误(感谢 Ricardo Catalinas Jiménez)

    内部ID:OTP-9168

  • 更正了专用 DNS 解析器 inet_res 中的一个 bug。具有不幸时机的延迟答案可能导致运行时异常。还进行了一些代码清理和改进。感谢 Evegeniy Khramtsov 提供精确的错误报告和错误修复测试。

    内部ID:OTP-9221 辅助ID:OTP-8712

改进和新特性

  • 已添加类型和规范。

    内部ID:OTP-9268

  • Erlang 类型和规范用于文档。

    内部ID:OTP-9272

  • 修改了两个在运行 Dialyzer 时可能导致警告的不透明类型。

    内部ID:OTP-9337

Kernel 2.14.3

修复的 Bug 和故障

  • os:find_executable/{1,2} 将不再返回恰好位于 PATH 中的目录的路径。

    内部ID:OTP-8983 辅助ID:seq11749

  • 修复 file:write_file/3 的 -spec

    将第二个参数的类型从 binary() 更改为 iodata(),因为该函数明确采取步骤来接受列表和二进制文件。(感谢 Magnus Henoch)。

    内部ID:OTP-9067

  • 清理代码模块的规范

    在将 unicode_binary() 添加到 file:filename() 类型后,dialyzer 开始抱怨“代码”模块中某些函数中存在错误或不完整的规范。罪魁祸首是 erl_bif_types 中此模块的函数的硬编码信息,这些信息没有更新。由于这些函数现在具有适当的规范,并且代码重复(双关语)绝不是一个好主意,因此它们类型信息已从 erl_bif_types 中删除。

    在执行此操作时,修复了代码模块中的一些错误注释,并确保代码现在即使使用 -Wunmatched_returns 选项也能在没有 dialyzer 警告的情况下运行。

    还对 erl_bif_types 应用了一些清理。

    内部ID:OTP-9100

  • - 为不返回的函数添加 spec - 加强 spec - 引入类型以避免 specs 中的重复 - 为不返回的函数添加 specs - 为行为回调添加 specs - 简化两个 specs

    内部ID:OTP-9127

Kernel 2.14.2

改进和新特性

  • Erlang VM 现在支持 Unicode 文件名。在强制使用 Unicode 文件名的系统(Windows 和 MacOSX)上,此功能默认启用,但可以使用 '+fnu' 模拟器选项在其他系统上启用。但是,在默认情况下不使用 Unicode 文件名的系统上启用此功能被认为是实验性的,不能用于生产。随着 Unicode 文件名支持的引入,引入了“原始文件名”的概念,这意味着提供的文件名没有隐式的 Unicode 编码转换。原始文件名以二进制形式提供,而不是列表形式。有关更多信息,请参阅 stdlib 用户指南和有关在 Erlang 中使用 Unicode 的章节。另请参阅文件模块手册页。

    *潜在的不兼容性*

    内部ID:OTP-8887

  • 现在有一个新的函数 inet:getifaddrs/0,它仿照 BSD 和 Linux 上的 C 库函数 getifaddrs(),报告主机上存在的接口及其地址。这将替换未记录且不受支持的 inet:getiflist/0inet:ifget/2

    内部ID:OTP-8926

Kernel 2.14.1.1

修复的 Bug 和故障

  • 在嵌入式模式下,调用 code:priv_dir/1code 中的其他函数的 on_load 处理程序会导致系统挂起。由于 crypto 应用程序现在包含一个调用 code:priv_dir/1 的 on_loader 处理程序,因此在启动文件中包含 crypto 应用程序将阻止系统启动。

    还扩展了 -init_debug 选项,以打印有关正在运行的 on_load 处理程序的信息,以便于调试。

    内部ID:OTP-8902 辅助ID:seq11703

Kernel 2.14.1

修复的 Bug 和故障

  • 修复:inet:setopts(S, [{linger,{true,2}}]) 对于 SCTP 套接字返回 {error,einval}。inet_drv 在检查选项大小时存在一个 bug。

    内部ID:OTP-8726 辅助ID:seq11617

  • 对于启用 SCTP 的构建,gen_udp:connect/3 已损坏。它没有按预期检测到远程端错误。

    内部ID:OTP-8729

  • 在文档中,reference() 已替换为 ref()。

    内部ID:OTP-8733

  • 修复了 kernel-2.13.5.3 中引入的 bug。如果在 TransitionPerod 内两次运行 net_kernel:set_net_ticktime/1,则第二次调用将导致 net_kernel 进程崩溃,并出现 badmatch

    内部ID:OTP-8787 辅助ID:seq11657, OTP-8643

  • inet:getsockopt for SCTP sctp_default_send_param 存在未初始化所需字段的 bug,导致随机答案。现在已更正。

    内部ID:OTP-8795 辅助ID:seq11655

  • 对于 HTTP 数据包模式下的套接字,如果标头中存在错误,则 gen_tcp:recv/2,3 的返回值将是 {ok,{http_error,String}},而不是 {error,{http_error,String}},以便与 ssl:recv/2,3 一致。

    *潜在的不兼容性*

    内部ID:OTP-8831

改进和新特性

  • 即使使用 --enable-native-libs 配置 Erlang,非常早加载的模块(例如列表)的本机代码也不会被加载。这已得到更正。(感谢 Paul Guyot。)

    内部ID:OTP-8750

  • 未记录的函数 inet:ifget/2 已得到改进,可以在支持 getaddrinfo() 的平台(例如 BSD Unix)上返回接口硬件地址 (MAC)。请注意,它仍然不适用于所有平台,例如 Windows 或 Solaris,因此该函数仍然未记录。

    还修复了 inet:ifget/2 和 inet:getservbyname/2 的缓冲区溢出和字段初始化 bug。

    感谢 Michael Santos。

    内部ID:OTP-8816

  • 为了提高可用性,如果地址参数或“ip”选项包含 IPv6 地址(8 元组),则函数 gen_tcp:listen/2, gen_tcp:connect/3-4, gen_udp:open/2gen_sctp:open/1-2 的“inet6”选项现在是隐式的。

    内部ID:OTP-8822

Kernel 2.14

已修复的 Bug 和故障

  • os:find_executable 现在可以在 Windows 上使用可执行文件的完整名称作为输入,并且仍然可以找到它。例如,os:find_executable("werl.exe") 将像 os:find_executable("werl") 一样工作。

    内部 ID:OTP-3626

  • Shell 的行编辑已得到改进,更类似于 readline 和其他 shell 的行为。(感谢 Dave Peticolas)

    内部 ID:OTP-8635

  • 在某些情况下,网络内核可能会挂起。(感谢 Scott Lystig Fritchie。)

    内部 ID:OTP-8643 辅助 ID:seq11584

  • 如果无法解析 DNS 回复,或者解析器导致 noconnection 类型错误,则内核 DNS 解析器会泄漏一个或两个端口。该 Bug 现已修复。还修复了一个触发端口泄漏 Bug 的 DNS 规范边界截断回复。

    内部 ID:OTP-8652

改进和新功能

  • 从这个版本开始,全局名称服务器不再支持运行 Erlang/OTP R11B 的节点。

    内部 ID:OTP-8527

  • file 模块的函数 write、read 和 read_line 现在可以正确处理像 'standard_io' 和 'standard_error' 这样的命名 io_servers。

    内部 ID:OTP-8611

  • 已添加函数 file:advise/4 和 file:datasync/1。(感谢 Filipe David Manana。)

    内部 ID:OTP-8637

  • 在节点之间交换组时,pg2 没有删除重复的成员。此 Bug 是在 R13B03 (kernel-2.13.4) 中引入的。

    内部 ID:OTP-8653

  • file:open/2 有一个新的选项 'exclusive',它在支持的地方使用操作系统 O_EXCL 标志以独占模式打开文件。

    内部 ID:OTP-8670

内核 2.13.5.3

已修复的 Bug 和故障

  • 修复了在内核 2.13.5.2 中引入的 Bug。

    内部 ID:OTP-8686 辅助 ID:OTP-8643

内核 2.13.5.2

已修复的 Bug 和故障

  • 在某些情况下,网络内核可能会挂起。(感谢 Scott Lystig Fritchie。)

    内部 ID:OTP-8643 辅助 ID:seq11584

内核 2.13.5.1

已修复的 Bug 和故障

  • os:cmd/1 中的竞争条件可能导致调用者永远卡在 os:cmd/1 中。

    内部 ID:OTP-8502

内核 2.13.5

已修复的 Bug 和故障

  • 修复了影响 pg2:get_local_members/1 的竞争 Bug。该 Bug 是在 R13B03 中引入的。

    内部 ID:OTP-8358

  • 在 SMP 模拟器中,本地代码的加载没有正确地原子化,这可能会导致崩溃。此外,本地代码的每个 MFA 信息表现在都用锁保护,因为它可以在 SMP 模拟器中并发访问。(感谢 Mikael Pettersson。)

    内部 ID:OTP-8397

  • user.erl(在 oldshell 中使用)已更新以处理提示字符串中的 Unicode (io:get_line/{1,2})。io_lib 也已更新,以使用 't' 修饰符格式化提示符(即,~ts 而不是 ~s)。

    内部 ID:OTP-8418 辅助 ID:OTP-8393

  • 如果操作系统原生解析器配置错误,则解析器例程无法将自身节点名称查找为主机名,此 Bug 由 Yogish Baliga 报告,现已修复。

    解析器例程现在会尝试将主机名解析为 IP 字符串,就像大多数操作系统解析器一样,除非使用原生解析器。

    DNS 解析器 inet_res 和文件解析器 inet_hosts 现在只有在需要时才会读取操作系统配置文件。由于原生解析器是默认设置,因此在大多数情况下永远不需要它们。

    如果不存在 'search' 关键字,DNS 解析器的操作系统配置文件数据自动更新 (/etc/resolv.conf) 现在使用 'domain' 关键字作为默认搜索域。

    内部 ID:OTP-8426 辅助 ID:OTP-8381

改进和新功能

  • 已更改 on_load 函数的预期返回值。(请参阅参考手册中有关代码加载的部分。)

    *潜在的不兼容性*

    内部 ID:OTP-8339

  • 现在,存档文件中的显式顶层目录是可选的。

    例如,如果存档 (app-vsn.ez) 仅包含 app-vsn/ebin/mod.beam 文件,则使用存档文件的文件信息作为来源,伪造 app-vsn 和 app-vsn/ebin 目录的文件信息。还可以列出虚拟目录。简而言之,如果顶层目录不存在,则它们是虚拟的。

    内部 ID:OTP-8387

  • code:clash/0 现在会查找存档(.ez 文件)内部。(感谢 Tuncer Ayaz。)

    内部 ID:OTP-8413

  • 现在有新的 gen_sctp:connect_init/* 函数,用于启动 SCTP 连接而不会阻塞结果。结果将异步地作为 sctp_assoc_change 事件传递。(感谢 Simon Cornish。)

    内部 ID:OTP-8414

内核 2.13.4

已修复的 Bug 和故障

  • 修复了 m:pg2 中的链接。(感谢 Christophe Romain。)

    内部 ID:OTP-8198

  • 一个定时器进程可能会因尝试向未响应的节点发送滴答声而被无限期地阻止。如果发生这种情况,则连接将不会像预期那样被关闭。

    内部 ID:OTP-8218

  • 修复了 pg2 中当死亡的成员未离开进程组时的 Bug。(感谢 Matthew Dempsky。)

    内部 ID:OTP-8259

改进和新功能

  • 现在使用大多数平台上存在的开源工具(xsltproc 和 fop)构建文档。一个明显的变化是删除了框架。

    内部 ID:OTP-8201

  • 存档文件中的顶层目录不再需要具有 -vsn 后缀。例如,如果存档文件的名称像 mnesia-4.4.7.ez,则存档中的顶层目录可以命名为 mnesiamnesia-4.4.7。如果存档文件的名称像 mnesia.ez,则存档中的顶层目录必须像之前一样命名为 mnesia

    内部 ID:OTP-8266

  • -on_load() 指令可用于在加载模块时运行函数。它记录在参考手册中有关代码加载的部分中。

    内部 ID:OTP-8295

内核 2.13.3

改进和新功能

  • 已重写、记录和发布 DNS 解析器客户端 inet_res。请参阅 inet_res(3) 和 Erts 用户指南:Inet 配置。

    由于之前没有官方版本,因此它在形式上不会与早期版本不兼容。但是,它以前被使用过,并且一些细节已更改。

    现在,无论节点以哪种分发模式启动,配置都从所有 Unix 平台上的 /etc/resolv.conf 和 /etc/hosts 初始化。这些文件应该驻留的目录 (/etc) 可以通过环境变量更改。也可以在 inet 配置中更改这些配置文件的位置。监视文件是否更改并重新读取,这使一些解析器配置变量脱离了应用程序的控制。/etc/hosts 条目现在有自己的缓存表,该表被应用程序配置的主机条目所屏蔽(如果使用查找方法“file”)。Matthew O'Gorman 很久以前报告了这个问题(即 inet_res 配置仅适用于分发模式的长名称)。

    默认情况下,查找方法仍然仅为“native”。在所有 Unix 平台上都进行解析器配置,只是为了获得可用于直接调用 inet_res 的可用配置。

    不再建议使用函数 inet_res:nslookup/3..5inet_res:nnslookup/4..4,而是使用 inet_res:lookup/3..5inet_res:resolve/3..5,它们提供更清晰的参数类型以及在调用中覆盖选项的可能性。

    以前不受支持的 inet_res 版本的用户已包含内部头文件以访问内部记录定义,以便检查 DNS 回复。这仍然不受支持,并且 inet_dns 中有访问函数可供使用。这些在 inet_res(3) 中进行了说明。

    Bug 修复:压缩引用循环会导致 DNS 消息解码永远循环。该问题由 Florian Weimer 报告。

    Bug 修复和 Sergei Golovan 的修补建议:配置 IPv6 名称服务器不起作用。他的补丁(正如他警告的那样)创建了许多 UDP 套接字;每个名称服务器一个。这已在发布的版本中修复。

    改进:inet_res 现在具有 EDNS0 功能。当前实现很简单,不会探测和缓存名称服务器的 EDNS 信息,而一个功能完善的实现应该这样做。EDNS 必须通过解析器配置启用,如果名称服务器回复它不支持 EDNS,则 inet_res 会回退到常规 DNS 查询。

    改进:现在,如果 inet_res 从名称服务器收到截断的答案,则会自动回退到 TCP。

    警告:inet_resinet_dns 处理的一些古老且特殊的记录类型,当前版本的 BIND 并不支持,因此在重写后无法进行合理的测试,例如 MD、MF、NULL 和 SPF。这些特定记录中出现错误的风险仍然很低,因为它们的代码大部分与其他经过测试的记录类型共享。

    *潜在的不兼容性*

    自有 ID:OTP-7955 辅助 ID:OTP-7107 OTP-6852

  • 如果一个带有选项 {packet,4} 的 TCP 套接字接收到一个大小值非常大(>2Gb)的数据包头,则可能会导致模拟器崩溃。同样的错误导致 erlang:decode_packet/3 返回错误的值。(感谢 Georgos Seganos。)

    自有 ID:OTP-8102

  • 文件模块现在有一个类似于 io:get_line/2 的 read_line/1 函数,但具有面向字节的语义。函数 file:read_line/1 也适用于原始文件,但为了获得良好的性能,建议将其与原始文件访问的 'read_ahead' 选项一起使用。

    自有 ID:OTP-8108

Kernel 2.13.2

已修复的错误和故障

  • 修复了从以 latin1 以外的编码打开的文件执行 io:get_line(以及其他调用)时,导致出现错误的 Unicode 错误的问题。

    自有 ID:OTP-7974

改进和新功能

  • 添加了从系统获取更高分辨率时间戳的功能。erlang:now 函数返回的时间戳并不总是与实际操作系统时间一致(因为它可以抵御操作系统中较大的时间变化)。添加了 os:timestamp/0 函数,以获取与 erlang:now 返回的时间戳相似的时间戳,但不受 Erlang 时间校正和平滑算法的影响。os:timestamp 返回的时间戳始终与操作系统的时间视图一致,类似于用于获取挂钟时间的日历函数,但具有更高的分辨率。有关用法的示例可以在 os 手册页中找到。

    自有 ID:OTP-7971

Kernel 2.13.1

已修复的错误和故障

  • os:cmd/1 的多个并发调用一次只会阻塞一个调度程序线程,如果操作系统分叉进程速度较慢,则可以使 smp 模拟器更具响应性。

    自有 ID:OTP-7890 辅助 ID:seq11219

  • 修复了在节点启动期间执行 IO 操作的早期 RPC 挂起的问题。

    自有 ID:OTP-7903 辅助 ID:seq11224

  • 纠正了 gen_tcp 和 gen_udp 的错误行为。gen_tcp:connect/3,4 和 gen_udp:send/4 现在会为冲突的目标地址与套接字地址族返回 {error,eafnosupport}。结合不使用原生(OS)解析器(不是默认)的 IP 地址字符串主机名的其他极端情况也已更改为返回 {error,nxdomain} 而不是 {error,einval}。这些更改可能会让旧的现有代码感到惊讶。gen_tcp:listen/2 和 gen_udp:open/2 现在会因冲突的本地地址与套接字地址族而失败,而不是尝试使用错误的地址。该问题由 Per Hedeland 报告。

    *潜在的不兼容性*

    自有 ID:OTP-7929

改进和新功能

  • 修复了 R13A 的 Unicode 和 I/O 系统实现中的几个故障和性能问题。

    自有 ID:OTP-7896 辅助 ID:OTP-7648 OTP-7887

  • 现在已改进了不受支持的 DNS 解析器客户端 inet_res,以处理 NAPTR 查询。

    自有 ID:OTP-7925 辅助 ID:seq11231

Kernel 2.13

已修复的错误和故障

  • 已更正旧的 Erlang DNS 解析器 inet_res,以处理包含多个字符串的 TXT 记录。补丁由 Geoff Cant 提供。

    自有 ID:OTP-7588

  • 当以只读模式块读取磁盘日志时,错误的术语可能会导致磁盘日志进程崩溃。

    自有 ID:OTP-7641 辅助 ID:seq11090

  • gen_tcp:send() 有时(仅在 Solaris 上观察到)返回 {error,enotconn},而不是预期的 {error,closed},因为对等套接字已显式关闭。

    自有 ID:OTP-7647

  • inet 驱动程序中错误地解码了 gen_sctp 选项 sctp_peer_addr_params,#sctp_paddrparams{address={IP,Port}}。现在已纠正此错误。

    自有 ID:OTP-7755

改进和新功能

  • Erlang 程序现在可以使用 io_server 'standard_error' 访问此类文件描述符可用的平台上的 STDERR,例如 io:format(standard_error,"~s~n",[ErrorMessage])。

    自有 ID:OTP-6688

  • erlang:system_info(system_version) 返回的字符串格式(以及 Erlang 启动时的第一个消息)已更改。该字符串现在包含 OTP 版本号以及 erts 版本号。

    自有 ID:OTP-7649

  • 从该版本开始,全局名称服务器不再支持运行 Erlang/OTP R10B 的节点。

    自有 ID:OTP-7661

  • net_kernel:monitor_nodes/X 功能传递的 {nodedown, Node} 消息现在保证在 Nodeerlang:nodes/Y 返回的结果中删除后发送。

    自有 ID:OTP-7725

  • 已删除已弃用的函数 erlang:fault/1erlang:fault/2file:rawopen/2

    *潜在的不兼容性*

    自有 ID:OTP-7812

  • 借助新的环境变量设置 ERL_EPMD_PORT,属于不同独立集群的节点现在可以在同一主机上共存。

    自有 ID:OTP-7826

  • 版权声明已更新。

    自有 ID:OTP-7851

Kernel 2.12.5.1

已修复的错误和故障

  • 当以只读模式块读取磁盘日志时,错误的术语可能会导致磁盘日志进程崩溃。

    自有 ID:OTP-7641 辅助 ID:seq11090

  • 从多个进程在带有选项 send_timeout 的套接字上调用 gen_tcp:send() 可能会导致超时时间比指定的时间长得多。解决方案是一个新的套接字选项 {send_timeout_close,true},它将在超时时自动关闭。随后对 send 的调用将立即失败,因为连接已关闭。

    自有 ID:OTP-7731 辅助 ID:seq11161

Kernel 2.12.5

已修复的错误和故障

  • 更正了 rpc:pmap/3 的文档。(感谢 Kirill Zaborski。)

    自有 ID:OTP-7537

  • 用于分布式 Erlang 协议的侦听套接字现在使用套接字选项 'reuseaddr',当您使用内核选项 'inet_dist_listen_min' 和 'inet_dist_listen_max' 强制侦听端口号并使用打开的连接重新启动节点时,此选项非常有用。

    自有 ID:OTP-7563

  • 修复了未关闭的 TCP 端口的内存泄漏。gen_tcp:send() 之后是失败的 gen_tcp:recv(),在某些情况下可能会导致端口在关闭后仍然存在。

    自有 ID:OTP-7615

改进和新功能

  • 使用 proc_lib(包括 gen_server 和其他使用 proc_lib 的库模块)生成的进程不再保留初始调用的整个参数列表,而只保留元数。

    此外,如果使用 proc_lib:spawn/1 来生成一个 fun,则不会保留实际的 fun,而只保留实现该 fun 的模块、函数名和元数。

    更改的原因是,保留初始 fun(或参数列表中的 fun)会阻止升级该模块的代码。第二个原因是,保留 fun 和函数参数可能会浪费大量内存。

    此更改的缺点是,崩溃报告将提供关于初始调用的不太精确的信息(只有 Module:Function/Arity 而不是 Module:Function(Arguments))。函数 proc_lib:initial_call/1 仍然返回一个列表,但每个参数都已替换为一个虚拟原子。

    自有 ID:OTP-7531 辅助 ID:seq11036

  • 从标准输入读取时,io:get_line/1 现在速度明显更快。当从以二进制模式打开的任何文件读取时,io:get_line/1 也有一些小的性能改进。(感谢 Fredrik Svahn。)

    自有 ID:OTP-7542

  • 现在对从存档文件加载代码提供了实验性支持。有关更多信息,请参阅 codeiniterl_prim_loaderescript 的文档。

    改进了 escripts 的错误处理。

    escript 现在可以为模拟器设置显式参数,例如 -smp enabled

    escript 现在可以包含预编译的 beam 文件。

    escript 现在可以包含一个包含一个或多个应用程序的存档文件(实验性)。

    已删除内部模块 code_aux

    自有 ID:OTP-7548 辅助 ID:otp-6622

  • 现在记录了 code:is_sticky/1。(感谢 Vlad Dumitrescu。)

    自有 ID:OTP-7561

  • 在作业控制模式下,“s”和“r”命令现在接受一个可选参数来指定启动哪个 shell。(感谢 Robert Virding。)

    自有 ID:OTP-7617

  • 如果在未使用 -sname-name 选项启动的模拟器中调用 net_adm:world/0,1,则可能会崩溃;现在它将返回一个空列表。(感谢 Edwin Fine。)

    内部 ID:OTP-7618

Kernel 2.12.4

已修复的 Bug 和故障

  • 现在在 Windows 上可以处理大文件,前提是文件系统支持。

    内部 ID:OTP-7410

改进和新特性

  • 新的 BIF erlang:decode_packet/3,用于从二进制数据中提取协议数据包。类似于套接字选项 {packet, Type}。此外,还记录了套接字数据包类型 http 并使其正式化。注意:从活动套接字发送的 http 数据包的元组格式已进行了不兼容的更改。

    *潜在的不兼容性*

    内部 ID:OTP-7404

  • 现在对套接字设置 {active,once}(使用 inets:setopts/2)进行了特殊优化(因为 {active,once} 选项通常比其他选项更频繁地使用)。

    内部 ID:OTP-7520

Kernel 2.12.3

已修复的 Bug 和故障

  • 现在 gen_sctp 可以处理 SCTP_ADDR_CONFIRMED 事件。

    内部 ID:OTP-7276

  • 当使用 pg2:leave/2 离开进程组时,该进程被错误地假定为该组的成员。此错误已修复。

    内部 ID:OTP-7277

  • 在 Erlang shell 中,使用上下箭头键时,有时会检索到错误的上一条命令。

    内部 ID:OTP-7278

  • erlang:trace/3 的文档已得到更正。

    内部 ID:OTP-7279 辅助 ID:seq10927

  • 在 SMP 模拟器中,存在一个小风险,即 code:purge(Mod) 会杀死一个在 Mod 中运行代码的进程,并在该进程终止之前卸载模块 Modcode:purge(Mod) 现在会等待确认(使用 erlang:monitor/2)进程已被杀死,然后再继续。

    内部 ID:OTP-7282

  • 当膨胀数据的大小正好是内部缓冲区大小(默认为 4000 字节)的倍数时,zlib:inflate 会失败。

    内部 ID:OTP-7359

改进和新特性

  • 现在可以在环境变量 ERL_LIBS 中指定其他库目录。请参阅 code 模块的手册页。(感谢 Serge Aleynikov。)

    内部 ID:OTP-6940

  • 改进了 crypto 和 zlib 驱动程序,以允许并发的 SMP 访问。

    内部 ID:OTP-7262

  • 有一个新的函数 init:stop/1,可用于干净地关闭系统并生成非零退出状态或崩溃转储。(感谢 Magnus Froberg。)

    内部 ID:OTP-7308

  • 现在记录了 open_port/2hide 选项。(感谢 Richard Carlsson。)

    内部 ID:OTP-7358

Kernel 2.12.2.1

改进和新特性

  • 现在,Unix 平台上的 os:cmd/1 使用 /bin/sh 作为 shell,而不是在 PATH 环境中查找 sh

    内部 ID:OTP-7283

Kernel 2.12.2

已修复的 Bug 和故障

  • 修复了由 disk_logpg2 之间的竞争条件引起的 Bug。

    内部 ID:OTP-7209 辅助 ID:seq10890

  • beta 测试模块 gen_sctp 现在按照文档所述支持活动模式。活动模式仍然未经充分测试,并且关于 gen_sctp:connect/5 的正确语义存在一些问题。特别是:它应该是阻塞的还是非阻塞的,还是可选择的。它很可能会在(不久的)将来的补丁中改变语义。

    试试看,提出意见并发送 Bug 报告!

    内部 ID:OTP-7225

改进和新特性

  • erlang:system_info/1 现在接受 logical_processorsdebug_compiled 参数。有关更多信息,请参阅 erlang 文档。

    如果模拟器使用的调度器线程数大于系统上的逻辑处理器数量,则 test_server:timetrap_scale_factor/0 返回的缩放因子现在也会受到影响。

    内部 ID:OTP-7175

  • 更新了 erlang:function_exported/3io:format/2 函数的文档,不再声明这些函数主要为了向后兼容而保留。

    内部 ID:OTP-7186

  • 现在,执行 processes/0 BIF 的进程可以在执行期间被其他进程抢占。这是为了尽可能少地干扰系统的其余部分。当然,返回的结果仍然是在调用 processes/0 期间现有进程的一致快照。

    更新了 processes/0 BIF 和 is_process_alive/1 BIF 的文档,以阐明现有进程和处于活动状态的进程之间的区别。

    内部 ID:OTP-7213

  • 在文档中,tuple_size/1byte_size/1 已替换为 size/1

    内部 ID:OTP-7244

Kernel 2.12.1.2

改进和新特性

  • 现在,erlang:system_info/1 接受 {allocator_sizes, Alloc}alloc_util_allocators 参数。有关更多信息,请参阅 erlang 文档。

    内部 ID:OTP-7167

Kernel 2.12.1.1

已修复的 Bug 和故障

  • 修复了组中可能导致 ssh 服务器丢失答案或挂起的问题。

    内部 ID:OTP-7185 辅助 ID:seq10871

Kernel 2.12.1

已修复的 Bug 和故障

  • file:read/2 和 file:consult_stream/1,3 未在 I/O 设备上使用空提示符。此错误现已更正。

    内部 ID:OTP-7013

  • 已更新 sctp 驱动程序以与较新的 lksctp 包(例如,使用 API 拼写更改 adaption -> adaptation 的 1.0.7)一起使用。较旧的 lksctp (1.0.6) 仍然有效。gen_sctp.erl 和 inet_sctp.hrl 中的 Erlang API 现在拼写为“adaptation”,而不管底层的 C API 如何。

    *潜在的不兼容性*

    内部 ID:OTP-7120

改进和新特性

  • 已更新文档,以反映 Erlang shell 的最新更新以及 io_lib 模块的控制序列 p 的微小修改。

    已从代码示例和 Erlang shell 示例中删除多余的空行。

    内部 ID:OTP-6944 辅助 ID:OTP-6554, OTP-6911

  • tuple_size/1byte_size/1 已替换为 size/1

    内部 ID:OTP-7009

Kernel 2.12

已修复的 Bug 和故障

  • 修复了读取 0 字节的原始文件返回“eof”而不是空数据的 Bug。

    内部 ID:OTP-6291 辅助 ID:OTP-6967

  • 修复了 David Baird 报告并由 Dialyzer 发现的 gen_udp:fdopen 中的 Bug。

    内部 ID:OTP-6836 辅助 ID:OTP-6594

  • 多次调用 error_logger:tty(true) 不会给出多个错误日志输出。

    内部 ID:OTP-6884 辅助 ID:seq10767

  • 当使用命令行标志 -connect_all false 时,全局名称服务器现在会忽略 nodeup 消息。(感谢 Trevor Woollacott。)

    内部 ID:OTP-6931

  • 对于足够奇怪的文件系统问题(例如写入已满的文件系统),file:write_file/3、file:write/2 和 file:read/2 可能会崩溃(与文档相反)。此 Bug 现已更正。

    在此过程中,文件模块已重写以产生更好的错误代码。Posix 错误代码现在源于操作系统文件系统调用,或者仅针对非常相似的原因生成(例如,如果内存分配失败,则生成“enomem”,如果 Erlang 中的文件句柄是文件句柄但当前无效,则生成“einval”)。

    现在生成了更多 Erlang 式的错误代码。例如,如果参数不是文件句柄类型,则现在从 file:close/1 返回 {error,badarg}。请参阅 file(3)。

    已删除使用 file:write/2 写入单个字节而不是一个字节的列表或二进制文件的可能性,这与文档相矛盾。

    *潜在的不兼容性*

    内部 ID:OTP-6967 辅助 ID:OTP-6597 OTP-6291

  • 当实际堆和/或堆栈很大时,系统监视功能产生的监视器消息和垃圾回收跟踪消息可能包含错误的堆和/或堆栈大小。

    从 erts 版本 5.6 开始,erlang:system_monitor/[1,2]large_heap 选项已被修改。如果为所有堆世代分配的所有内存块的大小总和等于或大于指定大小,则会发送监控消息。之前,如果为最年轻世代分配的内存块等于或大于指定大小,则会发送监控消息。

    *潜在的不兼容性*

    自属 ID: OTP-6974 辅助 ID: seq10796

  • inet:getopts/2 在 Windows Vista 上返回随机值。

    自属 ID: OTP-7003

改进和新功能

  • 对 file:pread/2 和 file:pread/3 进行了细微的文档更正。

    自属 ID: OTP-6853

  • 已删除已弃用的函数 file:file_info/1init:get_flag/1init:get_flags/0init:get_args/0

    *潜在的不兼容性*

    自属 ID: OTP-6886

  • 内核和 STDLIB 中模块的契约指令。

    自属 ID: OTP-6895

  • 添加了函数 io:columns/0、io:columns/1、io:rows/0 和 io:rows/1,允许用户获取有关终端几何的信息。 shell 在格式化输出时会利用这一点。对于高度和宽度不适用的常规文件和其他 io 设备,这些函数返回 {error,enotsup}。

    潜在的不兼容性:如果有人编写了自定义 io-handler,则该 handler 必须返回错误或处理有关终端高度和宽度的 io 请求。通常这不是问题,因为 io-handlers 按经验法则,在收到未知 io 请求时应给出错误回复,而不是崩溃。

    *潜在的不兼容性*

    自属 ID: OTP-6933

  • 已删除未记录且不受支持的函数 inet:ip_to_bytes/1inet:ip4_to_bytes/1inet:ip6_to_bytes/1inet:bytes_to_ip6/16

    自属 ID: OTP-6938

  • zlib 添加了新的校验和组合函数。并修复了 zlib:deflate 中的一个错误。感谢 Matthew Dempsky。

    自属 ID: OTP-6970

  • spawn_monitor/1spawn_monitor/3 BIF 现在是自动导入的(即,它们不再需要 erlang: 前缀)。

    自属 ID: OTP-6975

  • 如果使用明显错误的参数(例如,当期望原子时使用元组)调用 code 模块中的所有函数,则现在会失败并抛出异常。某些函数现在也会因未记录的参数类型而失败(例如,ensure_loaded/1 现在仅接受文档中记录的原子;它过去也接受字符串)。

    Dialyzer 通常会为任何使用未记录参数类型的调用发出警告。即使调用在 R12B 中仍然有效,你也应该更正你的代码。未来的版本将遵守文档。

    *潜在的不兼容性*

    自属 ID: OTP-6983

内核 2.11.5.2

修复的错误和故障

  • 如果网络通信发生瞬时故障期间发出大量并行发送,则内核参数 dist_auto_connect 可能会阻止节点。

    自属 ID: OTP-6893 辅助 ID: seq10753

内核 2.11.5.1

修复的错误和故障

  • 内部(很少使用)DNS 解析器已被修改为在被要求解析绝对名称(带有终止点的名称)时,不使用域搜索列表。还有一个错误导致它为绝对名称创建格式错误的 DNS 查询,该错误已得到纠正,该纠正由 Scott Lystig Fritchie 建议。代码也已更正为以与未缓存相同的搜索顺序查找缓存的 RR,现在允许在搜索域中包含根域,并且现在实际上可以执行区域传输请求。

    *潜在的不兼容性*

    自属 ID: OTP-6806 辅助 ID: seq10714 EABln35459

  • 如果调用进程启用了 trap_exit 标志,则 zlib:close/1 会在消息队列中留下一个 EXIT 消息。

    自属 ID: OTP-6811

改进和新功能

内核 2.11.5

修复的错误和故障

  • 已更新 shell 以修复以下缺陷:如果不使用 oldshell,shell 进程退出会导致初始 shell 无响应。使用不存在的回调模块启动受限 shell 会导致 shell 中无法使用任何命令,甚至 init:stop/0 也无法使用。当 restricted_shell 处于活动状态时,Fun 不能用作本地 shell 函数(在 shell_default 或 user_default 中)的参数。

    自属 ID: OTP-6537

  • 未记录的功能 gen_tcp:fdopen/2 在 R11B-4 中被破坏。现在它又被修复了。

    自属 ID: OTP-6615

  • 纠正了 inet_res 模块中三个位置的计时器取消。(Dialyzer 发现的问题。)

    自属 ID: OTP-6676

改进和新功能

  • 更正了 SCTP 的套接字选项 SO_LINGER、SO_SNDBUF 和 SO_RCVBUF 的协议层流程。

    自属 ID: OTP-6625 辅助 ID: OTP-6336

  • 改进并记录了对等关闭时 inet 选项 {active,once} 的行为。

    自属 ID: OTP-6681

  • 为面向连接的套接字添加了 inet 选项 send_timeout,以便在向底层 TCP 堆栈发送发送请求时允许超时。

    自属 ID: OTP-6684 辅助 ID: seq10637 OTP-6681

  • 细微的 Makefile 更改。

    自属 ID: OTP-6689 辅助 ID: OTP-6742

  • 已更新 process_flag(priority, Level) 的文档,请参阅 erlang 文档。

    自属 ID: OTP-6715

内核 2.11.4.2

改进和新功能

  • process_flag/2 接受新标志 sensitive

    自属 ID: OTP-6592 辅助 ID: seq10555

内核 2.11.4.1

修复的错误和故障

  • 已修复 gen_udp:open 中破坏 'fd' 选项的错误。

    自属 ID: OTP-6594 辅助 ID: seq10619

内核 2.11.4

修复的错误和故障

  • error_logger 函数 error_msg/1,2warning_msg/1,2info_msg/1,2 的文档添加了警告,警告使用错误参数调用这些函数可能会使标准事件处理程序崩溃。

    自属 ID: OTP-4575 辅助 ID: seq7693

  • 纠正了 inet_db 中有关获取解析器选项 retry 的错误。

    自属 ID: OTP-6380 辅助 ID: seq10534

  • 通过调用 global:register_name()global:re_register_name() 注册的名称在注册或已注册的进程死亡时并不总是取消注册。此错误已修复。

    自属 ID: OTP-6428

  • 当将内核配置参数 error_logger 设置为 false 时,文档说明“未安装错误记录器处理程序”。这是正确的,但错误日志记录并未关闭,因为保留了初始的原始错误记录器事件处理程序,将原始事件消息打印到 tty。

    更改此行为可以视为向后不兼容的更改。相反,为配置参数添加了一个新值 silent,以确保完全关闭错误日志记录。

    自属 ID: OTP-6445

  • 澄清了 code:lib_dir/1code:priv_dir/1 的文档。这些函数遍历代码路径的名称,它们不搜索实际的目录。

    自属 ID: OTP-6466

  • 当仅使用 expand_fun 参数调用时,io:setopts 返回 {error,badarg}。(感谢 igwan。)

    自属 ID: OTP-6508

改进和新功能

  • 已实现面向 SCTP 套接字 API 扩展的接口。这是 Serge Aleynikov 和 Leonid Timochouk 提供的开源补丁。Erlang 代码部分已由 OTP 团队改编,稍微更改了 Erlang API。

    Erlang 接口由模块 gen_sctp 和包含选项记录定义的 include 文件 -include_lib("kernel/include/inet_sctp.hrl"). 组成。gen_sctp 模块已记录。

    在 OTP 团队重写之前,交付的开源补丁是根据 http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13 编写的,并且声称工作正常,在 Linux Fedora Core 5.0(内核 2.6.15-2054 或更高版本)以及 Solaris 10 和 11 上进行了测试。OTP 团队的重写使用了相同的标准文档,但可能意外地破坏了一些功能。如果是这样,它将很快被修补到工作状态。C 中的棘手部分和总体设计基本没有改变。在重写期间,代码在 SuSE Linux Enterprise Server 10 上进行了手动测试,并在 Solaris 10 上进行了简短的测试。非常感谢对代码和文档的反馈。

    SCTP 接口处于 beta 状态。它仅经过了手动测试,并且在 OTP 中没有自动测试套件,这意味着一切肯定都没有经过测试。套接字活动模式已损坏。未测试 IPv6。由于 API 更改,文档已重新编写,但在此之后尚未校对。

    OTP 团队感谢 Serge Aleynikov 和 Leonid Timochouk 的宝贵贡献。我们希望我们没有把它搞砸太多。

    自属 ID: OTP-6336

  • term_to_binary/2 现在可以识别 {minor_version,Version} 选项。与之前的编码相比,{minor_version,1} 将导致浮点数以精确且更节省空间的方式进行编码。

    自属 ID: OTP-6434

  • 节点的监控已得到改进。现在,以下属性适用于 net_kernel:monitor_nodes/[1,2]

    • nodeup 消息将在传递通过新建连接的远程节点的任何消息之前传递。
    • nodedown 消息在传递通过连接的远程节点的所有消息都已传递之前,将不会传递。
    • 订阅也可以在 net_kernel 服务器启动之前进行。

    自有 ID:OTP-6481

  • 现在允许以“原始”方式设置和获取套接字选项。使用此功能不可避免地会产生不可移植的代码,但允许在具有这些选项的 TCP 堆栈上设置和获取任意不常见的选项。

    自有 ID:OTP-6519

  • 已消除 Dialyzer 警告。

    自有 ID:OTP-6523

  • 已更新 file:delete/1file:set_cwd/1 的文档,以明确说明如果输入参数类型不正确会发生什么情况。

    自有 ID:OTP-6535

Kernel 2.11.3.1

已修复的错误和故障

  • 在两个 Erlang 节点之间新建立的连接中,第一个传递的消息可能会使用错误的包大小。这可能导致消息被丢弃或连接终止。

    自有 ID:OTP-6473

Kernel 2.11.3

已修复的错误和故障

  • 在 Unix 上,unix:cmd/1 函数可能会在调用进程的消息队列中留下一个“EXIT”消息。这个问题在 SMP 模拟器中更可能发生。

    自有 ID:OTP-6368

改进和新功能

  • 在 erl_ddll 中添加了更多接口,以支持不同的使用场景。

    自有 ID:OTP-6307 辅助 ID:OTP-6234

  • 调用 global:set_lock() 设置的锁在锁定进程终止时并不总是被删除。此错误已修复。

    自有 ID:OTP-6341 辅助 ID:seq10445

Kernel 2.11.2

已修复的错误和故障

  • 在 R11B-1 中,使用 dist_auto_connect 时,节点消失的情况下的行为发生了一次更改。关于正常分布式操作的超时现在恢复到旧的(R11B-1 之前)状态。

    自有 ID:OTP-6258 辅助 ID:OTP-6200,seq10449

  • 消除了 inet:gethostbyname() 函数使用的内部进程的启动问题。如果内部进程(inet_gethost_native)之前没有启动,并且如果多个进程同时调用 inet:gethostbyname() 函数之一,则调用可能会失败。

    自有 ID:OTP-6286

改进和新功能

  • 代码清理:已删除旧的内部过时的 file_server。它仅在与 R7 及更旧版本的节点通信时使用。

    自有 ID:OTP-6245

  • 尝试打开不存在或格式错误的磁盘日志不再会导致崩溃报告。特别是,当参数不是格式正确的磁盘日志文件时,ets:file2tab/1 不会报告错误。(返回值没有改变,仍然是一个错误元组。)

    自有 ID:OTP-6278 辅助 ID:seq10421

  • 有新的 BIF erlang:spawn_monitor/1,3,以及用于 spawn_opt/2,3,4,5 的新选项 monitor

    已更新 observer_backend 模块以处理新的 BIF。

    自有 ID:OTP-6281

  • 为了帮助 Dialyzer 发现更多错误,Kernel 和 STDLIB 应用程序中的许多函数现在只接受文档中指定的类型的参数。

    例如,文档中说明函数 lists:prefix/2lists:suffix/2 只接受列表作为参数,但实际上它们接受任何内容并返回 false。现在已更改为如果一个或两个参数不是列表,则函数会引发异常。

    此外,文档说明 string:strip/3 函数接受一个字符参数,该字符是从字符串的一个或两个末尾剥离的字符。如果给定一个列表而不是字符,它过去不会执行任何操作,但现在会引发异常。

    Dialyzer 将发现大多数将错误类型的参数传递给这些函数的情况。

    *潜在的不兼容性*

    自有 ID:OTP-6295

Kernel 2.11.1.1

改进和新功能

  • 现在有一个用于 UDP 套接字的 read_packets 选项,该选项设置每次调用套接字驱动程序将读取的最大 UDP 数据包数量。

    自有 ID:OTP-6249 辅助 ID:seq10452

Kernel 2.11.1

已修复的错误和故障

  • 在 R11B-0 中,始终启动 erl_ddll 服务器进程。尽管如此,Kernel 应用程序的配置参数 start_ddll 仍然被遵守,这将导致 erl_ddll 服务器启动两次(并导致系统关闭)。在此版本中,不再使用 start_ddll,并且已删除其文档。

    自有 ID:OTP-6163

  • 内核选项 {dist_auto_connect,once} 可能会阻止从未连接的节点,导致网络持续分区。此外,网络的部分重启可能会导致全局名称数据库不一致。这两个问题现在都已解决。

    自有 ID:OTP-6200 辅助 ID:seq10377

改进和新功能

  • 现在从调用 gen_tcp:close/1、gen_udp:close/1 和 inet:close/1 的进程的消息队列中删除延迟到达的 tcp_closed 和 udp_closed 消息。

    自有 ID:OTP-6197

Kernel 2.11

已修复的错误和故障

  • 当修复具有损坏索引文件(例如,由硬盘故障引起)的磁盘日志时,索引文件的旧内容将保持不变。这将导致重复尝试打开磁盘日志每次都失败。

    自有 ID:OTP-5558 辅助 ID:seq9823

  • 以前,unlink/1erlang:demonitor/2 的行为是完全异步的。但这有一个不良影响。您永远无法知道何时保证您不会受到已取消链接的链接或已取消监控的监视器的影响。

    unlink/1erlang:demonitor/2 的新行为可以看作是原子执行的两个操作。异步发送取消链接信号或取消监视信号,并忽略将来链接或监视器的任何结果。

    注意:此更改可能会导致一些以前没有失败的晦涩代码失败。例如,以下代码可能会挂起

                Mon = erlang:monitor(process, Pid),
                %% ...
                exit(Pid, bang),
                erlang:demonitor(Mon),
                receive
                    {'DOWN', Mon, process, Pid, _} -> ok
                %% We were previously guaranteed to get a down message
                %% (since we exited the process ourself), so we could
                %% in this case leave out:
                %% after 0 -> ok
                end,

    *潜在的不兼容性*

    自有 ID:OTP-5772

  • 已清理应用程序启动失败并可能导致运行时系统停止时的行为,包括修复一些小错误。

    application_controller 现在应始终使用非嵌套字符串终止,这意味着 erl_crash.dump 中的标语应始终易于阅读。

    init 现在确保传递给 erlang:halt/1 的标语不超过允许的最大长度。

    已从原始 error_logger 事件处理程序中删除了对 list_to_atom/1 的冗余调用。(感谢 Serge Aleynikov 指出这一点)。

    这些更改仅影响错误消息和崩溃转储文件标语的内容。

    自有 ID:OTP-5964

  • erl_ddll 服务器现在在 OTP 启动时启动,并置于 Kernel supervisor 下。这修复了几个小问题。它过去是按需启动的。

    已删除 erl_ddll 模块中 startstop 函数的文档,因为这些函数不应被其他应用程序使用。

    此外,erl_ddll:stop/1 函数不再终止 erl_ddll 服务器,因为这会终止整个运行时系统。

    自有 ID:OTP-6033

改进和新功能

  • application_master 中删除了一些未使用的函数。

    自有 ID:OTP-3889

  • Global 不再允许在多个名称下注册进程。如果需要旧的(有错误的)行为,则可以为 Kernel 应用程序变量 global_multi_name_action 指定值 allow

    自有 ID:OTP-5640 辅助 ID:OTP-5603

  • 已消除编译 erlang.erl 文件时显示的(略有误导性的)警告。

    自有 ID:OTP-5947

  • auth 模块 API 已弃用。

    自有 ID:OTP-6037

  • 添加了 erlang:demonitor/2,从而可以在同时刷新接收到的 'DOWN' 消息(如果存在)的情况下进行操作。请参阅 erlang

    自有 ID:OTP-6100 辅助 ID:OTP-5772

Kernel 2.10.13

已修复的错误和故障

  • 现在可以在 Solaris 8 上处理大文件(大于 2 GB)。

    自有 ID:OTP-5849 辅助 ID:seq10157

  • 在启动期间,inet_gethost_native 留下了一条垃圾 {'DOWN', ...} 消息,这导致了启动代码服务器的问题。

    自有 ID:OTP-5978 辅助 ID:OTP-5974

改进和新功能

  • 现在,global 在维护完全连接的网络时,会多次尝试连接节点。有时在非常大的负载下需要多次尝试。

    自有 ID:OTP-5889

  • 现在,erl_epmd 在调用 gen_server:call 时显式将超时设置为 infinity。在非常大的负载下,旧的 15 秒超时可能会超时。

    自有 ID:OTP-5959

  • 修正了代码服务器的启动,使其使用引用标记的元组,以确保发送到父进程的意外消息不会导致系统停止。同时移除了 code.erlcode_server.erl 中无用的 start/* 函数,并且不再从 code_server.erl 导出 init 函数。

    自有 ID: OTP-5974 辅助 ID: seq10243, OTP-5978

Kernel 2.10.12

修复的错误和故障

  • 修复了 global 中的一个错误:锁定进程将 nonode@nohost 添加到要锁定的节点列表中。这可能发生在任何节点被全局名称服务器知道之前。根据网络配置,症状是延迟。

    自有 ID: OTP-5792 辅助 ID: OTP-5563

  • 如果缺少 .app 文件,则 application:load/1 返回的错误原因已更正为 {"no such file or directory", "FILE.app"},而不是不太明确的 {"unknown POSIX error","FILE.app"}

    自有 ID: OTP-5809

  • 错误修复:disk_log:accessible_logs/0 不再将所有 pg2 进程组报告为分布式磁盘日志;disk_log:pid2name/1 无法识别分布式磁盘日志的进程。

    自有 ID: OTP-5810

  • 函数 file:consult/1, file:path_consult/2, file:eval/1,2, file:path_eval/2,3, file:script/1,2, file:path_script/2,3 现在在错误元组中返回正确的行号。

    自有 ID: OTP-5814

  • 如果引导脚本中有用户定义的变量,并且没有使用 -boot_var 选项提供它们的值,则模拟器将拒绝启动并显示令人困惑的错误消息。已更正为显示清晰易懂的消息。

    修改了 prim_file 模块,使其不依赖于 lists 模块,以便可以使用用户定义的加载器启动模拟器。(感谢 Martin Bjorklund。)

    自有 ID: OTP-5828 辅助 ID: seq10151

  • 对打开模式的描述进行了小幅更正。(感谢 Richard Carlsson。)

    自有 ID: OTP-5856

改进和新特性

  • application_controller 现在以实际错误原因终止,而不是 shutdown。这意味着在应用程序出错导致运行时系统终止的情况下,崩溃转储现在应该更具信息量。

    示例:如果(永久)应用程序 app1 启动失败,则标语现在将是:“Kernel pid terminated (application_controller) ({application_start_failure,app1,{shutdown, {app1,start,[normal,[]]}}})

    而不是之前的 “Kernel pid terminated (application_controller) (shutdown)”。

    自有 ID: OTP-5811

Kernel 2.10.11.1

修复的错误和故障

  • 计时器有时可能会过早超时。此错误现已修复。

    引入了对 erlang:send_after(Time, pid(), Msg) 和 erlang:start_timer(Time, pid(), Msg) 创建的计时器的自动取消。使用 pid 指定接收者的计时器,将在接收者退出时自动取消。有关更多信息,请参阅 erlang 手册页。

    为了能够在不增加维护成本的情况下维护大量的计时器,内部计时器轮和 bif 计时器表已扩大。

    还实现了一些小的 bif 计时器优化。

    自有 ID: OTP-5795 辅助 ID: OTP-5090, seq8913, seq10139, OTP-5782

改进和新特性

  • 文档改进

    - 修正了 erlang:link/1 的文档

    - 添加了命令行标志 -code_path_cache

    - erl 命令行标志说明

    - net_kernel 说明

    自有 ID: OTP-5847

Kernel 2.10.11

修复的错误和故障

  • 全局名称注册工具中的多个错误修复和改进(请参阅 global

    • 名称解析过程并非总是取消链接不再注册的进程;
    • nodedown 紧随 nodeup 时,全局名称有时可能会挂起;
    • 当节点关闭时,全局名称并非总是注销;
    • 现在可以在全局名称服务器解析名称的同时设置和删除锁——全局锁的处理已与全局名称的注册分离;

    从这个版本开始,global 不再支持运行 Erlang/OTP R7B 或更早版本的节点。

    *潜在的不兼容性*

    自有 ID: OTP-5563

  • 函数 global:set_lock/3global:trans/4 现在接受 Retries 参数的值 0(零)。

    自有 ID: OTP-5737

  • 如果 inet:getaddr(Addr, Family)Addr 参数是包含 IP 地址的 4 元组或 8 元组,则不再对其进行验证,除非元组的大小以及它包含正确范围内的整数。

    此更改的原因是验证可能会导致以下调用序列失败

    {ok,Addr} = inet:getaddr(localhost, inet6), gen_tcp:connect(Addr, 7, [inet6])

    自有 ID: OTP-5743

改进和新特性

  • 以前未记录且不受支持的 zlib 模块已以不兼容的方式更新,并且纠正了许多错误。现在也已记录在案。

    *潜在的不兼容性*

    自有 ID: OTP-5715

  • 添加了 application 接口函数 which_applications/1set_env/4unset_env/3,它们接受一个额外的 Timeout 参数。用于标准 gen_server 超时(5000 毫秒)不适用的情况。

    自有 ID: OTP-5724 辅助 ID: seq10083

  • 改进了有关使用包含的应用程序(使用启动阶段和 application_starter)同步启动应用程序的文档。

    自有 ID: OTP-5754

  • 为支持它们的平台(目前仅限 Linux)添加了新的套接字选项 prioritytos

    自有 ID: OTP-5756

  • 全局名称服务器在维护完全连接的网络方面进行了优化。

    自有 ID: OTP-5770

Kernel 2.10.10.1

修复的错误和故障

  • 本机解析器已获得用于扩展调试和软重启的控制 API。它是:inet_gethost_native:control(Control)
    Control = {debug_level,Level} | soft_restart
    Level = 范围为 0-4 的整数.

    自有 ID: OTP-5751 辅助 ID: EABln25013

Kernel 2.10.10

修复的错误和故障

  • 如果多个进程(在同一节点上)同时尝试启动同一个分布式应用程序,则可能导致 application:start 返回错误值,甚至挂起。

    自有 ID: OTP-5606 辅助 ID: seq9838

改进和新特性

  • 已更新大多数 Kernel 模块和一些 STDLIB 模块的手册页,特别是关于类型定义。

    更正了 erts:info/1 返回值的文档。

    erlang:statistics/1 的文档现在列出了所有可能的参数。

    自有 ID: OTP-5360

  • 当本机解析器无法进行 gethostbyaddr 查找时,应返回 nxdomain。不应尝试回退到仅当 IP 地址语法有效时才成功的例程。这已修复。

    自有 ID: OTP-5598 辅助 ID: OTP-5576

  • 用新的 fun M:F/A 结构替换了一些元组 funs。

    lists 模块中的高阶函数在任何情况下都不再接受错误的 funs。'lists:map(bad_fun, [])' 过去返回 '[]',但现在会导致异常。

    删除了 ets 模块中未使用、已损坏的兼容性代码。(感谢 Dialyzer。)

    消除了 Dialyzer 在 Appmon 应用程序中发现的 5 个差异。

    自有 ID: OTP-5633

  • 添加了在配置文件(使用 -config 标志指定的文件)中元组列表后添加注释的可能性。

    自有 ID: OTP-5661 辅助 ID: seq10003

Kernel 2.10.9

修复的错误和故障

  • 如果 sys.config 文件在点号之后完全没有任何空格,则 `erl -config sys.config` 将无法启动。(感谢 Anders Nygren。)

    自有 ID: OTP-5543

  • 已修复一个关于 TCP 套接字的错误,该错误会导致挂起的 gen_tcp:send/2。要遇到此错误,您需要一个进程从套接字读取数据,一个进程写入比读取进程读取的更多的数据,从而导致发送者被挂起,然后读取进程关闭套接字。(由 Alexey Shchepin 报告和诊断。)

    更正了 gen_tcp 中(未文档化且不受支持的)选项 {packet,http} 中的一个错误。(感谢 Claes Wikstrom 和 Luke Gorrie。)

    更新了关于 gen_tcp:recv/2 的第二个参数,即要接收的 Length 的文档。

    自有 ID: OTP-5582 辅助 ID: seq9839

改进和新特性

  • 在启动时,Erlang 解析器主机表被用于查找本地(以及可能独立的)主机的名称。这是不正确的。现在使用配置的解析器方法来实现此目的。

    自有 ID: OTP-5393

  • 现在已对 erlang:port_info/1 BIF 进行了文档化。对 erlang:port_info/2 的文档进行了小幅更正。

    math 模块的文档中添加了一条说明,即并非所有函数在所有平台上都可用。

    在 ERTS 文档的 erl 手册页中添加了有关 +c 选项的更多信息。

    自有 ID: OTP-5555

  • 新的 fun M:F/A 构造创建一个 fun,该 fun 引用 M:F/A 的最新版本。此语法旨在替换存在许多问题的元组 fun {M,F}

    新的类型测试 is_function(Fun,A)(可以在 guards 中使用)测试 Fun 是否是可以使用 A 个参数应用的 fun。(目前,Fun 也可以是一个元组 fun。)

    自有 ID: OTP-5584

  • 根据文档,global 实现了与 register/2 等效的功能,如果进程已经注册,则会返回 badarg。事实证明,在 global 中没有检查一个进程是否以多个名称注册。如果某些进程意外地或有意地被赋予多个名称,则由于在发现名称冲突时调用 resolve 函数的方式(请参阅 global 中的 register_name/3),名称注册表可能会变得不一致。

    在 OTP R11B 中,global 将不允许以多个名称注册进程。为了帮助查找将返回 no 的代码,此处引入了一个 Kernel 应用程序变量 global_multi_name_action。根据其值(infowarningerror),当 global 发现某些进程被赋予多个名称时,会将消息发送到错误记录器。该变量仅影响定义它的节点。

    自有 ID: OTP-5603

Kernel 2.10.8

改进和新特性

  • 在发生 DNS 查找循环的情况下,inet_db:getbyname 最终会构建一个无限列表。此问题已修复。

    自有 ID: OTP-5449

  • 当对 IPv4 地址执行 inet6 名称查找时,可能会以 IPv4 格式返回地址。此问题已更正。还更正了一些关于 IPv6 名称查找的其他小的不一致之处。

    自有 ID: OTP-5576

Kernel 2.10.7

已修复的错误和故障

  • 在某些情况下,net_kernel 可能会发出虚假的 nodedown 消息。此错误已修复。

    自有 ID: OTP-5396

  • 删除了 kernel 手册页中 keep_zombies 配置参数的描述。

    自有 ID: OTP-5497

改进和新特性

  • 消除了 initprim_file 模块中的 Dialyzer 警告(由死代码引起)。

    自有 ID: OTP-5496

  • inet_config 现在还会检查环境变量 ERL_INETRC 以查找可能的用户配置文件。有关详细信息,请参阅 ERTS 用户指南。

    自有 ID: OTP-5512

Kernel 2.10.6

改进和新特性

  • 引入了 +B 标志的 c 选项,该选项可以使用 Ctrl-C(在 Windows 上为 Ctrl-Break)来中断 shell 进程,而不是调用模拟器中断处理程序。所有新的 +B 选项现在也都在 Windows (werl) 上支持。此外,Windows 上的 Ctrl-C 现在已保留用于复制文本(以前使用 Ctrl-Ins)。Ctrl-Break 应用于中断处理。最后,更新了系统标志的文档。

    自有 ID: OTP-5388

  • 为了在 STDLIB 1.13.1 中实现向后兼容性,重新引入了与系统其余部分并行启动 Erlang shell 的可能性。现在用于此目的的标志称为 async_shell_start,并且已对其进行文档化。从 JCL 菜单启动的新 shell 不再与 init 同步。这使得即使初始 shell 没有启动,也可以启动新的 shell(例如,用于调试目的)。

    自有 ID: OTP-5406 辅助 ID: OTP-5218

Kernel 2.10.5

已修复的错误和故障

改进和新特性

Kernel 2.10.4

已修复的错误和故障

  • 应用程序的应用程序主进程现在可以更快地终止应用程序,从而降低系统中其他部分出现超时的风险。

    自有 ID: OTP-5363 辅助 ID: EABln19084

  • 添加了一个 BIF erlang:raise/3。有关详细信息,请参阅手册。它仅用于内部系统编程,高级错误处理。

    自有 ID: OTP-5376 辅助 ID: OTP-5257

Kernel 2.10.3

改进和新特性

  • 使用 -eval 标志(erl -eval Expr),可以在系统初始化期间评估任意表达式。这在 init 中有文档记录。

    自有 ID: OTP-5260

  • 已删除不受支持和未文档化的模块 socks5socks5_authsocks5_tcpsocks5_udp

    自有 ID: OTP-5266

Kernel 2.10.1

已修复的错误和故障

  • Pman 的“跟踪 shell”功能已损坏,现在已修复。此外,如果节点上运行多个 shell 进程,则 Pman 无法正确找到活动 shell 的 pid。此问题也已得到更正。

    自有 ID: OTP-5191

  • 删除了不再存在的 auth:open/1 函数的文档。(感谢 Miguel Barreiro。)

    自有 ID: OTP-5208

  • 更正了未文档化且不受支持的 zlib 模块中的 crc32/3 函数。

    自有 ID: OTP-5227

改进和新特性

  • 您现在可以使用 -rsh 标志启动 Erlang,这将为您提供远程初始 shell 而不是本地 shell。示例:

                erl -sname this_node -rsh other_node@other_host

    自有 ID: OTP-5210

  • 如果 /etc/hosts 指定了两个具有相同 IP 地址的主机(在单独的行上),则在 inet 配置期间,inet_db 只会注册最后一个主机。现在已对此进行了更正,以便两个别名都注册到相同的 IP 地址。

    自有 ID: OTP-5212 辅助 ID: seq7128

  • 澄清了采用 I/O 列表的 BIF 的文档。这些是 list_to_binary/1port_command/2port_control/3

    添加了所有 is_* BIF(例如 is_atom/1)的文档。

    移除了 erlang:float_to_binary/2 的文档,该函数在几个版本之前已从运行时系统中移除。

    内部 ID: OTP-5222