Public bug reported:

See also expired bug
https://bugs.launchpad.net/nova/+bug/1305892

Description
===========
Archiving deleted server instances results in an sqlalchemy exception. The 
table "instances" uses an sqlalchemy enum named "instances0locked_by". The 
shadow table "shadow_instances" also has an enum but uses a different type 
"shadow_instances0locked_by".

As a result moving rows from instances to shadow_instances fails.

Steps to reproduce
==================
* setup openstack with a postgresql database
* create a virtual machine (openstack server create ...)
* delete virtual machine (openstack server delete ...)
* run "nova-manage db archive_deleted_rows --max_rows 1 --all-cells --verbose"


Expected result
===============
records are archived

Actual result
=============
sqlalchemy exception

DBAPIError exception wrapped.: psycopg2.errors.DatatypeMismatch: column
"locked_by" is of type shadow_instances0locked_by but expression is of
type instances0locked_by

SQL:

INSERT INTO shadow_instances 
(created_at, updated_at, deleted_at, deleted, id, user_id, project_id, 
image_ref, kernel_id, ramdisk_id, hostname, launch_index, key_name, key_data, 
power_state, vm_state, task_state, memory_mb, vcpus, root_gb, ephemeral_gb, 
ephemeral_key_uuid, host, node, compute_id, instance_type_id, user_data, 
reservation_id, launched_at, terminated_at, availability_zone, display_name, 
display_description, launched_on, locked, locked_by, os_type, architecture, 
vm_mode, uuid, root_device_name, default_ephemeral_device, default_swap_device, 
config_drive, access_ip_v4, access_ip_v6, auto_disk_config, progress, 
shutdown_terminate, disable_terminate, cell_name, cleaned, hidden) 
SELECT instances.created_at, instances.updated_at, instances.deleted_at, 
instances.deleted, instances.id, instances.user_id, instances.project_id, 
instances.image_ref, instances.kernel_id, instances.ramdisk_id, 
instances.hostname, instances.launch_index, instances.key_name, 
instances.key_data, instances.power_state, instances.vm_state, 
instances.task_state, instances.memory_mb, instances.vcpus, instances.root_gb, 
instances.ephemeral_gb, instances.ephemeral_key_uuid, instances.host, 
instances.node, instances.compute_id, instances.instance_type_id, 
instances.user_data, instances.reservation_id, instances.launched_at, 
instances.terminated_at, instances.availability_zone, instances.display_name, 
instances.display_description, instances.launched_on, instances.locked, 
instances.locked_by, instances.os_type, instances.architecture, 
instances.vm_mode, instances.uuid, instances.root_device_name, 
instances.default_ephemeral_device, instances.default_swap_device, 
instances.config_drive, instanc
 es.access_ip_v4, instances.access_ip_v6, instances.auto_disk_config, 
instances.progress, instances.shutdown_terminate, instances.disable_terminate, 
instances.cell_name, instances.cleaned, instances.hidden 
FROM instances 
WHERE instances.id IN (%(id_1_1)s)]


Environment
===========

openstack version

python3-novaclient-18.4.0-1.el9s.noarch
python3-nova-28.0.1-1.el9s.noarch
openstack-nova-common-28.0.1-1.el9s.noarch
openstack-nova-api-28.0.1-1.el9s.noarch
openstack-nova-novncproxy-28.0.1-1.el9s.noarch
openstack-nova-scheduler-28.0.1-1.el9s.noarch
openstack-nova-conductor-28.0.1-1.el9s.noarch


postgres

postgresql-private-libs-13.14-1.el9_3.x86_64
postgresql-13.14-1.el9_3.x86_64
postgresql-server-13.14-1.el9_3.x86_64


sqlalchemy

python3-sqlalchemy-1.4.45-3.el9.x86_64


libvirt+kvm (should not matter, but for completeness) 

