#25 sigul 1.2 gets stuck downloading rpms
Opened by kevin. Modified

Since upgrading to 1.2, we have been seeing sigul stop processing from time to time.

This happens when it gets the signing request for packages with a very large number of subpackages. (ex: glibc, root, ghc)

It processes along and then just stops.

On the bridge we can see:

ESTAB           0           1172624            10.3.169.120:44333              10.3.169.27:51852       users:(("python3",pid=131005,fd=8))                                                                  

and vault:

ESTAB      1388771 0         10.3.169.27:51852 10.3.169.120:44333 users:(("python3",pid=698889,fd=9))

restarting the vault causes it to resume and complete signing of that package.


So:

  ├─python3,426700 /usr/share/sigul/server.py -dvv
  │   └─python3,443437 /usr/share/sigul/server.py -dvv
  │       ├─python3,443438 /usr/share/sigul/server.py -dvv
  │       ├─{python3},443504
  │       ├─{python3},443505
  │       └─{python3},443506

443438:

#0  0x00007fea2b5019c7 in poll () from /lib64/libc.so.6
#1  0x00007fea292847c6 in _pr_poll_with_poll () from /lib64/libnspr4.so
#2  0x00007fea28f7bfb1 in Socket_poll ()   from /usr/lib64/python3.9/site-packages/nss/io.cpython-39-x86_64-linux-gnu.so
#3  0x00007fea2b926638 in cfunction_call () from /lib64/libpython3.9.so.1.0
#4  0x00007fea2b9184f4 in _PyObject_MakeTpCall ()   from /lib64/libpython3.9.so.1.0
#5  0x00007fea2b91540e in _PyEval_EvalFrameDefault ()   from /lib64/libpython3.9.so.1.0
#6  0x00007fea2b91ccb3 in function_code_fastcall ()   from /lib64/libpython3.9.so.1.0
#7  0x00007fea2b91015d in _PyEval_EvalFrameDefault ()   from /lib64/libpython3.9.so.1.0
#8  0x00007fea2b91ccb3 in function_code_fastcall ()   from /lib64/libpython3.9.so.1.0
#9  0x00007fea2b914de5 in _PyEval_EvalFrameDefault ()   from /lib64/libpython3.9.so.1.0
#10 0x00007fea2b91ccb3 in function_code_fastcall ()   from /lib64/libpython3.9.so.1.0
#11 0x00007fea2b910433 in _PyEval_EvalFrameDefault ()   from /lib64/libpython3.9.so.1.0
#12 0x00007fea2b91ccb3 in function_code_fastcall ()   from /lib64/libpython3.9.so.1.0
#13 0x00007fea2b917f57 in _PyObject_FastCallDictTstate () from /lib64/libpython3.9.so.1.0
#14 0x00007fea2b923a37 in slot_tp_init () from /lib64/libpython3.9.so.1.0
#15 0x00007fea2b918773 in type_call () from /lib64/libpython3.9.so.1.0
#16 0x00007fea2b9184f4 in _PyObject_MakeTpCall () from /lib64/libpython3.9.so.1.0
#17 0x00007fea2b91540e in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#18 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#19 0x00007fea2b917f57 in _PyObject_FastCallDictTstate () from /lib64/libpython3.9.so.1.0
#20 0x00007fea2b923a37 in slot_tp_init () from /lib64/libpython3.9.so.1.0
#21 0x00007fea2b918773 in type_call () from /lib64/libpython3.9.so.1.0
#22 0x00007fea2b9184f4 in _PyObject_MakeTpCall () from /lib64/libpython3.9.so.1.0
#23 0x00007fea2b914d65 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#24 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#25 0x00007fea2b91015d in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#26 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#27 0x00007fea2b91015d in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#28 0x00007fea2b90ed25 in _PyEval_EvalCode () from /lib64/libpython3.9.so.1.0
#29 0x00007fea2b989665 in _PyEval_EvalCodeWithName () from /lib64/libpython3.9.so.1.0
#30 0x00007fea2b9895fd in PyEval_EvalCodeEx () from /lib64/libpython3.9.so.1.0
#31 0x00007fea2b9895af in PyEval_EvalCode () from /lib64/libpython3.9.so.1.0
#32 0x00007fea2b9b96e4 in run_eval_code_obj () from /lib64/libpython3.9.so.1.0
#33 0x00007fea2b9b5546 in run_mod () from /lib64/libpython3.9.so.1.0
#34 0x00007fea2b88ac6f in pyrun_file.cold () from /lib64/libpython3.9.so.1.0
#35 0x00007fea2b9af293 in PyRun_SimpleFileExFlags () from /lib64/libpython3.9.so.1.0
#36 0x00007fea2b9abaf8 in Py_RunMain () from /lib64/libpython3.9.so.1.0
#37 0x00007fea2b97bf9d in Py_BytesMain () from /lib64/libpython3.9.so.1.0
#38 0x00007fea2b429590 in __libc_start_call_main () from /lib64/libc.so.6
#39 0x00007fea2b429640 in __libc_start_main_impl () from /lib64/libc.so.6
#40 0x000055ebd5219095 in _start ()

