Comment 22 for bug 1799298

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to nova (stable/queens)

Reviewed: https://review.opendev.org/c/openstack/nova/+/761814
Committed: https://opendev.org/openstack/nova/commit/c1de4fb13e4c7d220ff2e42f24f06b4bbe53521f
Submitter: "Zuul (22348)"
Branch: stable/queens

commit c1de4fb13e4c7d220ff2e42f24f06b4bbe53521f
Author: melanie witt <email address hidden>
Date: Tue Oct 20 21:46:13 2020 +0000

    Use subqueryload() instead of joinedload() for (system_)metadata

    Currently, when we "get" a single instance from the database and we
    load metadata and system_metadata, we do so using a joinedload() which
    does JOINs with the respective tables. Because of the one-to-many
    relationship between an instance and (system_)metadata records, doing
    the database query this way can result in a large number of additional
    rows being returned unnecessarily and cause a large data transfer.

    This is similar to the problem addressed by change
    I0610fb16ccce2ee95c318589c8abcc30613a3fe9 which added separate queries
    for (system_)metadata when we "get" multiple instances. We don't,
    however, reuse the same code for this change because
    _instances_fill_metadata converts the instance database object to a
    dict, and some callers of _instance_get_by_uuid need to be able to
    access an instance database object attached to the session (example:
    instance_update_and_get_original).

    By using subqueryload() [1], we can perform the additional queries for
    (system_)metadata to solve the problem with a similar approach.

    Closes-Bug: #1799298

    [1] https://docs.sqlalchemy.org/en/13/orm/loading_relationships.html#subquery-eager-loading

    Change-Id: I5c071f70f669966e9807b38e99077c1cae5b4606
    (cherry picked from commit e728fe668a6de886455f2dbaf655c8a151462c8c)
    (cherry picked from commit 63d2e62c3a223f883ca810f4c66a2a236cf3d483)
    (cherry picked from commit e7a45e0335e4cf44fec7f7b8d2505f5b95445cf9)
    (cherry picked from commit 4350074029ffbc03ab238c442ec86fab6560e365)
    (cherry picked from commit ad7e4fb8f4ea6c458af00ec7aa0b321dc37c097c)
    (cherry picked from commit 68f80d201310dcaf688d8437a46c8d272ead317d)