[Kimchi-devel] [PATCH] Delete reference count when deleting storage volume

Aline Manera alinefm at linux.vnet.ibm.com
Tue Jan 13 11:59:56 UTC 2015


On 12/01/2015 06:22, Royce Lv wrote:
> On 01/08/2015 08:47 AM, Aline Manera wrote:
>>
>> On 30/12/2014 01:21, lvroyce at linux.vnet.ibm.com wrote:
>>> From: Royce Lv <lvroyce at linux.vnet.ibm.com>
>>>
>>> If ref count remains in system after volume delete, it will cause
>>> side effect in creating a volume of same name.
>>> Fix this by deleting reference count when deleting storage volume.
>>>
>>> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
>>> ---
>>>   src/kimchi/model/diskutils.py      | 13 +++++++++++++
>>>   src/kimchi/model/storagevolumes.py |  3 ++-
>>>   2 files changed, 15 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/src/kimchi/model/diskutils.py 
>>> b/src/kimchi/model/diskutils.py
>>> index 1d575cb..7eb24d2 100644
>>> --- a/src/kimchi/model/diskutils.py
>>> +++ b/src/kimchi/model/diskutils.py
>>> @@ -73,3 +73,16 @@ def set_disk_ref_cnt(objstore, path, new_count):
>>>               session.store('storagevolume', path, {'ref_cnt': 
>>> new_count})
>>>       except Exception as e:
>>>           raise OperationFailed('KCHVOL0017E', {'err': e.message})
>>> +
>>> +
>>> +def clean_disk_ref_cnt(objstore, path):
>>> +    try:
>>> +        with objstore as session:
>>> +            session.delete('storagevolume', path)
>>> +    except NotFoundError:
>>> +        pass
>>> +    except Exception as e:
>>> +        kimchi_log.error('Unable to delete storage volume in'
>>> +                         ' objectstore due error: %s',
>>> +                         e.message)
>>> +        raise OperationFailed('KCHVOL0017E', {'err': e.message})
>>
>> There already are functions in model/diskutils.py to deal with the 
>> ref_cnt: get_disk_ref_cnt() and set_disk_ref_cnt().
>> Please, use set_disk_ref_cnt() to do that clean up.
> I considered to use set_disk_ref_cnt, but it just stores 0 to the 
> path, instead of deleting this entry in objstore,
> since this volume is deleted, we don't need to store this entry in 
> objstore anymore, so I choosed clean_disk_ref_cnt to delete it from 
> objstore.

OK. Maybe we could do it more generic to remove any entry in the objstore.

Also I couldn't apply the patch:

alinefm at alinefm:~/kimchi$ git am -3 ../mail-patches/\[Kimchi-devel\]\ 
\[PATCH\]\ Delete\ reference\ count\ when\ deleting\ storage\ volume.eml
Applying: Delete reference count when deleting storage volume
Using index info to reconstruct a base tree...
M    src/kimchi/model/storagevolumes.py
Falling back to patching base and 3-way merge...
Auto-merging src/kimchi/model/storagevolumes.py
CONFLICT (content): Merge conflict in src/kimchi/model/storagevolumes.py
Failed to merge in the changes.
Patch failed at 0001 Delete reference count when deleting storage volume
The copy of the patch that failed is found in:
    /home/alinefm/kimchi/.git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".


>>
>>> diff --git a/src/kimchi/model/storagevolumes.py 
>>> b/src/kimchi/model/storagevolumes.py
>>> index 406b38b..cf83b0e 100644
>>> --- a/src/kimchi/model/storagevolumes.py
>>> +++ b/src/kimchi/model/storagevolumes.py
>>> @@ -30,7 +30,7 @@ from kimchi.config import READONLY_POOL_TYPE
>>>   from kimchi.exception import InvalidOperation, InvalidParameter, 
>>> IsoFormatError
>>>   from kimchi.exception import MissingParameter, NotFoundError, 
>>> OperationFailed
>>>   from kimchi.isoinfo import IsoImage
>>> -from kimchi.model.diskutils import get_disk_ref_cnt
>>> +from kimchi.model.diskutils import get_disk_ref_cnt, 
>>> clean_disk_ref_cnt
>>>   from kimchi.model.storagepools import StoragePoolModel
>>>   from kimchi.model.tasks import TaskModel
>>>   from kimchi.utils import add_task, get_next_clone_name, kimchi_log
>>> @@ -306,6 +306,7 @@ class StorageVolumeModel(object):
>>>               raise InvalidParameter("KCHVOL0012E", {'type': 
>>> pool_info['type']})
>>>
>>>           volume = self._get_storagevolume(pool, name)
>>> +        clean_disk_ref_cnt(self.objstore, volume.path())
>>>           try:
>>>               volume.delete(0)
>>>           except libvirt.libvirtError as e:
>>
>




More information about the Kimchi-devel mailing list