443504:

#0  0x00007fea2b48679a in __futex_abstimed_wait_common () from /lib64/libc.so.6
#1  0x00007fea2b490f3e in __new_sem_wait_slow64 () from /lib64/libc.so.6
#2  0x00007fea2b8fe8a1 in PyThread_acquire_lock_timed ()
   from /lib64/libpython3.9.so.1.0
#3  0x00007fea2b98eb51 in acquire_timed () from /lib64/libpython3.9.so.1.0
#4  0x00007fea2b98e95f in lock_PyThread_acquire_lock ()
   from /lib64/libpython3.9.so.1.0
#5  0x00007fea2b91d8e1 in method_vectorcall_VARARGS_KEYWORDS ()
   from /lib64/libpython3.9.so.1.0
#6  0x00007fea2b910433 in _PyEval_EvalFrameDefault ()
   from /lib64/libpython3.9.so.1.0
#7  0x00007fea2b90ed25 in _PyEval_EvalCode () from /lib64/libpython3.9.so.1.0
#8  0x00007fea2b91ca25 in _PyFunction_Vectorcall ()
   from /lib64/libpython3.9.so.1.0
#9  0x00007fea2b910433 in _PyEval_EvalFrameDefault ()
   from /lib64/libpython3.9.so.1.0
#10 0x00007fea2b90ed25 in _PyEval_EvalCode () from /lib64/libpython3.9.so.1.0
#11 0x00007fea2b91ca25 in _PyFunction_Vectorcall ()
   from /lib64/libpython3.9.so.1.0
#12 0x00007fea2b910433 in _PyEval_EvalFrameDefault ()
   from /lib64/libpython3.9.so.1.0
#13 0x00007fea2b91ccb3 in function_code_fastcall ()
   from /lib64/libpython3.9.so.1.0
--Type <RET> for more, q to quit, c to continue without paging--c
#14 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#15 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#16 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#17 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#18 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#19 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#20 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#21 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#22 0x00007fea2b925212 in method_vectorcall () from /lib64/libpython3.9.so.1.0
#23 0x00007fea2b9d6e6a in t_bootstrap () from /lib64/libpython3.9.so.1.0
#24 0x00007fea2b9d6e18 in pythread_wrapper () from /lib64/libpython3.9.so.1.0
#25 0x00007fea2b489c02 in start_thread () from /lib64/libc.so.6
#26 0x00007fea2b50ec40 in clone3 () from /lib64/libc.so.6

443505:

#0  0x00007fea2b4fda8f in write () from /lib64/libc.so.6
#1  0x00007fea2b9b5b0d in _Py_write () from /lib64/libpython3.9.so.1.0
#2  0x00007fea2b9b5a5c in _io_FileIO_write () from /lib64/libpython3.9.so.1.0
#3  0x00007fea2b9244ce in method_vectorcall_O ()
   from /lib64/libpython3.9.so.1.0
#4  0x00007fea2b92e80f in PyObject_VectorcallMethod ()
   from /lib64/libpython3.9.so.1.0
#5  0x00007fea2b9b9119 in _bufferedwriter_raw_write ()
   from /lib64/libpython3.9.so.1.0
#6  0x00007fea2b9b6c85 in _bufferedwriter_flush_unlocked ()
   from /lib64/libpython3.9.so.1.0
#7  0x00007fea2b9b6b29 in buffered_flush_and_rewind_unlocked ()
   from /lib64/libpython3.9.so.1.0
#8  0x00007fea2b9b6ae0 in buffered_flush () from /lib64/libpython3.9.so.1.0
#9  0x00007fea2b91fc8c in method_vectorcall_NOARGS ()
   from /lib64/libpython3.9.so.1.0
#10 0x00007fea2b92e80f in PyObject_VectorcallMethod ()
   from /lib64/libpython3.9.so.1.0
#11 0x00007fea2b9b69fe in _io_TextIOWrapper_flush ()
   from /lib64/libpython3.9.so.1.0
#12 0x00007fea2b91fc8c in method_vectorcall_NOARGS ()
   from /lib64/libpython3.9.so.1.0
