]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commit
Prevent that all backup objects are deleted
authorMasaki Kanno <kanno.masaki@jp.fujitsu.com>
Tue, 25 Aug 2015 23:56:55 +0000 (08:56 +0900)
committerMasaki Kanno <kanno.masaki@jp.fujitsu.com>
Tue, 25 Aug 2015 23:56:55 +0000 (08:56 +0900)
commitdc7c4969b2864f34c39275422d2934c868968a17
tree2a16e291858a51a39d296540957d553cd710c841
parentf6dafdaa2423cc50d0bbf1f376626e240ce1a761
Prevent that all backup objects are deleted

All backup objects of a project are deleted by this bug. The issue occurs
when Swift is a backend. The below is reproduction steps of the issue.

Step 1: Create a backup from a volume.
The creation of the backup may fail by some kind of causes. If the case is
a failure in put_container() in ChunkedBackupDriver._create_container(),
backup objects of the volume are not stored in Swift because 'volumebackups'
container is not created. In the case, the following information is recorded
in Cinder DB.

  backup.status           : 'error'
  backup.container        : 'volumebackups'
  backup.service_metadata : None

Step 2: Investigate and solve causes in which put_container() failed.

Step 3: Create another backup from a volume.
When the creation of the backup succeeded, 'volumebackups' container is
created in Swift, then backup objects of the volume are stored into the
container.

Step 4: Delete the backup created in step 1.
Only a record of the backup in Cinder DB should be deleted because the
backup objects were not stored in Swift. However, the backup objects created
in step 3 also are deleted by the bug.
Usually SwiftBackupDrier.get_container_entries() lists only object names of
the backup. However, when backup.service_metadata of the backup is None,
SwiftBackupDriver.get_container_entries() lists all object names in
'volumebackups' container. As a result, all the backup objects in the
container are deleted.

This fix prevents that all the backup objects are deleted.
When a backup is deleted, deletion of the backup objects by delete_object()
is not executed if backup.service_metadata of the backup is None.

Change-Id: I6c1c57c1397b336c12cc49159cecd17b55577f6c
Closes-Bug: #1463341
cinder/backup/chunkeddriver.py
cinder/tests/unit/test_backup_swift.py