libvirt-client-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-common-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-config-network-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-driver-network-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-driver-nodedev-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-driver-nwfilter-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-driver-qemu-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-driver-secret-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-driver-storage-core-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-lock-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-log-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-plugin-lockd-9.5.0-7.2.el9_3.x86_64
libvirt-daemon-proxy-9.5.0-7.2.el9_3.x86_64
libvirt-libs-9.5.0-7.2.el9_3.x86_64
python3-libvirt-9.3.0-1.el9.x86_64
qemu-kvm-8.0.0-16.el9_3.3.x86_64
qemu-kvm-audio-pa-8.0.0-16.el9_3.3.x86_64
qemu-kvm-block-blkio-8.0.0-16.el9_3.3.x86_64
qemu-kvm-block-rbd-8.0.0-16.el9_3.3.x86_64
qemu-kvm-common-8.0.0-16.el9_3.3.x86_64
qemu-kvm-core-8.0.0-16.el9_3.3.x86_64
qemu-kvm-device-display-virtio-gpu-8.0.0-16.el9_3.3.x86_64
qemu-kvm-device-display-virtio-gpu-pci-8.0.0-16.el9_3.3.x86_64
qemu-kvm-device-display-virtio-vga-8.0.0-16.el9_3.3.x86_64
qemu-kvm-device-usb-host-8.0.0-16.el9_3.3.x86_64
qemu-kvm-device-usb-redirect-8.0.0-16.el9_3.3.x86_64
qemu-kvm-docs-8.0.0-16.el9_3.3.x86_64
qemu-kvm-tools-8.0.0-16.el9_3.3.x86_64
qemu-kvm-ui-egl-headless-8.0.0-16.el9_3.3.x86_64
qemu-kvm-ui-opengl-8.0.0-16.el9_3.3.x86_64


Guesswork
=========

I'm not that deep into the openstack code base. But here is my guesswork

The table is defined in nova/db/main/models.py and the locked_by column
is an sqlalchemy Enum

https://github.com/openstack/nova/blob/master/nova/db/main/models.py#L382

The alembic migration
nova/db/main/migrations/versions/8f2f1571d55b_initial_version.py is
creating a new Enum

https://github.com/openstack/nova/blame/master/nova/db/main/migrations/versions/8f2f1571d55b_initial_version.py#L88

This could probably be solved if both tables use the same Enum Type

Otherwise the insert needs an explicit typecast, something like
cast(locked_by::text as shadow_instances0locked_by)

** Affects: nova
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to OpenStack Compute (nova).
https://bugs.launchpad.net/bugs/2060184

Title:
  archive_deleted_rows postgresql locked_by enum

Status in OpenStack Compute (nova):
  New

Bug description:
  See also expired bug
  https://bugs.launchpad.net/nova/+bug/1305892

  Description
  ===========
  Archiving deleted server instances results in an sqlalchemy exception. The 
table "instances" uses an sqlalchemy enum named "instances0locked_by". The 
shadow table "shadow_instances" also has an enum but uses a different type 
"shadow_instances0locked_by".

  As a result moving rows from instances to shadow_instances fails.

  Steps to reproduce
  ==================
  * setup openstack with a postgresql database
  * create a virtual machine (openstack server create ...)
  * delete virtual machine (openstack server delete ...)
  * run "nova-manage db archive_deleted_rows --max_rows 1 --all-cells --verbose"

  
  Expected result
  ===============
  records are archived

  Actual result
  =============
  sqlalchemy exception

  DBAPIError exception wrapped.: psycopg2.errors.DatatypeMismatch:
  column "locked_by" is of type shadow_instances0locked_by but
  expression is of type instances0locked_by

  SQL:

  INSERT INTO shadow_instances 
  (created_at, updated_at, deleted_at, deleted, id, user_id, project_id, 
image_ref, kernel_id, ramdisk_id, hostname, launch_index, key_name, key_data, 
power_state, vm_state, task_state, memory_mb, vcpus, root_gb, ephemeral_gb, 
ephemeral_key_uuid, host, node, compute_id, instance_type_id, user_data, 
reservation_id, launched_at, terminated_at, availability_zone, display_name, 
display_description, launched_on, locked, locked_by, os_type, architecture, 
vm_mode, uuid, root_device_name, default_ephemeral_device, default_swap_device, 
config_drive, access_ip_v4, access_ip_v6, auto_disk_config, progress, 
shutdown_terminate, disable_terminate, cell_name, cleaned, hidden) 
  SELECT instances.created_at, instances.updated_at, instances.deleted_at, 