#13 0x00007fea2b910433 in _PyEval_EvalFrameDefault ()
--Type <RET> for more, q to quit, c to continue without paging--c
   from /lib64/libpython3.9.so.1.0
#14 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#15 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#16 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#17 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#18 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#19 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#20 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#21 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#22 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#23 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#24 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#25 0x00007fea2b925212 in method_vectorcall () from /lib64/libpython3.9.so.1.0
#26 0x00007fea2b9d6e6a in t_bootstrap () from /lib64/libpython3.9.so.1.0
#27 0x00007fea2b9d6e18 in pythread_wrapper () from /lib64/libpython3.9.so.1.0
#28 0x00007fea2b489c02 in start_thread () from /lib64/libc.so.6
#29 0x00007fea2b50ec40 in clone3 () from /lib64/libc.so.6

443506:

#0  0x00007fea2b48679a in __futex_abstimed_wait_common () from /lib64/libc.so.6
#1  0x00007fea2b491c48 in __new_sem_wait_slow64.constprop.0 ()
   from /lib64/libc.so.6
#2  0x00007fea2b8fe85a in PyThread_acquire_lock_timed ()
   from /lib64/libpython3.9.so.1.0
#3  0x00007fea2b98eb51 in acquire_timed () from /lib64/libpython3.9.so.1.0
#4  0x00007fea2b98e95f in lock_PyThread_acquire_lock ()
   from /lib64/libpython3.9.so.1.0
#5  0x00007fea2b91d8e1 in method_vectorcall_VARARGS_KEYWORDS ()
   from /lib64/libpython3.9.so.1.0
#6  0x00007fea2b910433 in _PyEval_EvalFrameDefault ()
   from /lib64/libpython3.9.so.1.0
#7  0x00007fea2b90ed25 in _PyEval_EvalCode () from /lib64/libpython3.9.so.1.0
#8  0x00007fea2b91ca25 in _PyFunction_Vectorcall ()
   from /lib64/libpython3.9.so.1.0
#9  0x00007fea2b910433 in _PyEval_EvalFrameDefault ()
   from /lib64/libpython3.9.so.1.0
#10 0x00007fea2b90ed25 in _PyEval_EvalCode () from /lib64/libpython3.9.so.1.0
#11 0x00007fea2b91ca25 in _PyFunction_Vectorcall ()
   from /lib64/libpython3.9.so.1.0
#12 0x00007fea2b910433 in _PyEval_EvalFrameDefault ()
   from /lib64/libpython3.9.so.1.0
#13 0x00007fea2b91ccb3 in function_code_fastcall ()
--Type <RET> for more, q to quit, c to continue without paging--c
   from /lib64/libpython3.9.so.1.0
#14 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#15 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#16 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#17 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#18 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#19 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#20 0x00007fea2b910433 in _PyEval_EvalFrameDefault () from /lib64/libpython3.9.so.1.0
#21 0x00007fea2b91ccb3 in function_code_fastcall () from /lib64/libpython3.9.so.1.0
#22 0x00007fea2b925212 in method_vectorcall () from /lib64/libpython3.9.so.1.0
#23 0x00007fea2b9d6e6a in t_bootstrap () from /lib64/libpython3.9.so.1.0
#24 0x00007fea2b9d6e18 in pythread_wrapper () from /lib64/libpython3.9.so.1.0
#25 0x00007fea2b489c02 in start_thread () from /lib64/libc.so.6
#26 0x00007fea2b50ec40 in clone3 () from /lib64/libc.so.6

Sadly the py-bt isn't very detailed:

Traceback (most recent call first):
  <built-in method waitpid of module object at remote 0x7fe479cc2270>
  File "/usr/share/sigul/server.py", line 2796, in main
    (_, status) = os.waitpid(child_pid, 0)
  File "/usr/share/sigul/server.py", line 2818, in <module>
    main()

Sadly the py-bt isn't very detailed:

Traceback (most recent call first): <built-in method waitpid of module object at remote 0x7fe479cc2270> File "/usr/share/sigul/server.py", line 2796, in main (_, status) = os.waitpid(child_pid, 0) File "/usr/share/sigul/server.py", line 2818, in <module> main()

Can you apply that to all threads on all the processes? thread apply all py-bt should work, I think.

Seems to be the same thing:

(gdb) py-bt thread apply all py-bt
Traceback (most recent call first):
  <built-in method waitpid of module object at remote 0x7f9f04a82270>
  File "/usr/share/sigul/server.py", line 2796, in main
    (_, status) = os.waitpid(child_pid, 0)
  File "/usr/share/sigul/server.py", line 2818, in <module>
    main()

