Bug 2099185 - F37FailsToInstall: python3-uwsgidecorators
Summary: F37FailsToInstall: python3-uwsgidecorators
Keywords:
Status: CLOSED ERRATA
Alias: None
Product: Fedora
Classification: Fedora
Component: uwsgi
Version: rawhide
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Ralf Ertzinger
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard:
Depends On:
Blocks: PYTHON3.11 F37FTBFS F37FailsToInstall
TreeView+ depends on / blocked
 
Reported: 2022-06-20 09:44 UTC by Miro Hrončok
Modified: 2022-06-30 16:24 UTC (History)
5 users (show)

Fixed In Version: uwsgi-2.0.20-7.fc37
Doc Type: If docs needed, set a value
Doc Text:
Clone Of:
Environment:
Last Closed: 2022-06-30 16:24:25 UTC
Type: ---
Embargoed:


Attachments (Terms of Use)


Links
System ID Private Priority Status Summary Last Updated
Github unbit uwsgi issues 2365 0 None open Build failure with CPython main (3.11). 2022-06-27 08:30:43 UTC

Description Miro Hrončok 2022-06-20 09:44:29 UTC
Hello,

Please note that this comment was generated automatically. If you feel that this output has mistakes, please contact me via email (mhroncok).

Your package (uwsgi) Fails To Install in Fedora 37:

can't install python3-uwsgidecorators:
  - nothing provides python(abi) = 3.10 needed by python3-uwsgidecorators-2.0.20-5.fc37.x86_64
  
If you know about this problem and are planning on fixing it, please acknowledge so by setting the bug status to ASSIGNED. If you don't have time to maintain this package, consider orphaning it, so maintainers of dependent packages realize the problem.


If you don't react accordingly to the policy for FTBFS/FTI bugs (https://docs.fedoraproject.org/en-US/fesco/Fails_to_build_from_source_Fails_to_install/), your package may be orphaned in 8+ weeks.


P.S. The data was generated solely from koji buildroot, so it might be newer than the latest compose or the content on mirrors. To reproduce, use the koji/local repo only, e.g. in mock:

    $ mock -r fedora-37-x86_64 --disablerepo='*' --enablerepo=local install python3-uwsgidecorators


P.P.S. If this bug has been reported in the middle of upgrading multiple dependent packages, please consider using side tags: https://docs.fedoraproject.org/en-US/fesco/Updates_Policy/#updating-inter-dependent-packages

Thanks!

Comment 1 Miro Hrončok 2022-06-20 10:10:42 UTC
This bugzilla is likely a fallout from the Python 3.11 rebuild.

If your package (or some of the dependencies it has) failed to rebuild during the Python 3.11 rebuild, they now fail to install. To fix this, packages need to be rebuilt in Rawhide.

We will slowly triage the bugzillas, but we'd appreciate your help.

If you know this is blocked by an existing reported build failure or another package not yet rebuilt with Python 3.11, please mark it as such by using the "Depends On"/"Blocks" bugzilla fields. That will help us determine what failures to prioritize.

If this is not Python 3.11 related, please remove the PYTHON3.11 blocking tracker.

Thank you and sorry for the inconvenience. Let me know if you need any help.

Comment 2 Miro Hrončok 2022-06-21 20:43:39 UTC
+ CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m64 -march=zEC12 -mtune=z13 -fasynchronous-unwind-tables -fstack-clash-protection -Wno-unused-but-set-variable'
+ /usr/bin/python3 uwsgiconfig.py --verbose --plugin plugins/python fedora python3
plugins/python/python_plugin.c: In function ‘uwsgi_python_init’:
plugins/python/python_plugin.c:238:17: warning: ‘Py_SetPythonHome’ is deprecated [-Wdeprecated-declarations]
  238 |                 Py_SetPythonHome(wpyhome);
      |                 ^~~~~~~~~~~~~~~~
In file included from /usr/include/python3.11/Python.h:94,
                 from plugins/python/uwsgi_python.h:6,
                 from plugins/python/python_plugin.c:1:
/usr/include/python3.11/pylifecycle.h:40:38: note: declared here
   40 | Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetPythonHome(const wchar_t *);
      |                                      ^~~~~~~~~~~~~~~~
plugins/python/python_plugin.c:262:9: warning: ‘Py_SetProgramName’ is deprecated [-Wdeprecated-declarations]
  262 |         Py_SetProgramName(pname);
      |         ^~~~~~~~~~~~~~~~~
/usr/include/python3.11/pylifecycle.h:37:38: note: declared here
   37 | Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *);
      |                                      ^~~~~~~~~~~~~~~~~
plugins/python/python_plugin.c: In function ‘uwsgi_python_init_apps’:
plugins/python/python_plugin.c:1142:56: error: invalid application of ‘sizeof’ to incomplete type ‘struct _frame’
 1142 |                 up.current_frame = uwsgi_malloc(sizeof(struct _frame)*uwsgi.async);
      |                                                        ^~~~~~
