<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>40213</bug_id>
          
          <creation_ts>2021-06-13 17:24:02 +0300</creation_ts>
          <short_desc>Сервер впадает в бесконечный цикл</short_desc>
          <delta_ts>2023-06-14 15:56:21 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>unfs3</component>
          <version>unstable</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>major</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexey Gladkov">legion</reporter>
          <assigned_to name="Nobody&apos;s working on this, feel free to take it">nobody</assigned_to>
          <cc>asheplyakov</cc>
    
    <cc>lav</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>199163</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Gladkov">legion</who>
    <bug_when>2021-06-13 17:24:02 +0300</bug_when>
    <thetext>unfs3 не работает. Если указать порты, то под strace видно, что он цыклится.

strace -f unfsd -d -p -t -n 6000 -m 6001 -e /to/exports
...
select(1024, [3 4], NULL, NULL, {tv_sec=1, tv_usec=0}) = 2 (in [3 4], left {tv_sec=0, tv_usec=999998})
accept(3, 0x7fffe52cf160, [128])        = -1 EINVAL (Недопустимый аргумент)
accept(4, 0x7fffe52cf160, [128])        = -1 EINVAL (Недопустимый аргумент)
select(1024, [3 4], NULL, NULL, {tv_sec=1, tv_usec=0}) = 2 (in [3 4], left {tv_sec=0, tv_usec=999998})
accept(3, 0x7fffe52cf160, [128])        = -1 EINVAL (Недопустимый аргумент)
accept(4, 0x7fffe52cf160, [128])        = -1 EINVAL (Недопустимый аргумент)

Эти строки будут повторяться постоянно. Сервер при этом не будет слушать запросы.
select делает unfs3 сервер, accept библиотека libtirpc.

Я проверил апстрим, но там ситуация та же. Даже если собрать его с поддержкой poll, то циклится он будет на poll. Всё дело в какой-то несовместимости между unfs3 и libtirpc, поддержки которой нет в апстриме. Там есть лишь PR по добавлению libtirpc. С этим PR тоже не работает т.к. он добавляет только возможность собраться с этой библиотекой.

https://github.com/legionus/unfs3 -- тут я собрал несколько фиксов для unfs3. Они, впрочем, не решают описанную проблему.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227528</commentid>
    <comment_count>1</comment_count>
    <who name="Alexey Sheplyakov">asheplyakov</who>
    <bug_when>2023-06-13 18:20:35 +0300</bug_when>
    <thetext>#0  0x00007ffff7ebc4f3 in __libc_accept (fd=4, addr=addr@entry=..., len=len@entry=0x7fffffffdc0c) at ../sysdeps/unix/sysv/linux/accept.c:26
#1  0x00007ffff7facb93 in rendezvous_request (xprt=0x555555a3ad20, msg=&lt;optimized out&gt;) at svc_vc.c:340
#2  0x00007ffff7fa98a0 in svc_getreq_common (fd=fd@entry=4) at svc.c:700
#3  0x00007ffff7fa9a1c in svc_getreqset (readfds=&lt;optimized out&gt;) at svc.c:669
#4  0x000055555555a225 in unfs3_svc_run () at daemon.c:822
#5  0x000055555555a735 in main (argc=2, argv=0x7fffffffe5d8) at daemon.c:968


337             r = (struct cf_rendezvous *)xprt-&gt;xp_p1;
338     again:
339             len = sizeof addr;
340             sock = accept(xprt-&gt;xp_fd, (struct sockaddr *)(void *)&amp;addr, &amp;len);
341             if (sock &lt; 0) {
342                     if (errno == EINTR)
343                             goto again;
344                     return (FALSE);
345             }


