GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Potential regression in Python 3.11 (multiprocess shutdown?) · Issue #97641 · python/cpython

Potential regression in Python 3.11 (multiprocess shutdown?) #97641

New issue
Copy link
New issue
Copy link
Closed as not planned
Closed as not planned
Potential regression in Python 3.11 (multiprocess shutdown?)#97641
Copy link
Assignees
erlend-aasland
Labels
3.11only security fixesonly security fixes3.12only security fixesonly security fixesOS-windowsextension-modulesC modules in the Modules dirC modules in the Modules dirtopic-sqlite3

Description

@carltongibson
carltongibson
opened on Sep 29, 2022
Issue body actions

Running the Django test suite against the Python 3.11 pre-releases, we have hit
a potential regression.

Steps to reproduce

git clone https://github.com/django/django.git
python3.11 -m venv env
.\env\Scripts\Activate.ps1
python -m pip install -e django
cd django\tests
python runtests.py --parallel

Bug report

On Python 3.8, 3.9, and 3.10 this runs without problem.

On Python 3.11 the following error in seen after the test suite completes,
during shutdown:

Traceback (most recent call last):
  File "C:\Users\carlt\src\django\tests\runtests.py", line 773, in <module>
    failures = django_tests(
               ^^^^^^^^^^^^^
  File "C:\Users\carlt\src\django\tests\runtests.py", line 432, in django_tests
    failures = test_runner.run_tests(test_labels)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\carlt\src\django\django\test\runner.py", line 1057, in run_tests
    self.teardown_databases(old_config)
  File "C:\Users\carlt\src\django\django\test\runner.py", line 980, in teardown_databases
    _teardown_databases(
  File "C:\Users\carlt\src\django\django\test\utils.py", line 378, in teardown_databases
    connection.creation.destroy_test_db(
  File "C:\Users\carlt\src\django\django\db\backends\base\creation.py", line 307, in destroy_test_db
    self._destroy_test_db(test_database_name, verbosity)
  File "C:\Users\carlt\src\django\django\db\backends\sqlite3\creation.py", line 111, in _destroy_test_db
    os.remove(test_database_name)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'other_1.sqlite3'

This looked similar to us to open issue #95027 but we were asked to report it
separately.

I've tested all the way back to a1 where (along with other issues now resolved)
this error still occurs:

(django-py311) PS C:\Users\carlt\src\django\tests> python --version
Python 3.11.0rc2
...
(django-py311) PS C:\Users\carlt\src\django\tests> python --version
Python 3.11.0a1

This is somewhat frustrating as we've tried to test on all platforms since the
first releases.
Our test suite would only run on Windows with Python 3.11 very recently as
there was a third-party dependency that was not compatible with Windows. We
will try to adjust to test without dependencies as well on Windows for future
versions. (Sorry about that.)

Please do let us know if we can provide further info. I imagine though the
easiest thing is for you to run this yourself.

Thanks.

//cc @felixxm

Your environment

  • CPython versions tested on: 3.11 pre-releases from a1 to rc2.
  • Operating system and architecture: Windows 11.
Reacted by Mariusz Felisiak, Oleg Iarygin and skshetry

Activity

Next
  1. carltongibson
    added
    type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
    on Sep 29, 2022
  2. sobolevn commented on Sep 29, 2022

    @sobolevn
    sobolevn
    on Sep 29, 2022
    Member
    More actions

    Based on C:\Users\carlt\src\django\django\db\backends\sqlite3\creation.py I think it might be sqlite related 🤔

  3. sobolevn
    added
    topic-sqlite3
    on Sep 29, 2022
  4. mdboom
    added
    3.11only security fixesonly security fixes
    on Sep 29, 2022
  5. corona10 commented on Oct 2, 2022

    @corona10
    corona10
    on Oct 2, 2022
    Member
    More actions

    cc @erlend-aasland

    Reacted by Erlend E. Aasland
  6. erlend-aasland commented on Oct 3, 2022

    @erlend-aasland
    erlend-aasland
    on Oct 3, 2022
    Contributor
    More actions

    I don't have access to a PC with Windows 11, so unfortunately I am unable debug this :( If someone with Windows 11 could do a bisect, that would be super helpful.

    A lot of changes happened between 3.10 entered the beta phase and the first 3.11 alpha was released:

    $ git log --oneline --until=2021-10-05 --since=2021-05-03 Modules/_sqlite | wc -l
    56
  7. carltongibson commented on Oct 4, 2022

    @carltongibson
    carltongibson
    on Oct 4, 2022
    ContributorAuthor
    More actions

    If someone with Windows 11 could do a bisect, that would be super helpful.

    Hi @erlend-aasland I've given this a try but I'm hitting various (A, for earlier commits) tool-chain and (B, for later commits) linker errors trying to build previous versions that (frankly) I'm not familiar enough with Windows, or building CPython for that matter, to be able to progress with in a reasonable timeframe.

    I was able to reproduce the issue at 0474d06, but I'm getting build errors by a3c11ce. A Windows expert would likely have more success.

    (Sorry to not be of more help. Hopefully I'm a few steps along the road for the future.)

  8. carltongibson commented on Oct 4, 2022

    @carltongibson
    carltongibson
    on Oct 4, 2022
    ContributorAuthor
    More actions

    If someone with Windows 11 could do a bisect, that would be super helpful.

    Hi @erlend-aasland I've given this a try but I'm hitting various (A, for earlier commits) tool-chain and (B, for later commits) linker errors trying to build previous versions that I'm not familiar enough with Windows, or building CPython for that matter, to be able to progress with in a reasonable timeframe.

    I was able to reproduce the issue at 0474d06, but I'm getting build errors by a3c11ce. A Windows expert would likely have more success.

    I'm happy to keep trying, but I've reached a bit of a roadblock with building Python failing

    (Sorry to not be of more help. Hopefully I'm a few steps along the road for the future.)

    Reacted by Erlend E. Aasland
  9. felixxm commented on Oct 5, 2022

    @felixxm
    felixxm
    on Oct 5, 2022
    Contributor
    More actions

    Can someone add OS-Windows label? 🪟

    Reacted by sobolevn
  10. sobolevn
    added
    OS-windows
    on Oct 5, 2022
  11. felixxm commented on Oct 5, 2022

    @felixxm
    felixxm
    on Oct 5, 2022
    Contributor
    More actions

    I'm not sure if it's related 🤔 but after forcing spawn on Linux, I'm getting:

    Exception ignored in: <function Pool.__del__ at 0x7f5548c9d580>
    Traceback (most recent call last):
      File "/usr/local/lib/python3.11/multiprocessing/pool.py", line 268, in __del__
    ResourceWarning: unclosed running multiprocessing pool <multiprocessing.pool.Pool state=RUN pool_size=8>
    
    /usr/local/lib/python3.11/multiprocessing/resource_tracker.py:224: UserWarning: resource_tracker: There appear to be 1 leaked semaphore objects to clean up at shutdown
      warnings.warn('resource_tracker: There appear to be %d '
    
  12. tkanhe commented on Oct 5, 2022

    @tkanhe
    tkanhe
    on Oct 5, 2022
    More actions

    Just checked on following PC specifications:
    Edition: Windows 11 Home Single Language
    Version: 21H2
    OS build: 22000.1042

    with Python 3.11.0rc2, Django-4.2.dev20221005120449

    Output:

    `PS C:\Users\TK\Desktop> cd django\testsPS C:\Users\TK\Desktop\django\tests> python runtests.py --parallel
    Testing against Django installed in 'C:\Users\TK\Desktop\django\django' with up to 16 processes
    Found 16023 test(s).
    Creating test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Cloning test database for alias 'default'...
    Creating test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    Cloning test database for alias 'other'...
    System check identified no issues (17 silenced).
    ssssssssssssssssssssssssssssssssssssssssssssss.................................................................ss.........s.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................s..............................................s..................................................................................................................s.....................s.....sss..ss.....................................................................................................................................................................................................................................................................................................................................................................................................s.....................................................................................................................................................................................s.................................................................s................sss...s.ss.....s..ss.sss..s......ss.s.................s........s.....................ss.....................s..s....s...s.....................s..............s......s...s...ss............s.....................

    Ran 16021 tests in 74.720s

    OK (skipped=1828, expected failures=5)
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'default'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...
    Destroying test database for alias 'other'...`

    *truncked some of .......sss........ output.

    Let me know any other info/tests needed; I will be happy to help in the future regarding testing on Windows 11.

  13. stic commented on Oct 5, 2022

    @stic
    stic
    on Oct 5, 2022
    More actions

    Couldn't replicate on auto (16 cores laptop).
    python runtests.py --parallel
    Bumping it up to ~40 started hitting the sharing violation on the removal of the 'other_1.sqlite3' (weirdly only the 1st i.e. other_1).
    python runtests.py --parallel 40

    So confirmed on latest 3.11.0rc2.

    I've disabled Windows Defender on the folder under test (django) as well as %TEMP% to make sure Windows Defender it's not causing issues. That's due to fact that I've got quite a few issues with pickling (i.e. cleaning after that) e.g.

      File "c:\users\<username>\AppData\Local\Programs\Python\Python311\Lib\shutil.py", line 623, in _rmtree_unsafe
        os.rmdir(path)
    PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\<username>\\AppData\\Local\\Temp\\django_jpnyol3z\\django_16co2dfg\\tmpcaxkg2x2\\test_project'
    

    Not 100% sure if that's a good troubleshooting approach, but a few observations:
    Pass that passes manages to call CloseFile from the first process, that is the process creating the other_1.sqlite3 and it's the same process that will try to delete the db file (clean-up). Crashing test run doesn't make such CloseFile call, last syscalls seen on system level are to unlock the file. In itself that shouldn't be a problem I guess (as it's the same PID trying to close / remove the file later on). However, there is quite a gap (up to 2sec on my box) between syscalls to unlock the file and close. Can't really figure it out yet (first time with Django test suit), but if you compare vs. a run on 3.10 there is a visible wait whilst: Creating test database for alias 'other'...
    Working theory - we are coming back on the same PID (process) to clean-up a file, that we are still keeping open (for close operation) elsewhere?

  14. erlend-aasland commented on Oct 10, 2022

    @erlend-aasland
    erlend-aasland
    on Oct 10, 2022
    Contributor
    More actions

    FTR, I'm in the process of installing a Windows 11 development environment now. Will hopefully be up and running by this evening, or at least tomorrow. I'll need to delve into how to debug CPython on Windows using Visual Studio, since I have little experience with both Windows and Visual Studio.

    Reacted by Mariusz Felisiak and Oleg Iarygin
  15. erlend-aasland commented on Oct 10, 2022

    @erlend-aasland
    erlend-aasland
    on Oct 10, 2022
    Contributor
    More actions

    cc. release-manager @pablogsal

  16. 17 remaining items

  17. erlend-aasland commented on Oct 28, 2022

    @erlend-aasland
    erlend-aasland
    on Oct 28, 2022
    Contributor
    More actions

    From what I can tell, the old implementation avoids the circular reference by manually decrementing the reference count of the connection object

    True, it used that hack. Part of my motivation for getting rid of the (duplicate) LRU cache implementation in the _sqlite extension module was getting rid of this hack.

    I suppose you could have kept the statement cache type as a skeleton that uses an lru_cache.

    That would have been possible, but you'd keep the GC hack. I'm not sure that is a very good idea.

  18. skshetry
    added 3 commits that reference this issue on Nov 10, 2022

    tests: garbage collect sqlite connections on Windows + Python 3.11

    4c3f8c9

    tests: garbage collect sqlite connections on Windows + Python 3.11

    288a23a

    tests: garbage collect sqlite connections on Windows + Python 3.11

    65f61ac
  19. altendky
    added a commit that references this issue on Feb 4, 2023

    gc.collect() before unlinking the db in some tests

    afa0472
  20. wallentx
    added a commit that references this issue on Feb 4, 2023

    gc.collect() before unlinking the db in some tests (#14491)

    649e5ac
  21. altendky
    added a commit that references this issue on Feb 28, 2023

    gc.collect() before unlinking the db in some tests (more)

    82b8c2c
  22. wallentx
    added a commit that references this issue on Feb 28, 2023

    gc.collect() before unlinking the db in some tests (more) (#14702)

    12ddc92
  23. drnlm
    added a commit that references this issue on Jul 31, 2023

    Add explicit connection cleanup

    78027af
  24. erlend-aasland commented on Aug 17, 2023

    @erlend-aasland
    erlend-aasland
    on Aug 17, 2023
    Contributor
    More actions

    I was able to fix this by adding an explicit connection close() (see django/django#16225). A similar issue occurred in sqlite-utils, see simonw/sqlite-utils#503. I'm not sure why it started showing up in Python 3.11 but I don't mind closing the issue.

    Following gh-108015, sqlite3 will now emit a ResourceWarning if connection objects are closed implicitly. Explicit resource management is recommended. cc. @eryksun

  25. erlend-aasland commented on Aug 22, 2023

    @erlend-aasland
    erlend-aasland
    on Aug 22, 2023
    Contributor
    More actions

    gh-108015 has now landed; Python 3.13 will emit a ResourceWarning if a connection object is closed implicitly. Explicit resource management is now recommended. @felixxm has reported that Django already started to clean up their test suite (django/django#17178).

    It seems to me the problems mentioned in this issue can all be handled by improved resource management. Suggesting to close this.

    Reacted by Mariusz Felisiak
  26. erlend-aasland
    added
    pendingThe issue will be closed if no feedback is providedThe issue will be closed if no feedback is provided
    on Aug 22, 2023
  27. erlend-aasland commented on Jan 12, 2024

    @erlend-aasland
    erlend-aasland
    on Jan 12, 2024
    Contributor
    More actions

    Closing as per #97641 (comment).

  28. erlend-aasland
    closed this as not plannedon Jan 12, 2024
  29. erlend-aasland
    removed
    pendingThe issue will be closed if no feedback is providedThe issue will be closed if no feedback is provided
    on Jan 12, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

  • @erlend-aasland
    erlend-aasland

Labels

3.11only security fixesonly security fixes3.12only security fixesonly security fixesOS-windowsextension-modulesC modules in the Modules dirC modules in the Modules dirtopic-sqlite3

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    You are visitor 01402503 — GeezerVison does not store the pages you look up.
    Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.