Add reproducer for bug #1881455

The 'nova.compute.manager._reschedule_resize_or_reraise' function can
end up calling 'from_exc_and_traceback' class method of the
'ExecutionPayload' versioned notification object via the following call
stack:

  nova.compute.manager._reschedule_resize_or_reraise
    nova.compute.utils.notify_about_instance_action
      nova.compute._get_fault_and_priority_from_exc_and_tb
        nova.notification.objects.exception.ExceptionPayload.from_exc_and_traceback

The 'from_exc_and_traceback' class method uses 'inspect.trace()' to get
more information about the provided execution in order to report
information such as module and function name of the function raising the
exception in the notification. 'inspect.trace()' must be called inside
the context of an exception handler otherwise it returns an empty list.
However, we are using '_reschedule_resize_or_reraise' to re-raise a
previously raised and captured exception, which means we're not
executing from such a context. This results in the following warning:

  IndexError: list index out of range

A future change will resolve this but for now, prove the issue.

Change-Id: I5baaa698c2627a3438eb1d9990eb8091f37253ca
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
Related-Bug: #1881455
This commit is contained in:
Stephen Finucane 2020-06-04 12:10:09 +01:00
parent 5c485399e0
commit 03b00ae02f
1 changed files with 61 additions and 0 deletions

View File

@ -0,0 +1,61 @@
# Copyright 2020 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import sys
import traceback
import unittest
from nova.notifications.objects import exception
from nova import test
class TestExceptionPayload(test.NoDBTestCase):
# Failing due to bug #1881455
@unittest.expectedFailure
def test_from_exc_and_traceback(self):
try:
raise Exception('foo')
except Exception:
exc_info = sys.exc_info()
tb = traceback.format_exc()
payload = exception.ExceptionPayload.from_exc_and_traceback(
exc_info[1], tb)
self.assertEqual(
'nova.tests.unit.notifications.objects.test_exception',
payload.module_name,
)
self.assertEqual(
'test_from_exc_and_traceback', payload.function_name)
self.assertEqual('foo', payload.exception_message)
def test_from_exc_and_traceback_nested(self):
try:
raise Exception('foo')
except Exception:
exc_info = sys.exc_info()
tb = traceback.format_exc()
payload = exception.ExceptionPayload.from_exc_and_traceback(
exc_info[1], tb)
self.assertEqual(
'nova.tests.unit.notifications.objects.test_exception',
payload.module_name,
)
self.assertEqual(
'test_from_exc_and_traceback_nested', payload.function_name)
self.assertEqual('foo', payload.exception_message)