[Bug 2015286] Re: update-manager unusable due to TimeoutError in uaclient

Grant Orndorff 2015286 at bugs.launchpad.net
Wed May 31 17:52:54 UTC 2023


** Description changed:

- On a fairly standard installation of lunar (ie no Ubuntu Pro linked
- etc), the update-manager can become a non-functional window when
- uaclient isn't behaving. This manifests itself in a greyed-out 'checking
- for updates' window which doesn't respond to any clicks and can only be
- closed by ending the process in the system-monitor.
+ [ Impact ] 
+ `pro api u.pro.packages.updates.v1` was making a network request to contracts.canonical.com to check for an updated list of available services. This could occasionally timeout or fail, causing issues for any program relying on it. The network request itself is unnecessary for the functionality of that api call, so the fix is to not make the network request anymore.
+ 
+ [ Test Plan ]
+ Recreate the bug:
+ In a container
+ ```
+ truncate -s 0 /var/log/ubuntu-advantage.log
+ pro api u.pro.packages.updates.v1
+ cat /var/log/ubuntu-advantage.log
+ # See logs about network requests
+ ```
+ To see the fix, install the new version (currently in staging PPA, but for SRU verification it will be in -proposed) and try again
+ ```
+ add-apt-repository ppa:ua-client/staging
+ apt install ubuntu-advantage-tools
+ truncate -s 0 /var/log/ubuntu-advantage.log
+ pro api u.pro.packages.updates.v1
+ cat /var/log/ubuntu-advantage.log
+ # No logs about network requests
+ ```
+ 
+ [ Where problems could occur ] 
+ This involves a refactor to the implementation of this API function. If there was an error, it could bubble up to any callers of the function.
+ 
+ [ Original Description ]
+ On a fairly standard installation of lunar (ie no Ubuntu Pro linked etc), the update-manager can become a non-functional window when uaclient isn't behaving. This manifests itself in a greyed-out 'checking for updates' window which doesn't respond to any clicks and can only be closed by ending the process in the system-monitor.
  
  Traceback (most recent call last):