plugins/python/python_plugin.c: In function ‘uwsgi_python_suspend’:
plugins/python/python_plugin.c:1533:74: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘recursion_depth’; did you mean ‘recursion_limit’?
 1533 |                 up.current_recursion_depth[wsgi_req->async_id] = tstate->recursion_depth;
      |                                                                          ^~~~~~~~~~~~~~~
      |                                                                          recursion_limit
plugins/python/python_plugin.c:1534:64: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘frame’; did you mean ‘cframe’?
 1534 |                 up.current_frame[wsgi_req->async_id] = tstate->frame;
      |                                                                ^~~~~
      |                                                                cframe
plugins/python/python_plugin.c:1537:59: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘recursion_depth’; did you mean ‘recursion_limit’?
 1537 |                 up.current_main_recursion_depth = tstate->recursion_depth;
      |                                                           ^~~~~~~~~~~~~~~
      |                                                           recursion_limit
plugins/python/python_plugin.c:1538:49: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘frame’; did you mean ‘cframe’?
 1538 |                 up.current_main_frame = tstate->frame;
      |                                                 ^~~~~
      |                                                 cframe
plugins/python/python_plugin.c: In function ‘uwsgi_python_resume’:
plugins/python/python_plugin.c:1766:25: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘recursion_depth’; did you mean ‘recursion_limit’?
 1766 |                 tstate->recursion_depth = up.current_recursion_depth[wsgi_req->async_id];
      |                         ^~~~~~~~~~~~~~~
      |                         recursion_limit
plugins/python/python_plugin.c:1767:25: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘frame’; did you mean ‘cframe’?
 1767 |                 tstate->frame = up.current_frame[wsgi_req->async_id];
      |                         ^~~~~
      |                         cframe
plugins/python/python_plugin.c:1770:25: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘recursion_depth’; did you mean ‘recursion_limit’?
 1770 |                 tstate->recursion_depth = up.current_main_recursion_depth;
      |                         ^~~~~~~~~~~~~~~
      |                         recursion_limit
plugins/python/python_plugin.c:1771:25: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘frame’; did you mean ‘cframe’?
 1771 |                 tstate->frame = up.current_main_frame;
      |                         ^~~~~
      |                         cframe
plugins/python/pyutils.c: In function ‘init_pyargv’:
plugins/python/pyutils.c:391:9: warning: ‘PySys_SetArgv’ is deprecated [-Wdeprecated-declarations]
  391 |         PySys_SetArgv(up.argc, up.py_argv);
      |         ^~~~~~~~~~~~~
In file included from /usr/include/python3.11/Python.h:96,
                 from plugins/python/uwsgi_python.h:6,
                 from plugins/python/pyutils.c:1:
/usr/include/python3.11/sysmodule.h:13:38: note: declared here
   13 | Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **);
      |                                      ^~~~~~~~~~~~~
plugins/python/profiler.c: In function ‘uwsgi_python_profiler_call’:
plugins/python/profiler.c:38:56: error: invalid use of incomplete typedef ‘PyFrameObject’ {aka ‘struct _frame’}
   38 |                                 PyString_AsString(frame->f_code->co_filename),
      |                                                        ^~
plugins/python/profiler.c:40:56: error: invalid use of incomplete typedef ‘PyFrameObject’ {aka ‘struct _frame’}
   40 |                                 PyString_AsString(frame->f_code->co_name), frame->f_code->co_argcount, frame->f_code->co_stacksize);
      |                                                        ^~
plugins/python/profiler.c:40:81: error: invalid use of incomplete typedef ‘PyFrameObject’ {aka ‘struct _frame’}
   40 |                                 PyString_AsString(frame->f_code->co_name), frame->f_code->co_argcount, frame->f_code->co_stacksize);
      |                                                                                 ^~
plugins/python/profiler.c:40:109: error: invalid use of incomplete typedef ‘PyFrameObject’ {aka ‘struct _frame’}
   40 |                                 PyString_AsString(frame->f_code->co_name), frame->f_code->co_argcount, frame->f_code->co_stacksize);
      |                                                                                                             ^~
plugins/python/profiler.c:48:56: error: invalid use of incomplete typedef ‘PyFrameObject’ {aka ‘struct _frame’}
   48 |                                 PyString_AsString(frame->f_code->co_filename),
      |                                                        ^~
plugins/python/profiler.c:50:63: error: invalid use of incomplete typedef ‘PyFrameObject’ {aka ‘struct _frame’}
   50 |                                 PyEval_GetFuncName(arg), frame->f_code->co_argcount, frame->f_code->co_stacksize);
      |                                                               ^~
plugins/python/profiler.c:50:91: error: invalid use of incomplete typedef ‘PyFrameObject’ {aka ‘struct _frame’}
   50 |                                 PyEval_GetFuncName(arg), frame->f_code->co_argcount, frame->f_code->co_stacksize);
      |                                                                                           ^~