So, that was the top level thread/process, the next one down might be more interesting:

(gdb) thread apply all py-lis
Thread 4 (Thread 0x7f8afda1d640 (LWP 1532742) "python3"):
 307            self._waiters.append(waiter)
 308            saved_state = self._release_save()
 309            gotit = False
 310            try:    # restore state no matter what (e.g., KeyboardInterrupt)
 311                if timeout is None:
>312                    waiter.acquire()
 313                    gotit = True
 314                else:
 315                    if timeout > 0:
 316                        gotit = waiter.acquire(True, timeout)
 317                    else:
Thread 3 (Thread 0x7f8afe21e640 (LWP 1532741) "python3"):
1114            self._build_rpm_macros_file()
1115            self._rpm_macros_file.seek(0)
1116    
1117            for i in range(2):
1118                self._passphrase_writer.write('%s\n' % self.__key_passphrase)
>1119                self._passphrase_writer.flush()
1120    
1121            logging.info("Starting signing operation")
1122            try:
1123                subprocess.run(
1124                    [
Thread 2 (Thread 0x7f8afea1f640 (LWP 1532740) "python3"):
 311                if timeout is None:
 312                    waiter.acquire()
 313                    gotit = True
 314                else:
 315                    if timeout > 0:
>316                        gotit = waiter.acquire(True, timeout)
 317                    else:
 318                        gotit = waiter.acquire(False)
 319                return gotit
 320            finally:
 321                self._acquire_restore(saved_state)
Thread 1 (Thread 0x7f8b02f70740 (LWP 1532708) "python3"):
1075                # already determined that the C code is done
1076                assert self._is_stopped
1077                return
1078    
1079            try:
>1080                if lock.acquire(block, timeout):
1081                    lock.release()
1082                    self._stop()
1083            except:
1084                if lock.locked():
1085                    # bpo-45274: lock.acquire() acquired the lock, but the function

And the one below that:

(gdb) thread apply all py-list
Thread 1 (Thread 0x7f8b02f70740 (LWP 1532709) "python3"):
  84        updated with poll results.
  85    
  86        '''
  87        # FIXME: implement this in nss-python instead?
  88        flat = list(descs.items())
 >89        res = nss.io.Socket.poll(flat, timeout)
  90        for (i, desc) in enumerate(flat):
  91            descs[desc[0]] = res[i]
  92    
  93    
  94    def _tcp_socketpair():

Finally getting back to this. It looks like in https://pagure.io/sigul/issue/25#comment-921752 you printed where it's getting stuck but without the backtrace, so if it gets stuck again doing the thread apply all py-bt on the subprocesses might be enlightening. Still, the code blocks offer some hints.

The last one with nss.io.Socket.poll is being called with nss.io.PR_INTERVAL_NO_TIMEOUT which could be what's causing the endless hang. Thread 4 on the second level is from the standard library threading module, which could be coming from the run_worker_threads() function which calls join() without a timeout.

Getting the debug level logs for both sides might also shed some light on things. I'm going to spend more time tomorrow reading the code and I'll prepare a couple small patches if it seems like adding timeouts to the two areas above seems reasonable. There are a few other things I'd like to investigate. For example, there's a few bounded queues of size 100. I wonder if the number of subpackages is >100...

And the one below that:

```
(gdb) thread apply all py-list

Thread 1 (Thread 0x7f8b02f70740 (LWP 1532709) "python3"):
84 updated with poll results.
85
86 '''
87 # FIXME: implement this in nss-python instead?
88 flat = list(descs.items())

89 res = nss.io.Socket.poll(flat, timeout)
90 for (i, desc) in enumerate(flat):
91 descs[desc[0]] = res[i]
92
93
94 def _tcp_socketpair():
```

When things aren't on fire and you want to try a little more debugging, https://pagure.io/fork/jcline/sigul/c/b801ac173589385c0a6fd7b07d311a59f00d05f0 adds a timeout to this call. The commit message includes my theories on what will happen and it's just a two-liner diff.

I've applied that... lets see what happens. :) Thanks again for looking into it...

ok, it was stuck and in logs:

2024-08-26 22:49:46,856 DEBUG: (child) Poll: C:3
2024-08-26 22:49:46,856 DEBUG: (child) Poll: C:1, E:1
2024-08-26 22:49:46,856 DEBUG: (child) Poll: C:1, E:1
2024-08-26 22:49:46,856 DEBUG: (child) Poll: C:3
2024-08-26 23:49:46,957 DEBUG: (child) _SplittingBuffer: outer data dropped
2024-08-26 23:49:46,957 DEBUG: (child) Poll: C:1, E:1
2024-08-26 23:49:46,957 DEBUG: (child) Poll: C:1, E:1
2024-08-26 23:49:46,957 DEBUG: (child) Poll: C:3

And just to be clear, it didn't recover after that, right?

If it's not too much trouble, getting the output of thread apply all py-bt rather than py-list would be helpful just so I can see what the full call stack is, both on the server and bridge side if possible. I'll have to figure out how to run this locally and see about reproducing it, but that's probably not going to be easy.

I guess since each request on the server is handled in a dedicated child process, I could set up an alarm signal to ensure the process dies if it doesn't finish before the alarm goes off. It doesn't really fix the problem, but it would mean it doesn't need manual intervention...

And just to be clear, it didn't recover after that, right?

Right, it was still stuck.

If it's not too much trouble, getting the output of thread apply all py-bt rather than py-list would be helpful just so I can see what the full call stack is, both on the server and bridge side if possible. I'll have to figure out how to run this locally and see about reproducing it, but that's probably not going to be easy.

I assume you mean in the child?

Thread 1 (Thread 0x7f2e49f87740 (LWP 442756) "python3"):
Traceback (most recent call first):
  <built-in method poll of type object at remote 0x7f2e473c2d20>
  File "/usr/share/sigul/double_tls.py", line 89, in _nspr_poll
    res = nss.io.Socket.poll(flat, timeout)
  File "/usr/share/sigul/double_tls.py", line 176, in forward_two_way
    _nspr_poll(poll_descs, nss.io.seconds_to_interval(60 * 60))
  File "/usr/share/sigul/double_tls.py", line 815, in __child
    _ForwardingBuffer.forward_two_way(buf_1, buf_2)
  File "/usr/share/sigul/double_tls.py", line 594, in __init__
    self.__child(child_inner_pipe, child_outer_pipe)
  File "/usr/share/sigul/server.py", line 201, in __init__
    self.__client = double_tls.DoubleTLSClient(config,
  File "/usr/share/sigul/server.py", line 2718, in request_handling_child
    conn = ServersConnection(config)
  File "/usr/share/sigul/server.py", line 2788, in main
    status = request_handling_child(config)
  File "/usr/share/sigul/server.py", line 2818, in <module>
    main()

I guess since each request on the server is handled in a dedicated child process, I could set up an alarm signal to ensure the process dies if it doesn't finish before the alarm goes off. It doesn't really fix the problem, but it would mean it doesn't need manual intervention...

yeah, it would be a bandaid, but a welcome one. ;)

I guess since each request on the server is handled in a dedicated child process, I could set up an alarm signal to ensure the process dies if it doesn't finish before the alarm goes off. It doesn't really fix the problem, but it would mean it doesn't need manual intervention...

yeah, it would be a bandaid, but a welcome one. ;)

https://pagure.io/sigul/pull-request/28 adds an alarm to bonk the request handler after an hour.

I have installed the version with the alarm patch. Will watch it to see what happens.

I think either I did something wrong or there's a logic issue...

With the patch:

2024-09-07 23:39:05,643 DEBUG: sign-rpms:signing finished, exc_info: None
2024-09-07 23:39:05,643 DEBUG: Sending final EOFs to sign-rpms:replies...
2024-09-07 23:39:05,643 DEBUG: Waiting for sign-rpms:replies...
2024-09-07 23:39:05,644 DEBUG: sign-rpms:replies finished, exc_info: None
2024-09-07 23:39:05,675 DEBUG: Request handling finished
2024-09-07 23:39:05,678 ERROR: Child died with status 0

without:

2024-09-07 23:41:25,805 DEBUG: sign-rpms:signing finished, exc_info: None                     
2024-09-07 23:41:25,805 DEBUG: Sending final EOFs to sign-rpms:replies...                     
2024-09-07 23:41:25,805 DEBUG: Waiting for sign-rpms:replies...                               
2024-09-07 23:41:25,806 DEBUG: sign-rpms:replies finished, exc_info: None                     
2024-09-07 23:41:25,808 DEBUG: Request handling finished                                      
2024-09-07 23:41:25,890 DEBUG: Waiting for a request  

ie, with the patch a normal completion is saying died with status 0 and not processing further. ;(

Woof, I really made a silly mistake. Fixed PR 28 with https://pagure.io/fork/jcline/sigul/c/fc8c81fe87e1c65fe6b021dfe948722d6c44c01a which replaced the if with elif which should fix that.

Finally rolled out this... lets see how it does. :)

BTW, this still happens... but not sure it's worth more digging rather than just replacing things with the re-write.

Metadata