cinder/cinder/tests/unit
Gorka Eguileor 95fcb50a42 Fix quota usage duplicate entries
Our current quota system has a race condition on reservations that only
happens when we are creating new entries in the quota_usages table.

We normally lock quota_usages rows using a SELECT ... FOR UPDATE query,
but that's only effective when the entries exist, and current code just
creates them and proceeds without a lock on them.

This, together with the table not having unique constraint means that we
can get duplicated entries and we can have one entry overwriting the
data written by another request.

The quota_usages table does soft deletes, so the project_id and resource
fields are not enough for a unique constraint, so we add a new column
called race_preventer so we can have a unique constraint with the
3 fields.

Additionally we have to make sure that we acquire the locks before doing
the reservation calculations or the syncs, so once we create any missing
entries we close the session and try to get the locks again.

With these 2 changes we'll avoid duplicated entries as well as avoid
getting our quota usage out of sync right from the start.

For the unique constraint part of the code there were 2 alternatives
(one was even used in an earlier patchset):

- Create a virtual/computed column for the Table that sets it to a fixed
  value when deleted_at is NULL and to NULL in any other case, then use
  this virtual/computed column together with project_id and resource
  fields for a unique constraint.

  This change was my preferred solution, but it requires bumping the
  SQLAlchemy version to 1.3.11 where the feature was added as computed
  columns [1] and in some DB engines requires a relatively new version,
  for example for PostgreSQL is only supported on version 12 or later.

- Set deleted_at to a non NULL value by default on creation, and make
  sure our code always uses the deleted field to filter values.

  This is a bit nasty, but it has the advantage of not requiring new DB
  fields, no DB data migrations for existing entries, and easy to
  rollback once we figure out the underlying issue (although it may
  require a DB data migration on rollback if we want to leave the
  deleted_at entry at NULL).

The decision to add a new field was because one of the alternatives is
kind of hacky and the other one depends on specific DBMS versions and
requires a SQLAlchemy version bump.

[1]: https://docs.sqlalchemy.org/en/13/core/defaults.html#computed-generated-always-as-columns

Closes-Bug: #1484343
Change-Id: I9000c16c5b3e6f313f02256a10cb4bc0a26379f7
(cherry picked from commit 1fb0767d88)
2021-04-05 06:21:23 +00:00
..
api Dropping explicit unicode literal 2021-03-16 07:31:40 +00:00
attachments Add support volume local cache 2020-09-09 03:42:50 +00:00
backup Add support for RBD fast-diff feature for backups stored in Ceph 2021-03-15 13:48:28 +00:00
brick LVM: Use --readonly for lvs 2021-01-11 17:02:20 -05:00
cmd Remove NestedQuotaDriver 2021-01-19 17:43:29 +00:00
compute Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
consistencygroup Remove unused CG code 2017-03-19 00:49:10 -04:00
db Fix quota usage duplicate entries 2021-04-05 06:21:23 +00:00
group Use resource_backend for volumes and groups 2020-08-14 08:13:42 +00:00
image Support mTLS when calling the glance API 2021-03-22 22:00:44 +00:00
keymgr Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
message Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
monkey_patch_example
objects Fix cross-project incremental backups 2020-05-21 09:38:25 -03:00
policies Import HTTPStatus instead of http_client (policy tests) 2020-10-13 10:00:20 -04:00
scheduler Remove six of dir cinder/tests/unit/policies&scheduler&targets/* 2020-10-08 10:58:09 +08:00
targets Remove six of dir cinder/tests/unit/policies&scheduler&targets/* 2020-10-08 10:58:09 +08:00
volume Change snapshots type with volume retype 2021-04-01 12:08:03 +02:00
windows smbfs: set VHD UUID using volume UUID 2021-02-18 09:54:58 +02:00
zonemanager Update to hacking 4.0.0 2021-02-16 10:54:51 -05:00
__init__.py
cast_as_call.py Introduce flake8-import-order extension 2020-01-06 09:59:35 -06:00
conf_fixture.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
fake_cluster.py
fake_constants.py Default type overrides 2020-09-16 14:05:31 +00:00
fake_group.py Update db from drivers in default groups methods 2017-03-17 11:08:06 -04:00
fake_group_snapshot.py Update db from drivers in default groups methods 2017-03-17 11:08:06 -04:00
fake_notifier.py Introduce flake8-import-order extension 2020-01-06 09:59:35 -06:00
fake_objects.py
fake_service.py Fix migration 112 to use live_data_migration API 2017-10-20 18:24:33 -06:00
fake_snapshot.py Add context to cloning snapshots in remotefs driver 2019-07-10 10:41:15 +02:00
fake_utils.py Remove six of files under cinder/test/unit 2020-10-14 09:19:08 +08:00
fake_volume.py Fix VolumeAttachment is not bound to a Session 2019-03-15 11:29:25 +01:00
policy.yaml [goal] Deprecate the JSON formatted policy file 2020-12-11 18:31:04 -06:00
test.py [goal] Deprecate the JSON formatted policy file 2020-12-11 18:31:04 -06:00
test_api.py Remove six of files under cinder/test/unit 2020-10-14 09:19:08 +08:00
test_api_urlmap.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_cleanable_manager.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_cmd.py Update to hacking 4.0.0 2021-02-16 10:54:51 -05:00
test_context.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_coordination.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_db_api.py Fix quota usage duplicate entries 2021-04-05 06:21:23 +00:00
test_db_worker_api.py Remove six of files under cinder/test/unit 2020-10-14 09:19:08 +08:00
test_evaluator.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_exception.py Remove six of files under cinder/test/unit 2020-10-14 09:19:08 +08:00
test_fixtures.py Explicitly set expected log level for tests 2017-11-17 16:58:40 -06:00
test_hacking.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_image_utils.py Support format info in fs type drivers 2021-03-12 12:41:12 -05:00
test_interface.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_manager.py Remove six of files under cinder/test/unit 2020-10-14 09:19:08 +08:00
test_paginate_query.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_policy.py Make sure we pass context objects directly to policy enforcement 2021-02-17 17:44:40 +00:00
test_qos_specs.py Remove six of files under cinder/test/unit 2020-10-14 09:19:08 +08:00
test_quota.py Fix quota usage duplicate entries 2021-04-05 06:21:23 +00:00
test_quota_utils.py Remove NestedQuotaDriver 2021-01-19 17:43:29 +00:00
test_rpc.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_service.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_service_auth.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_setup_profiler.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_ssh_utils.py Refactor some unit tests 2020-10-14 11:01:02 +00:00
test_test.py Handle oslo.messaging ping endpoint 2020-09-03 17:04:17 -05:00
test_test_utils.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_utils.py Move trace methods from utils to volume_utils 2021-02-12 20:16:55 +00:00
test_volume_cleanup.py Introduce flake8-import-order extension 2020-01-06 09:59:35 -06:00
test_volume_configuration.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_volume_glance_metadata.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_volume_throttling.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_volume_transfer.py Fix: show volume transfer by name for non-admins 2020-08-03 12:46:31 +00:00
test_volume_types.py Modify default/delete volume type logic 2020-08-19 02:07:15 +00:00
test_volume_types_extra_specs.py Move unit test code under tests/unit/ 2020-04-30 18:13:54 -04:00
test_volume_utils.py Move trace methods from utils to volume_utils 2021-02-12 20:16:55 +00:00
utils.py Remove six of files under cinder/test/unit 2020-10-14 09:19:08 +08:00