Крутится он здесь. Что делает этот rendezvous_request -- в душе не ведаю. Почему каждый раз accept завершается с EINTR -- тоже загадка.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227557</commentid>
    <comment_count>2</comment_count>
    <who name="Alexey Sheplyakov">asheplyakov</who>
    <bug_when>2023-06-13 23:04:15 +0300</bug_when>
    <thetext>(Ответ для Alexey Gladkov на комментарий #0)
&gt; unfs3 не работает. Если указать порты, то под strace видно, что он цыклится.
&gt; 
&gt; strace -f unfsd -d -p -t -n 6000 -m 6001 -e /to/exports
&gt; ...
&gt; select(1024, [3 4], NULL, NULL, {tv_sec=1, tv_usec=0}) = 2 (in [3 4], left
&gt; {tv_sec=0, tv_usec=999998})
&gt; accept(3, 0x7fffe52cf160, [128])        = -1 EINVAL (Недопустимый аргумент)
&gt; accept(4, 0x7fffe52cf160, [128])        = -1 EINVAL (Недопустимый аргумент)
&gt; select(1024, [3 4], NULL, NULL, {tv_sec=1, tv_usec=0}) = 2 (in [3 4], left
&gt; {tv_sec=0, tv_usec=999998})
&gt; accept(3, 0x7fffe52cf160, [128])        = -1 EINVAL (Недопустимый аргумент)
&gt; accept(4, 0x7fffe52cf160, [128])        = -1 EINVAL (Недопустимый аргумент)
&gt; 
&gt; Эти строки будут повторяться постоянно. Сервер при этом не будет слушать
&gt; запросы.
&gt; select делает unfs3 сервер, accept библиотека libtirpc.

А listen не делает никто.

https://github.com/asheplyakov/unfs3/blob/master/daemon.c#L782-L794

libtirpc (по крайней мере, версия 1.3.3) может либо сама создать и подготовить сокет, либо взять уже подготовленный вручную. Но в последнем случае нужно самостоятельно сделать listen, а create_tcp_transport из unfs3 этого не делает.


diff --git a/unfs3/daemon.c b/unfs3/daemon.c
index d14af45..964d1ab 100644
--- a/unfs3/daemon.c
+++ b/unfs3/daemon.c
@@ -779,6 +779,11 @@ static SVCXPRT *create_tcp_transport(unsigned int port)
            fprintf(stderr, &quot;Couldn&apos;t bind to tcp port %d\n&quot;, port);
            exit(1);
        }
+        if (listen(sock, SOMAXCONN)) {
+            perror(&quot;listen&quot;);
+           fprintf(stderr, &quot;Couldn&apos;t listen tcp port %d\n&quot;, port);
+           exit(1);
+        }
     }
 
     transp = svctcp_create(sock, 0, 0);

Вот так надо сделать, чтоб заработало.


&gt; Я проверил апстрим, но там ситуация та же.

Я им уже патч засылал на эту тему (https://github.com/asheplyakov/unfs3/commit/a9d97fa8305fa766c72d19d7123ed1659bd9f02a), правда, я не упоминал отдельно то, что с ним unfs3 таки работает.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227558</commentid>
    <comment_count>3</comment_count>
    <who name="Alexey Sheplyakov">asheplyakov</who>
    <bug_when>2023-06-13 23:12:24 +0300</bug_when>
    <thetext>Патчерам, которые &quot;Fixed ftbfs&quot; - пламенный привет, лучи света и добра, и всё такое.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227559</commentid>
    <comment_count>4</comment_count>
    <who name="Alexey Sheplyakov">asheplyakov</who>
    <bug_when>2023-06-13 23:18:18 +0300</bug_when>
    <thetext>В 0.10.0 исправлено:

commit a7bd4ba0c228cca1dbc78b8bf4699107a3542eaa
Author: Martin Škoudlil &lt;skoudmar@fel.cvut.cz&gt;
Date:   Thu May 12 17:01:22 2022 +0200

    svc_dg_create and svc_vc_create requires bound socket
    
    When started with &apos;-u&apos; the socket passed to these functions is not bound.
    This will prevent any connection.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227619</commentid>
    <comment_count>5</comment_count>
    <who name="Repository Robot">repository-robot</who>
    <bug_when>2023-06-14 15:56:21 +0300</bug_when>
    <thetext>unfs3-0.10.0-alt1 -&gt; sisyphus:

 Wed Jun 14 2023 Alexey Sheplyakov &lt;asheplyakov@altlinux&gt; 0.10.0-alt1
 - 0.10.0
 - Ensure TCP socket is always listened (closes: #40213)</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>