gen_sctp:open(). возвращает ошибку исключения: неверный аргумент - только для Erlang, скомпилированного из исходников для Docker Image на основе Rocky Linux

Некоторое время назад я подготовил образ контейнера Docker на основе CentOS 7.9 с сборкой erlang-otp из исходников - https://github.com/erlang/otp/releases/download/OTP-22.3.4.11/otp_src-22.3.4.11.tar.gz . Все работало нормально - как и ожидалось:

      Erlang/OTP 22 [erts-10.7.2.4] [source] [64-bit] [smp:32:32] [ds:32:32:10] [async-threads:1] [hipe]

Eshell V10.7.2.4  (abort with ^G)
1> gen_sctp:open().
{ok,#Port<0.6>}
2>

Теперь я пытаюсь сделать то же самое, но на Rocky Linux 8.4 / 8.5 Docker Image и собрать ту же версию - 22.3.4.11из источников. Все они были успешно скомпилированы на одном сервере (как образ Docker на базе CentOS 7.x), но sctp не работает правильно только для образа Rocky Linux на основе Docker .

      Erlang/OTP 22 [erts-10.7.2.4] [source] [64-bit] [smp:32:32] [ds:32:32:10] [async-threads:1] [hipe]

Eshell V10.7.2.4  (abort with ^G)
1> gen_sctp:open().
** exception error: bad argument
     in function  gen_sctp:open/1
        called as gen_sctp:open([])
2>

Я тоже пытаюсь проверить 22.3.4.23была показана версия и та же ошибка.
Я также пробовал установить из пакетов Rocky RPM yum install erlang.x86_64 - 22.0.7-1.el8и все работает нормально.
Я бы использовал собственную скомпилированную версию на Rocky, чтобы иметь простой способ обновить erlang до более новой версии.

Пожалуйста, дайте мне знать, что мне делать, чтобы исправить exception error: bad argument для Rocky Linux?

Dockerfile для Rocky Linux 8.5 / CentOS 7.9.2009:

      # For Rocky Linux
FROM rockylinux/rockylinux:8.5
# For CentOS Linux - comment above FROM and uncomment below FROM
# FROM centos:7.9.2009

### Update Image packages
RUN echo 'tsflags=nodocs' >> /etc/yum.conf && \
    yum clean all && \
    yum update -y && \
    yum install -y \
    glibc-langpack-en \
    diffutils \
    findutils \
    wget \
    unzip \
    gcc \
    gcc-c++ \
    autoconf.noarch \
    ncurses-devel \
    make \
    unixODBC-devel.x86_64 \
    lksctp-tools \
    lksctp-tools-devel

ENV ERLANGOTP_VERSION 22.3.4.11
ENV ERLANGOTP_DIR_NAME otp_src_${ERLANGOTP_VERSION}
ENV ERLANGOTP_ARCHIVE otp_src_${ERLANGOTP_VERSION}.tar.gz
RUN wget https://github.com/erlang/otp/releases/download/OTP-${ERLANGOTP_VERSION}/${ERLANGOTP_ARCHIVE} -O /tmp/${ERLANGOTP_ARCHIVE} && \
    tar -xf /tmp/${ERLANGOTP_ARCHIVE} -C /tmp && \
    pushd /tmp/${ERLANGOTP_DIR_NAME} && \
    ./otp_build autoconf && \
    ./configure \
        --enable-sctp \
        --prefix=/usr/local \
        && \
    make -j $(nproc) -l $(nproc) && \
    make install && \
    rm -rf /tmp/${ERLANGOTP_DIR_NAME} /tmp/${ERLANGOTP_ARCHIVE}

Команда сборки Docker:
docker build -t erltest:1.0.0 .

Команда запуска Docker для тестов:
docker run -it --rm erltest:1.0.0 bash
erl
gen_sctp:open().

Результаты конфигурации SCTP для CentOS 7.9 / Rocky Linux 8.5 Docker Image (в комментарии обнаружены различия для sctp):

      checking for netpacket/packet.h... yes
checking for netinet/sctp.h... yes
checking for sctp_bindx... no
checking for sctp_peeloff... no
checking for sctp_getladdrs... no
checking for sctp_freeladdrs... no
checking for sctp_getpaddrs... no
checking for sctp_freepaddrs... no
checking whether SCTP_UNORDERED is declared... yes
checking whether SCTP_ADDR_OVER is declared... yes
checking whether SCTP_ABORT is declared... yes
checking whether SCTP_EOF is declared... yes

# for CentOS 7.x - below:
checking whether SCTP_SENDALL is declared... yes
# for Rocky Linux - below:
checking whether SCTP_SENDALL is declared... no

checking whether SCTP_ADDR_CONFIRMED is declared... yes
checking whether SCTP_DELAYED_ACK_TIME is declared... yes
checking whether SCTP_EMPTY is declared... yes
checking whether SCTP_UNCONFIRMED is declared... yes
checking whether SCTP_CLOSED is declared... yes
checking whether SCTPS_IDLE is declared... no
checking whether SCTP_BOUND is declared... no
checking whether SCTPS_BOUND is declared... no
checking whether SCTP_LISTEN is declared... no
checking whether SCTPS_LISTEN is declared... no
checking whether SCTP_COOKIE_WAIT is declared... yes
checking whether SCTPS_COOKIE_WAIT is declared... no
checking whether SCTP_COOKIE_ECHOED is declared... yes
checking whether SCTPS_COOKIE_ECHOED is declared... no
checking whether SCTP_ESTABLISHED is declared... yes
checking whether SCTPS_ESTABLISHED is declared... no
checking whether SCTP_SHUTDOWN_PENDING is declared... yes
checking whether SCTPS_SHUTDOWN_PENDING is declared... no
checking whether SCTP_SHUTDOWN_SENT is declared... yes
checking whether SCTPS_SHUTDOWN_SENT is declared... no
checking whether SCTP_SHUTDOWN_RECEIVED is declared... yes
checking whether SCTPS_SHUTDOWN_RECEIVED is declared... no
checking whether SCTP_SHUTDOWN_ACK_SENT is declared... yes
checking whether SCTPS_SHUTDOWN_ACK_SENT is declared... no
checking for struct sctp_paddrparams.spp_pathmtu... yes
checking for struct sctp_paddrparams.spp_sackdelay... yes
checking for struct sctp_paddrparams.spp_flags... yes
checking for struct sctp_remote_error.sre_data... yes
checking for struct sctp_send_failed.ssf_data... yes
checking for struct sctp_event_subscribe.sctp_authentication_event... yes
checking for struct sctp_event_subscribe.sctp_sender_dry_event... yes
checking for sched.h... (cached) yes
...
checking ERTS version... 10.7.2.4
checking OTP release... 22
checking OTP version... 22.3.4.11

1 ответ

Я снова проверил все для ядра и заметил следующие вещи:

  1. Машина Red Hat 7.x работает на kernel 4.19.x:
  • на основе Docker Image со сборкой erlang-otp из исходников - работает корректно ()
  • на основе Docker Image с erlang-otp сборкой из исходников - не работает ( ** exception error: bad argument)
  1. Та же машина с Red Hat 7.x, но работающая на kernel 5.15.5:
  • CentOS 7.9на основе Docker Image со сборкой erlang-otp из исходников - работает корректно ()
  • на основе образа Docker со сборкой erlang-otp 22.3.4.11из исходников - работают корректно ( {ok,#Port<0.6>})

Похоже, Docker Image создан на основе современных ядер. Старший 4.19.xядро вызывает проблему, но новее 5.15.5ядро ​​работает, как и ожидалось, с тем же образом Docker на основе — я не знаю, почему это решает проблему.

КСТАТИ. По умолчанию Rocky Linux 8.5ядро 4.18.0.

Другие вопросы по тегам