Comment 20 for bug 1799298

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

Reviewed: https://review.opendev.org/c/openstack/nova/+/761813
Committed: https://opendev.org/openstack/nova/commit/68f80d201310dcaf688d8437a46c8d272ead317d
Submitter: "Zuul (22348)"
Branch: stable/rocky

commit 68f80d201310dcaf688d8437a46c8d272ead317d
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)