[Bug 1977320] Re: libcloud: autopkgtest is flaky due to racy "test_retry_*" tests

Nick Rosbrook 1977320 at bugs.launchpad.net
Fri Jun 3 16:01:41 UTC 2022


** Patch added: "libcloud-lp-1977320-v2.debdiff"
   https://bugs.launchpad.net/ubuntu/+source/libcloud/+bug/1977320/+attachment/5594714/+files/libcloud-lp-1977320-v2.debdiff

-- 
You received this bug notification because you are a member of Ubuntu
Sponsors Team, which is subscribed to the bug report.
https://bugs.launchpad.net/bugs/1977320

Title:
  libcloud: autopkgtest is flaky due to racy "test_retry_*" tests

Status in libcloud package in Ubuntu:
  In Progress

Bug description:
  This issue has appeared recently on ppc64el autopkgtest [1]. The issue
  is that some of the tests from libcloud/test/test_connection.py
  incorrectly assume the mock side effects will always finish within the
  specified timeouts, which may not happen depending on the execution
  environment.

  The following autopkgtest log snippets demonstrate this:

  Take from [2]:

  =================================== FAILURES ===================================
  __ ConnectionClassTestCase.test_retry_on_all_default_retry_exception_classes ___

  self = <test.test_connection.ConnectionClassTestCase testMethod=test_retry_on_all_default_retry_exception_classes>
  mock_connect = <MagicMock name='request' id='134056393449408'>

      @patch('libcloud.common.base.Connection.request')
      def test_retry_on_all_default_retry_exception_classes(self, mock_connect):
          con = Connection()
          con.connection = Mock()
          connect_method = 'libcloud.common.base.Connection.request'
      
          self.retry_counter = 0
      
          def mock_connect_side_effect(*args, **kwargs):
              self.retry_counter += 1
      
              if self.retry_counter < len(RETRY_EXCEPTIONS):
                  raise RETRY_EXCEPTIONS[self.retry_counter]
      
              return 'success'
      
          mock_connect.__name__ = 'mock_connect'
          mock_connect.side_effect = mock_connect_side_effect
          retry_request = Retry(timeout=0.6, retry_delay=0.1,
                                  backoff=1)
  >       result = retry_request(con.request)(action='/')

  test/test_connection.py:583: 
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
  /usr/lib/python3/dist-packages/libcloud/utils/retry.py:127: in retry_loop
      raise last_exc
  /usr/lib/python3/dist-packages/libcloud/utils/retry.py:103: in retry_loop
      return transform_ssl_error(func, *args, **kwargs)
  /usr/lib/python3/dist-packages/libcloud/utils/retry.py:93: in transform_ssl_error
      raise exc
  /usr/lib/python3/dist-packages/libcloud/utils/retry.py:88: in transform_ssl_error
      return function(*args, **kwargs)
  /usr/lib/python3/dist-packages/mock/mock.py:1100: in __call__
      return _mock_self._mock_call(*args, **kwargs)
  /usr/lib/python3/dist-packages/mock/mock.py:1104: in _mock_call
      return _mock_self._execute_mock_call(*args, **kwargs)
  /usr/lib/python3/dist-packages/mock/mock.py:1167: in _execute_mock_call
      result = effect(*args, **kwargs)
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

  args = (), kwargs = {'action': '/'}

      def mock_connect_side_effect(*args, **kwargs):
          self.retry_counter += 1
      
          if self.retry_counter < len(RETRY_EXCEPTIONS):
  >           raise RETRY_EXCEPTIONS[self.retry_counter]
  E           libcloud.utils.retry.TransientSSLError: ()

  test/test_connection.py:575: TransientSSLError
  ---

  Taken from [3]:

  =================================== FAILURES ===================================
  _______________ ConnectionClassTestCase.test_retry_with_timeout ________________

  self = <test.test_connection.ConnectionClassTestCase testMethod=test_retry_with_timeout>
  mock_connect = <MagicMock name='request' id='127398439136048'>

      @patch('libcloud.common.base.Connection.request')
      def test_retry_with_timeout(self, mock_connect):
          con = Connection()
          con.connection = Mock()
      
          mock_connect.side_effect = socket.gaierror('')
          retry_request = Retry(timeout=0.2, retry_delay=0.1,
                                  backoff=1)
          self.assertRaises(socket.gaierror,
                            retry_request(con.request), action='/')
      
  >       self.assertGreater(mock_connect.call_count, 1,
                              'Retry logic failed')
  E       AssertionError: 1 not greater than 1 : Retry logic failed

  test/test_connection.py:457: AssertionError
  ---

  [1] https://autopkgtest.ubuntu.com/packages/libc/libcloud/kinetic/ppc64el
  [2] https://autopkgtest.ubuntu.com/results/autopkgtest-kinetic/kinetic/ppc64el/libc/libcloud/20220528_194230_765c9@/log.gz
  [3] https://autopkgtest.ubuntu.com/results/autopkgtest-kinetic/kinetic/ppc64el/libc/libcloud/20220526_090523_a6c63@/log.gz

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/libcloud/+bug/1977320/+subscriptions




More information about the Ubuntu-sponsors mailing list