-   File "/usr/lib/python3/dist-packages/UpdateManager/backend/InstallBackendAptdaemon.py", line 529, in _on_finished
-     self._action_done(
-   File "/usr/lib/python3/dist-packages/UpdateManager/backend/__init__.py", line 414, in _action_done
-     self.window_main.start_available()
-   File "/usr/lib/python3/dist-packages/UpdateManager/UpdateManager.py", line 244, in start_available
-     self.refresh_cache()
-   File "/usr/lib/python3/dist-packages/UpdateManager/UpdateManager.py", line 456, in refresh_cache
-     self._get_ua_security_status()
-   File "/usr/lib/python3/dist-packages/UpdateManager/UpdateManager.py", line 280, in _get_ua_security_status
-     update_result = updates()
-                     ^^^^^^^^^
-   File "/usr/lib/python3/dist-packages/uaclient/api/u/pro/packages/updates/v1.py", line 84, in updates
-     return _updates(UAConfig())
-            ^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3/dist-packages/uaclient/api/u/pro/packages/updates/v1.py", line 88, in _updates
-     ua_info = get_ua_info(cfg)
-               ^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3/dist-packages/uaclient/security_status.py", line 195, in get_ua_info
-     status_dict = status(cfg=cfg, show_all=True)
-                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3/dist-packages/uaclient/status.py", line 380, in status
-     response = _unattached_status(cfg)
-                ^^^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3/dist-packages/uaclient/status.py", line 246, in _unattached_status
-     resources = get_available_resources(cfg)
-                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3/dist-packages/uaclient/contract.py", line 624, in get_available_resources
-     resources = client.request_resources()
-                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3/dist-packages/uaclient/contract.py", line 71, in request_resources
-     resource_response, headers = self.request_url(
-                                  ^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3/dist-packages/uaclient/serviceclient.py", line 73, in request_url
-     response, headers = util.readurl(
-                         ^^^^^^^^^^^^^
-   File "/usr/lib/python3/dist-packages/uaclient/util.py", line 322, in readurl
-     resp = request.urlopen(req, timeout=timeout)
-            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3.11/urllib/request.py", line 216, in urlopen
-     return opener.open(url, data, timeout)
-            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3.11/urllib/request.py", line 519, in open
-     response = self._open(req, data)
-                ^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3.11/urllib/request.py", line 536, in _open
-     result = self._call_chain(self.handle_open, protocol, protocol +
-              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3.11/urllib/request.py", line 496, in _call_chain
-     result = func(*args)
-              ^^^^^^^^^^^
-   File "/usr/lib/python3.11/urllib/request.py", line 1391, in https_open
-     return self.do_open(http.client.HTTPSConnection, req,
-            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3.11/urllib/request.py", line 1352, in do_open
-     r = h.getresponse()
-         ^^^^^^^^^^^^^^^
-   File "/usr/lib/python3.11/http/client.py", line 1374, in getresponse
-     response.begin()
-   File "/usr/lib/python3.11/http/client.py", line 318, in begin
-     version, status, reason = self._read_status()
-                               ^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3.11/http/client.py", line 279, in _read_status
-     line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
-                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3.11/socket.py", line 706, in readinto
-     return self._sock.recv_into(b)
-            ^^^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3.11/ssl.py", line 1278, in recv_into
-     return self.read(nbytes, buffer)
-            ^^^^^^^^^^^^^^^^^^^^^^^^^
-   File "/usr/lib/python3.11/ssl.py", line 1134, in read
-     return self._sslobj.read(len, buffer)
-            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3/dist-packages/UpdateManager/backend/InstallBackendAptdaemon.py", line 529, in _on_finished
+     self._action_done(
+   File "/usr/lib/python3/dist-packages/UpdateManager/backend/__init__.py", line 414, in _action_done
+     self.window_main.start_available()
+   File "/usr/lib/python3/dist-packages/UpdateManager/UpdateManager.py", line 244, in start_available
+     self.refresh_cache()
+   File "/usr/lib/python3/dist-packages/UpdateManager/UpdateManager.py", line 456, in refresh_cache
+     self._get_ua_security_status()
+   File "/usr/lib/python3/dist-packages/UpdateManager/UpdateManager.py", line 280, in _get_ua_security_status
+     update_result = updates()
+                     ^^^^^^^^^
+   File "/usr/lib/python3/dist-packages/uaclient/api/u/pro/packages/updates/v1.py", line 84, in updates
+     return _updates(UAConfig())
+            ^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3/dist-packages/uaclient/api/u/pro/packages/updates/v1.py", line 88, in _updates
+     ua_info = get_ua_info(cfg)
+               ^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3/dist-packages/uaclient/security_status.py", line 195, in get_ua_info
+     status_dict = status(cfg=cfg, show_all=True)
+                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3/dist-packages/uaclient/status.py", line 380, in status
+     response = _unattached_status(cfg)
+                ^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3/dist-packages/uaclient/status.py", line 246, in _unattached_status
+     resources = get_available_resources(cfg)
+                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3/dist-packages/uaclient/contract.py", line 624, in get_available_resources
+     resources = client.request_resources()
+                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3/dist-packages/uaclient/contract.py", line 71, in request_resources
+     resource_response, headers = self.request_url(
+                                  ^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3/dist-packages/uaclient/serviceclient.py", line 73, in request_url
+     response, headers = util.readurl(
+                         ^^^^^^^^^^^^^
+   File "/usr/lib/python3/dist-packages/uaclient/util.py", line 322, in readurl
+     resp = request.urlopen(req, timeout=timeout)
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3.11/urllib/request.py", line 216, in urlopen
+     return opener.open(url, data, timeout)
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3.11/urllib/request.py", line 519, in open
+     response = self._open(req, data)
+                ^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3.11/urllib/request.py", line 536, in _open
+     result = self._call_chain(self.handle_open, protocol, protocol +
+              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3.11/urllib/request.py", line 496, in _call_chain
+     result = func(*args)
+              ^^^^^^^^^^^
+   File "/usr/lib/python3.11/urllib/request.py", line 1391, in https_open
+     return self.do_open(http.client.HTTPSConnection, req,
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3.11/urllib/request.py", line 1352, in do_open
+     r = h.getresponse()
+         ^^^^^^^^^^^^^^^
+   File "/usr/lib/python3.11/http/client.py", line 1374, in getresponse
+     response.begin()
+   File "/usr/lib/python3.11/http/client.py", line 318, in begin
+     version, status, reason = self._read_status()
+                               ^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3.11/http/client.py", line 279, in _read_status
+     line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
+                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3.11/socket.py", line 706, in readinto
+     return self._sock.recv_into(b)
+            ^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3.11/ssl.py", line 1278, in recv_into
+     return self.read(nbytes, buffer)
+            ^^^^^^^^^^^^^^^^^^^^^^^^^
+   File "/usr/lib/python3.11/ssl.py", line 1134, in read
+     return self._sslobj.read(len, buffer)
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  TimeoutError: The read operation timed out
  
  In my opinion any misbehaving of the Ubuntu Pro integration in update-
  manager (in this specific case probably a 'temporary' server issue)
  shouldn't cause update-manager to become dysfunctional, especially to
  those not subscribed to Ubuntu Pro.
  
  I have recently seen:
  - update-manager unable to install updates for over a month ( LP: #2008280 )
  - this issue,
  - if you turn wi-fi off and open update-manager, then after clicking ok the update-manager window becomes unresponsive ( LP: #2015113 )
  - and undoubtedly there are others to come as this is all without uaclient needing to do anything (ie I have no subscription and lunar is not yet released)
  
  Please consider how you might make the integration of Ubuntu Pro into
  update-manager more robust, so that any issues in uaclient don't stop
  update-manager from functioning correctly. (ie presumably using a
  try/except around the uaclient call is not unreasonable - you might
  loose track of any errors that are occurring, but keeping update-manager
  working (aka allowing people to install their system updates) is a much
  higher priority)
  
  Thanks

-- 
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to update-manager in Ubuntu.
https://bugs.launchpad.net/bugs/2015286

Title:
  update-manager unusable due to TimeoutError in uaclient

Status in ubuntu-advantage-tools package in Ubuntu:
  Triaged
Status in update-manager package in Ubuntu:
  Fix Released

Bug description:
  [ Impact ] 
  `pro api u.pro.packages.updates.v1` was making a network request to contracts.canonical.com to check for an updated list of available services. This could occasionally timeout or fail, causing issues for any program relying on it. The network request itself is unnecessary for the functionality of that api call, so the fix is to not make the network request anymore.

  [ Test Plan ]
  Recreate the bug:
  In a container
  ```
  truncate -s 0 /var/log/ubuntu-advantage.log
  pro api u.pro.packages.updates.v1
  cat /var/log/ubuntu-advantage.log
  # See logs about network requests
  ```
  To see the fix, install the new version (currently in staging PPA, but for SRU verification it will be in -proposed) and try again
  ```
  add-apt-repository ppa:ua-client/staging
  apt install ubuntu-advantage-tools
  truncate -s 0 /var/log/ubuntu-advantage.log
  pro api u.pro.packages.updates.v1
  cat /var/log/ubuntu-advantage.log
  # No logs about network requests
  ```

  [ Where problems could occur ] 
  This involves a refactor to the implementation of this API function. If there was an error, it could bubble up to any callers of the function.

  [ Original Description ]
  On a fairly standard installation of lunar (ie no Ubuntu Pro linked etc), the update-manager can become a non-functional window when uaclient isn't behaving. This manifests itself in a greyed-out 'checking for updates' window which doesn't respond to any clicks and can only be closed by ending the process in the system-monitor.

  Traceback (most recent call last):
    File "/usr/lib/python3/dist-packages/UpdateManager/backend/InstallBackendAptdaemon.py", line 529, in _on_finished
      self._action_done(
    File "/usr/lib/python3/dist-packages/UpdateManager/backend/__init__.py", line 414, in _action_done
      self.window_main.start_available()
    File "/usr/lib/python3/dist-packages/UpdateManager/UpdateManager.py", line 244, in start_available
      self.refresh_cache()
    File "/usr/lib/python3/dist-packages/UpdateManager/UpdateManager.py", line 456, in refresh_cache
      self._get_ua_security_status()
    File "/usr/lib/python3/dist-packages/UpdateManager/UpdateManager.py", line 280, in _get_ua_security_status
      update_result = updates()
                      ^^^^^^^^^
    File "/usr/lib/python3/dist-packages/uaclient/api/u/pro/packages/updates/v1.py", line 84, in updates
      return _updates(UAConfig())
             ^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3/dist-packages/uaclient/api/u/pro/packages/updates/v1.py", line 88, in _updates
      ua_info = get_ua_info(cfg)
                ^^^^^^^^^^^^^^^^
    File "/usr/lib/python3/dist-packages/uaclient/security_status.py", line 195, in get_ua_info
      status_dict = status(cfg=cfg, show_all=True)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3/dist-packages/uaclient/status.py", line 380, in status
      response = _unattached_status(cfg)
                 ^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3/dist-packages/uaclient/status.py", line 246, in _unattached_status
      resources = get_available_resources(cfg)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3/dist-packages/uaclient/contract.py", line 624, in get_available_resources
      resources = client.request_resources()
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3/dist-packages/uaclient/contract.py", line 71, in request_resources
      resource_response, headers = self.request_url(
                                   ^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3/dist-packages/uaclient/serviceclient.py", line 73, in request_url
      response, headers = util.readurl(
                          ^^^^^^^^^^^^^
    File "/usr/lib/python3/dist-packages/uaclient/util.py", line 322, in readurl
      resp = request.urlopen(req, timeout=timeout)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/urllib/request.py", line 216, in urlopen
      return opener.open(url, data, timeout)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/urllib/request.py", line 519, in open
      response = self._open(req, data)
                 ^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/urllib/request.py", line 536, in _open
      result = self._call_chain(self.handle_open, protocol, protocol +
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/urllib/request.py", line 496, in _call_chain
      result = func(*args)
               ^^^^^^^^^^^
    File "/usr/lib/python3.11/urllib/request.py", line 1391, in https_open
      return self.do_open(http.client.HTTPSConnection, req,
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/urllib/request.py", line 1352, in do_open
      r = h.getresponse()
          ^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/http/client.py", line 1374, in getresponse
      response.begin()
    File "/usr/lib/python3.11/http/client.py", line 318, in begin
      version, status, reason = self._read_status()
                                ^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/http/client.py", line 279, in _read_status
      line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/socket.py", line 706, in readinto
      return self._sock.recv_into(b)
             ^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/ssl.py", line 1278, in recv_into
      return self.read(nbytes, buffer)
             ^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/ssl.py", line 1134, in read
      return self._sslobj.read(len, buffer)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  TimeoutError: The read operation timed out

  In my opinion any misbehaving of the Ubuntu Pro integration in update-
  manager (in this specific case probably a 'temporary' server issue)
  shouldn't cause update-manager to become dysfunctional, especially to
  those not subscribed to Ubuntu Pro.

  I have recently seen:
  - update-manager unable to install updates for over a month ( LP: #2008280 )
  - this issue,
  - if you turn wi-fi off and open update-manager, then after clicking ok the update-manager window becomes unresponsive ( LP: #2015113 )
  - and undoubtedly there are others to come as this is all without uaclient needing to do anything (ie I have no subscription and lunar is not yet released)

  Please consider how you might make the integration of Ubuntu Pro into
  update-manager more robust, so that any issues in uaclient don't stop
  update-manager from functioning correctly. (ie presumably using a
  try/except around the uaclient call is not unreasonable - you might
  loose track of any errors that are occurring, but keeping update-
  manager working (aka allowing people to install their system updates)
  is a much higher priority)

  Thanks

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/ubuntu-advantage-tools/+bug/2015286/+subscriptions




More information about the foundations-bugs mailing list