Skip to content

[Bug]: Opening Dependencies causes the application to become unresponsive in version 65 #4635

Closed

Description

@latin-1

Describe the bug

This is a regression in version 65.

Image

To Reproduce

  1. Open Bottles and create a new bottle.
  2. Open the bottle and click Dependencies.
  3. The UI becomes unresponsive for several minutes before the dependency list is displayed.

Package

Flatpak from Flathub

Distribution

Fedora 44

Debugging Information

Official Package: true
Version: '65.0'
DE/WM: gnome
Display:
    X.org: true
    X.org (port): :0
    Wayland: true
Graphics:
    vendors:
        intel:
            vendor: intel
            envs:
                DRI_PRIME: '1'
            icd: /usr/share/vulkan/icd.d/intel_icd.x86_64.json:/usr/share/vulkan/icd.d/intel_hasvk_icd.x86_64.json:/usr/lib/x86_64-linux-gnu/GL/vulkan/icd.d/intel_icd.x86_64.json:/usr/lib/x86_64-linux-gnu/GL/vulkan/icd.d/intel_hasvk_icd.x86_64.json:/usr/lib/i386-linux-gnu/GL/vulkan/icd.d/intel_icd.i686.json:/usr/lib/i386-linux-gnu/GL/vulkan/icd.d/intel_hasvk_icd.i686.json
    prime:
        integrated: null
        discrete: null
    Vulkan: true
Kernel:
    Type: Linux
    Version: 7.1.5-201.os.fc44.x86_64
Disk:
    Total: 16560209920
    Free: 16560033792
RAM:
    MemTotal: 30.8GiB
    MemAvailable: 20.9GiB
Bottles_envs: null

Troubleshooting Logs

Traceback (most recent call last):
  File "/app/share/bottles/bottles/frontend/views/bottle_dependencies.py", line 238, in new_dependency
    entry = DependencyEntry(
        window=self.window,
    ...<2 lines>...
        plain=plain,
    )
  File "/app/share/bottles/bottles/frontend/widgets/dependency.py", line 66, in __init__
    self.set_title(dependency)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^
TypeError: Must be string, not tuple
Traceback (most recent call last):
  File "/app/share/bottles/bottles/frontend/views/bottle_dependencies.py", line 238, in new_dependency
    entry = DependencyEntry(
        window=self.window,
    ...<2 lines>...
        plain=plain,
    )
  File "/app/share/bottles/bottles/frontend/widgets/dependency.py", line 66, in __init__
    self.set_title(dependency)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^
TypeError: Must be string, not tuple
Traceback (most recent call last):
  File "/app/share/bottles/bottles/frontend/views/bottle_dependencies.py", line 238, in new_dependency
    entry = DependencyEntry(
        window=self.window,
    ...<2 lines>...
        plain=plain,
    )
  File "/app/share/bottles/bottles/frontend/widgets/dependency.py", line 66, in __init__
    self.set_title(dependency)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^
TypeError: Must be string, not tuple
Traceback (most recent call last):
  File "/app/share/bottles/bottles/frontend/views/bottle_dependencies.py", line 238, in new_dependency
    entry = DependencyEntry(
        window=self.window,
    ...<2 lines>...
        plain=plain,
    )
  File "/app/share/bottles/bottles/frontend/widgets/dependency.py", line 66, in __init__
    self.set_title(dependency)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^
TypeError: Must be string, not tuple
Traceback (most recent call last):
  File "/app/share/bottles/bottles/frontend/views/bottle_dependencies.py", line 238, in new_dependency
    entry = DependencyEntry(
        window=self.window,
    ...<2 lines>...
        plain=plain,
    )
  File "/app/share/bottles/bottles/frontend/widgets/dependency.py", line 66, in __init__
    self.set_title(dependency)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^
TypeError: Must be string, not tuple
Traceback (most recent call last):
  File "/app/share/bottles/bottles/frontend/views/bottle_dependencies.py", line 238, in new_dependency
    entry = DependencyEntry(
        window=self.window,
    ...<2 lines>...
        plain=plain,
    )
  File "/app/share/bottles/bottles/frontend/widgets/dependency.py", line 66, in __init__
    self.set_title(dependency)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^
TypeError: Must be string, not tuple
Traceback (most recent call last):
  File "/app/share/bottles/bottles/frontend/views/bottle_dependencies.py", line 238, in new_dependency
    entry = DependencyEntry(
        window=self.window,
    ...<2 lines>...
        plain=plain,
    )
  File "/app/share/bottles/bottles/frontend/widgets/dependency.py", line 66, in __init__
    self.set_title(dependency)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^
TypeError: Must be string, not tuple
Traceback (most recent call last):
  File "/app/share/bottles/bottles/frontend/views/bottle_dependencies.py", line 238, in new_dependency
    entry = DependencyEntry(
        window=self.window,
    ...<2 lines>...
        plain=plain,
    )
  File "/app/share/bottles/bottles/frontend/widgets/dependency.py", line 66, in __init__
    self.set_title(dependency)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^
TypeError: Must be string, not tuple
Traceback (most recent call last):
  File "/app/share/bottles/bottles/frontend/views/bottle_dependencies.py", line 238, in new_dependency
    entry = DependencyEntry(
        window=self.window,
    ...<2 lines>...
        plain=plain,
    )
  File "/app/share/bottles/bottles/frontend/widgets/dependency.py", line 66, in __init__
    self.set_title(dependency)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^
TypeError: Must be string, not tuple

Additional context

^ The logs also contain these errors, although I’m not sure whether they are related to this issue.

Activity

  1. latin-1 commented on Aug 5, 2026

    @latin-1
    ContributorAuthor

    Codex's analysis:

    Primary cause: synchronous network storm on the GTK thread

    Version 65 added cache detection to every dependency row. During row construction, DependencyEntry.__init__ does this:

    if not cached and self.config.Installed_Dependencies:
        cached = self.manager.dependency_manager.is_dependency_cached(...)

    This runs even while Bottles is online. Every normal new bottle has installed dependencies—five for “Application” and nine for “Gaming”—so the condition is true.

    The cache check then:

    1. Calls get_dependency().
    2. Downloads that dependency’s full manifest through Repo.get_manifest().
    3. Performs the request synchronously, with a 30-second timeout.
    4. Does this while rows are created through GLib.idle_add, meaning the work executes on GTK’s main loop.

    The current catalog contains 122 dependencies. A fresh Application bottle therefore triggers roughly 117 sequential manifest lookups; Gaming triggers roughly 113.

    In my checks, the catalog was valid and individual manifest requests returned HTTP 200, but took approximately 5.9, 7.1, and 6.3 seconds. At that latency, sequential row creation can take around 10–12 minutes. A degraded connection can be much worse because each request permits a 30-second timeout.

    The regression was introduced by 413a313d, the offline-cache changes included in version 65.

    Secondary confirmed bug: tuple passed as a GTK title

    The reported traceback is also real and directly explained by the code:

    That produces exactly:

    TypeError: Must be string, not tuple
    

    The issue log contains nine repetitions, which matches the nine dependencies installed by default in a Gaming bottle. This bug was introduced by 20965b35.

    Notably, this exact mistake had already been identified and fixed in PR #4045; commit 20965b35 effectively reintroduced it.

    cc @mirkobrombin

  2. mirkobrombin commented on Aug 6, 2026

    @mirkobrombin
    Member

    Thanks for the report, looks like the issue might not appear on some scenarios 🤔 btw I am fixing it

  3. added a commit that references this issue on Aug 6, 2026
    8f7e587
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions