OpenKeel: the sovereign French Cloud solution of the inherent group, with a European reach Discover inherent

Reverse-spec · Services

cinder — Interactions

Interactions — cinder — branch stable/2026.2

Branch stable/2026.2 @ c117f9cf08b4 (29.0.0-1-gc117f9cf0) — repository https://opendev.org/openstack/cinder — analysed on 2026-10-28

Cinder is four cooperating processes around one SQL database and one RabbitMQ bus (see summary): cinder-api (REST), cinder-scheduler, cinder-volume (one per host, one backend per enabled_backends entry) and cinder-backup. The API never touches storage itself: it writes the database and sends RPC messages.

1. RabbitMQ (oslo.messaging)

1.1 Transport and serialisation

  • Transport from [DEFAULT]/transport_url; rpc.init creates the RPC transport, the notification transport and the notifier (cinder/rpc.py:58-76). The exchange is oslo.messaging's default **openstack**: rpc.set_defaults(control_exchange) exists but no Cinder process calls it (cinder/rpc.py:91-92) [inferred: confirmed by grep, the default comes from oslo.messaging].
  • Arguments travel as versioned objects (cinder_object.name, cinder_object.version, cinder_object.data…) through CinderObjectSerializer, pinned to the oldest object version of the running services (cinder/rpc.py:216-224, cinder/service.py:234-240).
  • Rolling upgrades: each client caps its RPC version to the minimum rpc_current_version recorded in the services table for that binary (cinder/rpc.py:250-264); methods newer than the cap raise ServiceTooOld (cinder/rpc.py:183-199). The volume client falls back to the pre-3.6 addressing when the cap is lower (cinder/volume/rpcapi.py:150-168).
  • Remote exceptions allowed to be re-raised on the caller side: cinder.exception (get_allowed_exmods, cinder/rpc.py:58-62).

1.2 Topology

ExchangeTypeRouting key / queueProducerConsumer
openstacktopiccinder-scheduler (any scheduler), cinder-scheduler.<host>cinder-api, cinder-volumecinder-scheduler
cinder-scheduler_fanoutfanoutcinder-scheduler_fanout_<uuid>cinder-volume, cinder-backup (update_service_capabilities)every scheduler
openstacktopiccinder-volume.<host>@<backend> with server <host> (RPC ≥ 3.6), and cinder-volume.<cluster>@<backend> for active-active clusterscinder-api, cinder-scheduler, cinder-backupthe cinder-volume serving that backend (cinder/service.py:241-268)
openstacktopiccinder-volume with server <host>@<backend> (legacy, pre-3.6)old clientscinder-volume
cinder-volume_fanoutfanoutcinder-api (publish_service_capabilities, failover_completed)every cinder-volume
openstacktopiccinder-backup, cinder-backup.<host>cinder-scheduler, cinder-apicinder-backup
reply_<uuid>directthe callee of a callthe caller
openstack (notifications)topicnotifications.info, notifications.error ([oslo_messaging_notifications]/topics)all processes, driver messagingv2Ceilometer…

The address of a volume is its host field, host@backend#pool; service_topic_queue is the cluster name when the volume belongs to a cluster, otherwise the host (cinder/volume/rpcapi.py:150-168).

1.3 RPC methods (clients in this repository)

RPC API versions: scheduler 3.12, volume 3.20, backup 2.4 (cinder/scheduler/rpcapi.py:78, cinder/volume/rpcapi.py:145, cinder/backup/rpcapi.py:54). "Version sent" — means the default 3.0 (2.0 for backup), capped as above. The server side is the method of the same name in cinder/scheduler/manager.py, cinder/volume/manager.py and cinder/backup/manager.py (async processing).

ServerRPC methodModeAddressingVersion sentPython clientDefined at
cinder-schedulercreate_groupcastany server of the topic3.0 (2.0 for backup)create_groupcinder/scheduler/rpcapi.py:97
cinder-schedulercreate_volumecastany server of the topic3.0 (2.0 for backup)create_volumecinder/scheduler/rpcapi.py:110
cinder-schedulervalidate_host_capacitycallany server of the topic3.0 (2.0 for backup)validate_host_capacitycinder/scheduler/rpcapi.py:118
cinder-schedulercreate_snapshotcastany server of the topic3.0 (2.0 for backup)create_snapshotcinder/scheduler/rpcapi.py:129
cinder-schedulermethodcastany server of the topicversionmigrate_volumecinder/scheduler/rpcapi.py:148
cinder-schedulerretypecastany server of the topic3.0 (2.0 for backup)retypecinder/scheduler/rpcapi.py:155
cinder-schedulermanage_existingcastany server of the topic3.0 (2.0 for backup)manage_existingcinder/scheduler/rpcapi.py:165
cinder-schedulermanage_existing_snapshotcastany server of the topic3.0 (2.0 for backup)manage_existing_snapshotcinder/scheduler/rpcapi.py:179
cinder-schedulerextend_volumecastany server of the topic3.0 (2.0 for backup)extend_volumecinder/scheduler/rpcapi.py:195
cinder-schedulerget_poolscallany server of the topic3.0 (2.0 for backup)get_poolscinder/scheduler/rpcapi.py:199
cinder-schedulerupdate_service_capabilitiescastfanoutversionupdate_service_capabilitiescinder/scheduler/rpcapi.py:222
cinder-schedulernotify_service_capabilitiescastany server of the topicversionnotify_service_capabilitiescinder/scheduler/rpcapi.py:238
cinder-schedulerwork_cleanupcallany server of the topic3.4work_cleanupcinder/scheduler/rpcapi.py:246
cinder-schedulerdo_cleanupcastany server of the topic3.4do_cleanupcinder/scheduler/rpcapi.py:253
cinder-schedulerset_log_levelscastserver service.host3.7set_log_levelscinder/scheduler/rpcapi.py:258
cinder-schedulerget_log_levelscallserver service.host3.7get_log_levelscinder/scheduler/rpcapi.py:263
cinder-schedulercreate_backupcastany server of the topic3.0 (2.0 for backup)create_backupcinder/scheduler/rpcapi.py:269
cinder-volumecreate_volumecastserver of volume.service_topic_queue3.0 (2.0 for backup)create_volumecinder/volume/rpcapi.py:177
cinder-volumerevert_to_snapshotcastserver of volume.service_topic_queueversionrevert_to_snapshotcinder/volume/rpcapi.py:187
cinder-volumedelete_volumecastserver of volume.service_topic_queue3.0 (2.0 for backup)delete_volumecinder/volume/rpcapi.py:202
cinder-volumecreate_snapshotcastserver of volume.service_topic_queue3.0 (2.0 for backup)create_snapshotcinder/volume/rpcapi.py:210
cinder-volumedelete_snapshotcastserver of snapshot.service_topic_queue3.0 (2.0 for backup)delete_snapshotcinder/volume/rpcapi.py:214
cinder-volumeattach_volumecallserver of volume.service_topic_queue('3.3', '3.0')attach_volumecinder/volume/rpcapi.py:228
cinder-volumedetach_volumecallserver of volume.service_topic_queue('3.4', '3.0')detach_volumecinder/volume/rpcapi.py:237
cinder-volumecopy_volume_to_imagecastserver of volume.service_topic_queue3.0 (2.0 for backup)copy_volume_to_imagecinder/volume/rpcapi.py:241
cinder-volumeinitialize_connectioncallserver of volume.service_topic_queue3.0 (2.0 for backup)initialize_connectioncinder/volume/rpcapi.py:246
cinder-volumeterminate_connectioncallserver of volume.service_topic_queue3.0 (2.0 for backup)terminate_connectioncinder/volume/rpcapi.py:251
cinder-volumeremove_exportcallserver of volume.service_topic_queue3.0 (2.0 for backup)remove_exportcinder/volume/rpcapi.py:257
cinder-volumeremove_exportcastserver of volume.service_topic_queue3.0 (2.0 for backup)remove_exportcinder/volume/rpcapi.py:259
cinder-volumepublish_service_capabilitiescastfanout3.0 (2.0 for backup)publish_service_capabilitiescinder/volume/rpcapi.py:263
cinder-volumeaccept_transfercallserver of volume.service_topic_queue('3.16', '3.0')accept_transfercinder/volume/rpcapi.py:275
cinder-volumeextend_volumecastserver of volume.service_topic_queue3.0 (2.0 for backup)extend_volumecinder/volume/rpcapi.py:279
cinder-volumeextend_volume_completioncastserver of volume.service_topic_queue3.19extend_volume_completioncinder/volume/rpcapi.py:286
cinder-volumemigrate_volumecastserver of volume.service_topic_queueversionmigrate_volumecinder/volume/rpcapi.py:300
cinder-volumemigrate_volume_completioncallserver of volume.service_topic_queue3.0 (2.0 for backup)migrate_volume_completioncinder/volume/rpcapi.py:305
cinder-volumeretypecastserver of volume.service_topic_queueversionretypecinder/volume/rpcapi.py:320
cinder-volumemanage_existingcastserver of volume.service_topic_queue3.0 (2.0 for backup)manage_existingcinder/volume/rpcapi.py:327
cinder-volumeupdate_migrated_volumecallserver of new_volume.service_topic_queue3.0 (2.0 for backup)update_migrated_volumecinder/volume/rpcapi.py:332
cinder-volumefreeze_hostcallserver of service.service_topic_queue3.0 (2.0 for backup)freeze_hostcinder/volume/rpcapi.py:340
cinder-volumethaw_hostcallserver of service.service_topic_queue3.0 (2.0 for backup)thaw_hostcinder/volume/rpcapi.py:345
cinder-volumemethodcastserver of service.service_topic_queueversionfailovercinder/volume/rpcapi.py:355
cinder-volumefailover_completedcastfanout3.8failover_completedcinder/volume/rpcapi.py:361
cinder-volumemanage_existing_snapshotcastserver of backend3.0 (2.0 for backup)manage_existing_snapshotcinder/volume/rpcapi.py:365
cinder-volumeget_capabilitiescallserver of backend_id3.0 (2.0 for backup)get_capabilitiescinder/volume/rpcapi.py:371
cinder-volumeget_backup_devicecastserver of volume.service_topic_queue('3.17', '3.2', '3.0')get_backup_devicecinder/volume/rpcapi.py:377
cinder-volumeget_backup_devicecallserver of volume.service_topic_queue('3.17', '3.2', '3.0')get_backup_devicecinder/volume/rpcapi.py:381
cinder-volumeget_backup_devicecallserver of volume.service_topic_queue('3.17', '3.2', '3.0')get_backup_devicecinder/volume/rpcapi.py:384
cinder-volumesecure_file_operations_enabledcallserver of volume.service_topic_queue3.0 (2.0 for backup)secure_file_operations_enabledcinder/volume/rpcapi.py:391
cinder-volumeget_manageable_volumescallserver of service.service_topic_queueversionget_manageable_volumescinder/volume/rpcapi.py:409
cinder-volumeget_manageable_snapshotscallserver of service.service_topic_queueversionget_manageable_snapshotscinder/volume/rpcapi.py:426
cinder-volumecreate_groupcastserver of group.service_topic_queue3.0 (2.0 for backup)create_groupcinder/volume/rpcapi.py:432
cinder-volumedelete_groupcastserver of group.service_topic_queue3.0 (2.0 for backup)delete_groupcinder/volume/rpcapi.py:436
cinder-volumeupdate_groupcastserver of group.service_topic_queue3.0 (2.0 for backup)update_groupcinder/volume/rpcapi.py:440
cinder-volumecreate_group_from_srccastserver of group.service_topic_queue3.0 (2.0 for backup)create_group_from_srccinder/volume/rpcapi.py:446
cinder-volumecreate_group_snapshotcastserver of group_snapshot.service_topic_queue3.0 (2.0 for backup)create_group_snapshotcinder/volume/rpcapi.py:451
cinder-volumedelete_group_snapshotcastserver of group_snapshot.service_topic_queue3.0 (2.0 for backup)delete_group_snapshotcinder/volume/rpcapi.py:456
cinder-volumeinitialize_connection_snapshotcallserver of snapshot.service_topic_queue3.13initialize_connection_snapshotcinder/volume/rpcapi.py:462
cinder-volumeterminate_connection_snapshotcallserver of snapshot.service_topic_queue3.13terminate_connection_snapshotcinder/volume/rpcapi.py:470
cinder-volumeremove_export_snapshotcallserver of snapshot.service_topic_queue3.13remove_export_snapshotcinder/volume/rpcapi.py:478
cinder-volumeremove_export_snapshotcastserver of snapshot.service_topic_queue3.13remove_export_snapshotcinder/volume/rpcapi.py:480
cinder-volumeattachment_updatecallserver of vref.service_topic_queueversionattachment_updatecinder/volume/rpcapi.py:486
cinder-volumeattachment_deletecallserver of vref.service_topic_queueversionattachment_deletecinder/volume/rpcapi.py:496
cinder-volumedo_cleanupcastserver of destination3.7do_cleanupcinder/volume/rpcapi.py:509
cinder-volumeset_log_levelscastserver of service.host3.12set_log_levelscinder/volume/rpcapi.py:514
cinder-volumeget_log_levelscallserver of service.host3.12get_log_levelscinder/volume/rpcapi.py:519
cinder-volumeenable_replicationcastserver of group.service_topic_queue3.14enable_replicationcinder/volume/rpcapi.py:524
cinder-volumedisable_replicationcastserver of group.service_topic_queue3.14disable_replicationcinder/volume/rpcapi.py:530
cinder-volumefailover_replicationcastserver of group.service_topic_queue3.14failover_replicationcinder/volume/rpcapi.py:537
cinder-volumelist_replication_targetscallserver of group.service_topic_queue3.14list_replication_targetscinder/volume/rpcapi.py:544
cinder-volumereimagecastserver of volume.service_topic_queue('3.20', '3.18')reimagecinder/volume/rpcapi.py:552
cinder-volumereimagecastserver of volume.service_topic_queue('3.20', '3.18')reimagecinder/volume/rpcapi.py:555
cinder-backupcreate_backupcastserver backup.host3.0 (2.0 for backup)create_backupcinder/backup/rpcapi.py:62
cinder-backupcontinue_backupcastserver backup.host3.0 (2.0 for backup)continue_backupcinder/backup/rpcapi.py:67
cinder-backuprestore_backupcastserver backup_host3.0 (2.0 for backup)restore_backupcinder/backup/rpcapi.py:75
cinder-backuprestore_backupcastserver backup_host3.0 (2.0 for backup)restore_backupcinder/backup/rpcapi.py:78
cinder-backupdelete_backupcastserver backup.host3.0 (2.0 for backup)delete_backupcinder/backup/rpcapi.py:84
cinder-backupexport_recordcallserver backup.host3.0 (2.0 for backup)export_recordcinder/backup/rpcapi.py:92
cinder-backupimport_recordcastserver host3.0 (2.0 for backup)import_recordcinder/backup/rpcapi.py:100
cinder-backupreset_statuscastserver backup.host3.0 (2.0 for backup)reset_statuscinder/backup/rpcapi.py:111
cinder-backupcheck_support_to_force_deletecallserver host3.0 (2.0 for backup)check_support_to_force_deletecinder/backup/rpcapi.py:117
cinder-backupset_log_levelscastserver service.host2.1set_log_levelscinder/backup/rpcapi.py:122
cinder-backupget_log_levelscallserver service.host2.1get_log_levelscinder/backup/rpcapi.py:127
cinder-backuppublish_service_capabilitiescastfanout2.2publish_service_capabilitiescinder/backup/rpcapi.py:132

Timeouts: a call waits [DEFAULT]/rpc_response_timeout (oslo.messaging default 60 s) and raises MessagingTimeout; the synchronous calls on the request path of the API are initialize_connection, terminate_connection, attach_volume, detach_volume, attachment_update, attachment_delete, accept_transfer, get_capabilities, get_manageable_*, get_pools, migrate_volume_completion, freeze_host/thaw_host, list_replication_targets, export_record.

1.4 Sample frame — create_volume cast from the scheduler to cinder-volume

{"oslo.version": "2.0",
 "oslo.message": "{\"method\": \"create_volume\", \"version\": \"3.0\", \"namespace\": null,
   \"args\": {\"volume\": {\"cinder_object.name\": \"Volume\", \"cinder_object.namespace\": \"cinder\",
              \"cinder_object.version\": \"1.9\", \"cinder_object.data\": {\"id\": \"…\", \"size\": 10, \"status\": \"creating\", \"host\": \"node1@lvm#lvm\", …}},
            \"request_spec\": {\"cinder_object.name\": \"RequestSpec\", …},
            \"filter_properties\": {\"retry\": {\"num_attempts\": 1, \"backends\": [\"node1@lvm#lvm\"], \"hosts\": [\"node1@lvm#lvm\"]}, …},
            \"allow_reschedule\": true},
   \"_unique_id\": \"…\", \"_context_request_id\": \"req-…\", \"_context_project_id\": \"…\", \"_context_user_id\": \"…\",
   \"_context_is_admin\": false, \"_context_roles\": [\"member\", \"reader\"], \"_context_auth_token\": \"…\", …}"}

Routing key cinder-volume.node1@lvm, server node1. [inferred] The object versions depend on cinder/objects/*.py (VERSION), and the context fields on RequestContext.to_dict (cinder/context.py); the user token travels in the message (_context_auth_token), because the volume service calls Glance, Nova and Barbican on the user's behalf.

1.5 Notifications

Published with priority INFO unless stated, publisher_id = "<service>.<host>" (cinder/rpc.py:172-179), only when [oslo_messaging_notifications]/driver is set (cinder/rpc.py:69-75).

event_typeWhenPayloadEmitted at
volume.create.start/end, volume.delete.start/end, volume.update.start/end, volume.attach.start/end, volume.detach.start/end, volume.resize.start/end, volume.retype, volume.revert.start/end, volume.transfer.{create,accept,delete}.start/end, volume.manage_existing.start/end, volume.existsvolume lifecycle; exists from cinder-volume-usage-audittenant, user, AZ, volume id, type id, name, status, size, created/launched at, snapshot id, replication fields, metadata, attachments, Glance metadata (cinder/volume/volume_utils.py:93-134)cinder/volume/volume_utils.py:162-177
snapshot.{create,delete,update,revert}.start/end, snapshot.existssnapshot lifecyclecinder/volume/volume_utils.py:197-224cinder/volume/volume_utils.py:225-240
backup.{create,delete,restore}.start/end, backup.createprogress, backup.reset_status.end, backup.existsbackup lifecycle and progress of chunked driverscinder/volume/volume_utils.py:137-158cinder/volume/volume_utils.py:180-195
group.*, group_snapshot.*, consistencygroup.*, cgsnapshot.*group operations, including replication enable/disable/failovercinder/volume/volume_utils.py:293-417
capacity.pooleach stats report of a backendpool capacitiescinder/volume/volume_utils.py:261-276
scheduler.create_volume, scheduler.<method> (ERROR)scheduling failurerequest spec, volume id, state, reasoncinder/scheduler/manager.py:505-541
volume_type.*, volume_type_extra_specs.*, volume_type_encryption.*, qos_specs.*, group_type.*, groups.reset_status.*administrative API changescinder/api/contrib/types_manage.py:40-51, cinder/api/contrib/qos_specs_manage.py
volume_type_project.access.add/remove [inferred name]private type accesscinder/volume/volume_types.py:279-300
image_volume_cache.{hit,miss,evict}image-volume cache useimage id, hostcinder/image/cache.py:257

2. Database (oslo.db, SQLAlchemy)

[database]/connection; 35 tables plus alembic_version. The model DDL is in [_rewrite/schema-mysql_stable-2026.2.sql](_rewrite/schema-mysql_stable-2026.2.sql); the schema produced by the migrations, in [_rewrite/schema-sqlite-migrated_stable-2026.2.sql](_rewrite/schema-sqlite-migrated_stable-2026.2.sql). They differ only by two leftover columns (§ 2.3). Every model has created_at, updated_at, deleted_at and deleted (soft delete) through CinderBase (cinder/db/models.py:40-62).

2.1 Tables

TableRoleWritten byRead by
servicesone row per process and backend: host, binary, topic, AZ, report_count heartbeat, disabled, versions (rpc_current_version, object_current_version), replication and frozen state, clusterevery service at start and every report_intervalAPI (service up/down = updated_at within service_down_time), scheduler, RPC version pins
clustersactive-active groups of volume servicesservices, cinder-manage clusterscheduler, API
volumesvolumes: status, attach status, size, host, type, AZ, migration, replication, encryption key id, use_quota, groupAPI, volume managereverything
volume_metadata, volume_admin_metadata, volume_glance_metadatauser metadata; admin metadata (readonly, attached mode, extend state); image properties copied from GlanceAPI, managerAPI, manager, notifications
volume_attachment, attachment_specsattachments: instance, host, mountpoint, attach status, mode, connection_info, connectorAPI, volume managerAPI, Nova (through the API)
snapshots, snapshot_metadatasnapshotsAPI, manager
backups, backup_metadatabackups: service, container, parent (incremental), service_metadata, fail_reason, restore_volume_id, data_timestampAPI, backup manager
volume_types, volume_type_extra_specs, volume_type_projects, encryption, quality_of_service_specs, default_volume_typestype catalogue, private access, encryption specs, QoS (key/value rows with a parent), per-project default typeadmin APIAPI, scheduler (capabilities filter), drivers
group_types, group_type_specs, group_type_projects, groups, group_snapshots, group_volume_type_mapping, consistencygroups, cgsnapshotsgeneric groups and the legacy CG tablesAPI, manager
quotas, quota_classes, quota_usages, reservationslimits per project and class; usage counters (in_use, reserved, until_refresh); two-phase reservations with expiryquota engine in API and managersAPI
transferspending transfers with salt and crypt_hashAPIAPI
messagesuser messages, expires_atAPI, managersAPI, scheduler purge
image_volume_cache_entriesimage-volume cache per backendvolume managervolume manager
driver_initiator_dataper-initiator key/value data kept by some driversdriversdrivers
workersresources being worked on, by service, for cleanup after a crash (status, resource_type, resource_id, service_id, race_preventer)API and managers through @cleanablecleanup at start, POST /workers/cleanup

2.2 Notable transactions and patterns

  • Compare-and-swap status changes: conditional_update(values, expected, filters) issues one UPDATE … WHERE <expected> AND <filters> and returns the number of rows (cinder/db/api.py:551, cinder/objects/base.py:368). Every state transition of the API uses it (delete, extend, attach, revert…), which makes concurrent API workers safe without locks. Example (volume deletion, cinder/volume/api.py:503-520): sql UPDATE volumes SET status='deleting', terminated_at=:now, updated_at=:now WHERE id=:id AND deleted=0 AND (attach_status IS NULL OR attach_status != 'attached') AND (migration_status IS NULL OR migration_status IN ('success','error')) AND consistencygroup_id IS NULL AND group_id IS NULL AND status IN ('available','error','error_restoring','error_extending','error_managing') AND NOT EXISTS (SELECT 1 FROM snapshots WHERE snapshots.volume_id = volumes.id AND snapshots.deleted = 0); [inferred] The exact migration_status and NOT EXISTS clauses come from AVAILABLE_MIGRATION_STATUS and volume_has_snapshots_filter in cinder/db/api.py.
  • Quotas: reserve locks the project's quota_usages rows FOR UPDATE, refreshes them when until_refresh/max_age say so, inserts reservations (expiry [DEFAULT]/reservation_expire, 86,400 s), then commit moves reserved into in_use and rollback cancels (cinder/quota.py:319-440). Retries on deadlock through oslo_db.api.wrap_db_retry [inferred].
  • Soft delete: rows are marked deleted=1; cinder-manage db purge <age> removes them physically.

2.3 Models versus migrations

The real migrations (Alembic, cinder/db/migrations/versions/) add two columns that the models no longer declare: quotas.allocated and reservations.allocated_id (with an index and a foreign key to quotas.id), leftovers of the removed nested-quota driver. See [_rewrite/schema-diff_stable-2026.2.md](_rewrite/schema-diff_stable-2026.2.md).

3. Outbound REST calls

Target serviceCallsWhenAuthenticationTimeout / retryErrors handledDefined at
Keystonetoken validation GET /v3/auth/tokensevery API requestkeystonemiddleware [keystone_authtoken] service user, memcached cachemiddleware defaults401 to the clientetc/cinder/api-paste.ini (authtoken)
KeystoneGET /v3/projects/{id}/default-types operations (project must exist)keystoneclient session with the user's token (or service user)—400 when the project is unknowncinder/api/api_utils.py:170-262
Glance v2GET /v2/images/{id}, GET /v2/images, GET /v2/images/{id}/file, POST /v2/images, PUT /v2/images/{id}/file, PATCH /v2/images/{id}, DELETE /v2/images/{id}, GET /v2/info/stores, locationscreate from image, upload to image, image metadata, reimageuser token (plus service token when [service_user]/send_service_user_token); endpoint from glance_api_servers or the catalog (glance_catalog_info)glance_num_retries on ServiceUnavailable/InvalidEndpoint/CommunicationError; glance_request_timeout404 → ImageNotFound, 403 → ImageNotAuthorizedcinder/image/glance.py:126-311
Nova (v2.1 + microversion)POST /os-server-external-events with volume-extended (2.51) or volume-reimaged (2.93)after extending an attached volume, after a reimage[nova] service user when auth_type is set (privileged), otherwise the user's token[nova] session optionsfailure → user message VOLUME_VOLUME_007_009 / …_016_028, no retrycinder/compute/nova.py:142-241
NovaGET /servers/{id}/os-volume_attachments/{volume_id} (2.89)deleting an attachment that has connection info (bug 2004555)user token—404 → delete locallycinder/compute/nova.py:242-247, cinder/volume/api.py:2588-2661
Novaassisted snapshots POST/DELETE /os-assisted-volume-snapshotsNFS-like drivers snapshotting an attached volume[nova] privileged—cinder/compute/nova.py:190-205
Barbican (castellan)create / get / delete secrets (symmetric keys)create of an encrypted volume, clone, transfer, deleteuser token through castellan [key_manager]castellan defaultsdelete failure → volume error_deleting (cinder/volume/api.py:536-553)cinder/keymgr/__init__.py, cinder/volume/volume_utils.py
Swift / S3 / GCS / NFS / Cephbackup objectsbackup and restore[DEFAULT]/backup_swift_*, backup_s3_*…per driverbackup error with fail_reasoncinder/backup/drivers/*.py

Request IDs: global_request_id is propagated to Nova and Glance (cinder/compute/nova.py:119-131).

4. Coordination and locks (tooz)

  • cinder.coordination.COORDINATOR (prefix cinder-) uses tooz with [coordination]/backend_url, default **file://$state_path** — local file locks, only valid on one host (cinder/coordination.py:38-41, cinder/coordination.py:127). Active-active volume clusters need a distributed backend (etcd, Redis…).
  • Locks held: cinder-<volume_id>-delete_volume, cinder-<snapshot_id>-delete_snapshot, cinder-<volume_id> (attach), cinder-<volume_id>-detach_volume, cinder-attachment_update-<volume_id>-<host>, cinder-<image_id> (image download into a cache entry), declared by @coordination.synchronized decorators on delete_volume, delete_snapshot, attach_volume, detach_volume, attachment_update and _prepare_image_cache_entry (cinder/volume/manager.py:929, cinder/volume/manager.py:1314, cinder/volume/manager.py:1399, cinder/volume/manager.py:1488, cinder/volume/api.py:2527; cinder/volume/flows/manager/create_volume.py:875).
  • oslo.concurrency file locks (lock_path) are used by drivers and by utils.api_clean_volume_file_locks.

5. Other interactions

  • Storage backends: each cinder-volume loads volume_driver per backend section (default cinder.volume.drivers.lvm.LVMVolumeDriver); drivers talk to arrays over vendor REST/SSH APIs or local tools (LVM, rbd…). Data copy and attach on the volume host go through os-brick connectors (iSCSI, FC, NVMe-oF, RBD) and privsep/rootwrap (etc/cinder/rootwrap.d/volume.filters). Only the driver interface (cinder/interface/volume_driver.py) is in scope here.
  • Image conversion: qemu-img through privsep for image ↔ volume copies, with format_inspector checks of the image header (cinder/image/image_utils.py, cinder/image/format_inspector.py).
  • Files: state_path, lock_path, image conversion directory image_conversion_dir.

Source: reverse-spec-cinder/03-interactions_stable-2026.2.md. The _rewrite/ and _inventory/ files are not published on the site.