plugins/python/profiler.c: In function ‘uwsgi_python_tracer’:
plugins/python/profiler.c:71:140: error: invalid use of incomplete typedef ‘PyFrameObject’ {aka ‘struct _frame’}
   71 |                 uwsgi_log("[uWSGI Python profiler %llu] file %s line %d: %s argc:%d\n", (unsigned long long)delta,  PyString_AsString(frame->f_code->co_filename), PyFrame_GetLineNumber(frame), PyString_AsString(frame->f_code->co_name), frame->f_code->co_argcount);
      |                                                                                                                                            ^~
plugins/python/profiler.c:71:217: error: invalid use of incomplete typedef ‘PyFrameObject’ {aka ‘struct _frame’}
   71 |                 uwsgi_log("[uWSGI Python profiler %llu] file %s line %d: %s argc:%d\n", (unsigned long long)delta,  PyString_AsString(frame->f_code->co_filename), PyFrame_GetLineNumber(frame), PyString_AsString(frame->f_code->co_name), frame->f_code->co_argcount);
      |                                                                                                                                                                                                                         ^~
plugins/python/profiler.c:71:242: error: invalid use of incomplete typedef ‘PyFrameObject’ {aka ‘struct _frame’}
   71 |                 uwsgi_log("[uWSGI Python profiler %llu] file %s line %d: %s argc:%d\n", (unsigned long long)delta,  PyString_AsString(frame->f_code->co_filename), PyFrame_GetLineNumber(frame), PyString_AsString(frame->f_code->co_name), frame->f_code->co_argcount);
      |                                                                                                                                                                                                                                                  ^~



See https://docs.python.org/3.11/whatsnew/3.11.html and search for PyThreadState:

Changes of the PyThreadState structure members:

    frame: removed, use PyThreadState_GetFrame() (function added to Python 3.9 by bpo-40429). Warning: the function returns a strong reference, need to call Py_XDECREF().

    tracing: changed, use PyThreadState_EnterTracing() and PyThreadState_LeaveTracing() (functions added to Python 3.11 by bpo-43760).

    recursion_depth: removed, use (tstate->recursion_limit - tstate->recursion_remaining) instead.

    stackcheck_counter: removed.

Code defining PyThreadState_GetFrame() on Python 3.8 and older:

#if PY_VERSION_HEX < 0x030900B1
static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
{
    Py_XINCREF(tstate->frame);
    return tstate->frame;
}
#endif

Code defining PyThreadState_EnterTracing() and PyThreadState_LeaveTracing() on Python 3.10 and older:

#if PY_VERSION_HEX < 0x030B00A2
static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
{
    tstate->tracing++;
#if PY_VERSION_HEX >= 0x030A00A1
    tstate->cframe->use_tracing = 0;
#else
    tstate->use_tracing = 0;
#endif
}

static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
{
    int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
    tstate->tracing--;
#if PY_VERSION_HEX >= 0x030A00A1
    tstate->cframe->use_tracing = use_tracing;
#else
    tstate->use_tracing = use_tracing;
#endif
}
#endif

Or use the pythoncapi_compat project to get these functions on old Python functions.

Comment 3 Ralf Ertzinger 2022-06-24 16:36:28 UTC
I have to admit I'm a bit at a loss on how to deal with this, due to a lack of knowledge of python and uwsgi internals.

uwsgi, to support a high level async mode (https://uwsgi-docs.readthedocs.io/en/latest/Async.html) messes with the PyThreadState struct by not just reading the now deprecated frame pointer, but also writing it.

The code for this is here https://github.com/unbit/uwsgi/blob/master/plugins/python/python_plugin.c#L1643 and here https://github.com/unbit/uwsgi/blob/master/plugins/python/python_plugin.c#L1876

Ideas on how to do this "properly" would be much appreciated. In the worst case I guess I could just patch out async mode completely, but that is really not what I'd like to do.

Comment 4 Miro Hrončok 2022-06-24 17:22:32 UTC
Victor, could you please provide some pointers?

Comment 5 Victor Stinner 2022-06-30 10:14:42 UTC
I proposed a change upstream: https://github.com/unbit/uwsgi/pull/2453

Comment 6 Victor Stinner 2022-06-30 10:37:27 UTC
I proposed a Fedora change in Rawhide: https://src.fedoraproject.org/rpms/uwsgi/pull-request/11

Comment 7 Fedora Update System 2022-06-30 16:16:37 UTC
FEDORA-2022-a6aa1a6286 has been submitted as an update to Fedora 37. https://bodhi.fedoraproject.org/updates/FEDORA-2022-a6aa1a6286

Comment 8 Fedora Update System 2022-06-30 16:24:25 UTC
FEDORA-2022-a6aa1a6286 has been pushed to the Fedora 37 stable repository.
If problem still persists, please make note of it in this bug report.


Note You need to log in before you can comment on or make changes to this bug.