instances.deleted, instances.id, instances.user_id, instances.project_id, 
instances.image_ref, instances.kernel_id, instances.ramdisk_id, 
instances.hostname, instances.launch_index, instances.key_name, 
instances.key_data, instances.power_state, instances.vm_state, 
instances.task_state, instances.memory_mb, instances.vcpus, instances.root_gb, 
instances.ephemeral_gb, instances.ephemeral_key_uuid, instances.host, 
instances.node, instances.compute_id, instances.instance_type_id, 
instances.user_data, instances.reservation_id, instances.launched_at, 
instances.terminated_at, instances.availability_zone, instances.display_name, 
instances.display_description, instances.launched_on, instances.locked, 
instances.locked_by, instances.os_type, instances.architecture, 
instances.vm_mode, instances.uuid, instances.root_device_name, 
instances.default_ephemeral_device, instances.default_swap_device, 
instances.config_drive, insta
 nces.access_ip_v4, instances.access_ip_v6, instances.auto_disk_config, 
instances.progress, instances.shutdown_terminate, instances.disable_terminate, 
instances.cell_name, instances.cleaned, instances.hidden 
  FROM instances 
  WHERE instances.id IN (%(id_1_1)s)]


  Environment
  ===========

  openstack version

  python3-novaclient-18.4.0-1.el9s.noarch
  python3-nova-28.0.1-1.el9s.noarch
  openstack-nova-common-28.0.1-1.el9s.noarch
  openstack-nova-api-28.0.1-1.el9s.noarch
  openstack-nova-novncproxy-28.0.1-1.el9s.noarch
  openstack-nova-scheduler-28.0.1-1.el9s.noarch
  openstack-nova-conductor-28.0.1-1.el9s.noarch

  
  postgres

  postgresql-private-libs-13.14-1.el9_3.x86_64
  postgresql-13.14-1.el9_3.x86_64
  postgresql-server-13.14-1.el9_3.x86_64

  
  sqlalchemy

  python3-sqlalchemy-1.4.45-3.el9.x86_64

  
  libvirt+kvm (should not matter, but for completeness) 

  libvirt-client-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-common-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-config-network-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-driver-network-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-driver-nodedev-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-driver-nwfilter-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-driver-qemu-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-driver-secret-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-driver-storage-core-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-lock-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-log-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-plugin-lockd-9.5.0-7.2.el9_3.x86_64
  libvirt-daemon-proxy-9.5.0-7.2.el9_3.x86_64
  libvirt-libs-9.5.0-7.2.el9_3.x86_64
  python3-libvirt-9.3.0-1.el9.x86_64
  qemu-kvm-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-audio-pa-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-block-blkio-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-block-rbd-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-common-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-core-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-device-display-virtio-gpu-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-device-display-virtio-gpu-pci-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-device-display-virtio-vga-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-device-usb-host-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-device-usb-redirect-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-docs-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-tools-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-ui-egl-headless-8.0.0-16.el9_3.3.x86_64
  qemu-kvm-ui-opengl-8.0.0-16.el9_3.3.x86_64

  
  Guesswork
  =========

  I'm not that deep into the openstack code base. But here is my
  guesswork

  The table is defined in nova/db/main/models.py and the locked_by
  column is an sqlalchemy Enum

  https://github.com/openstack/nova/blob/master/nova/db/main/models.py#L382

  The alembic migration
  nova/db/main/migrations/versions/8f2f1571d55b_initial_version.py is
  creating a new Enum

  
https://github.com/openstack/nova/blame/master/nova/db/main/migrations/versions/8f2f1571d55b_initial_version.py#L88

  This could probably be solved if both tables use the same Enum Type

  Otherwise the insert needs an explicit typecast, something like
  cast(locked_by::text as shadow_instances0locked_by)

To manage notifications about this bug go to:
https://bugs.launchpad.net/nova/+bug/2060184/+subscriptions


-- 
Mailing list: https://launchpad.net/~yahoo-eng-team
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yahoo-eng-team
More help   : https://help.launchpad.net/ListHelp

Reply via email to