Mechanism to cleanup all ImageCaches¶
https://blueprints.launchpad.net/ironic/+spec/cleanup-all-imagecaches
This spec talks about creating a mechanism to cleanup all the image caches (leveraging most of the code that is already in pxe driver)
Problem description¶
The cleanup method for cleaning up ImageCache (or its subclasses)
_cleanup_caches_if_required
is situated inside pxe driver. Hence, any
other subclass of ImageCache situated in any other file, cannot use this
cleanup method.
This code was introduced in this commit: https://review.openstack.org/#/c/92625
Proposed change¶
The reason why the cleanup method is placed in pxe driver is because it needs
to know other subclasses of ImageCache to do efficient cleaning to make up for
the required space in the cache. Other ImageCaches which are situated in the
same filesystem are also cleaned up if enough space is not available after
cleaning up the current cache. This method hardcodes InstanceImageCache
and TFTPImageCache
to be cleaned up for any cache cleanup.
The problem could be solved as follows:
Each of the subclasses of ImageCache that wishes to be used in cleanup of other caches (currently
InstanceImageCache
andTFTPImageCache
) add a decorator@image_cache.cleanup(priority=N)
. N should be a positive integer which signifies the priority in which the cache should be cleaned up when extra free space is required after cleaning up the provided cache. Higher value of N means higher priority. If two caches have same value of N (probably at different places in code), then the order of cleanup of those two caches is not predictable (it will depend on which of the two module is loaded first).Currently
InstanceImageCache
being large, should be cleaned up beforeTFTPImageCache
. Hence they will have it as below:@image_cache.cleanup(priority=50) class InstanceImageCache(...) ... @image_cache.cleanup(priority=25) class TFTPImageCache(...) ...
There would be list
cache_cleanup_list
in image_cache.py which would contain a sorted list of instances ofImageCache
to be considered for cleanup. The decorator functioncleanup
adds an instance of the subclass ofImageCache
into list. This list will be kept sorted in non-increasing order ofpriority
after adding the entry.The method
_cleanup_caches_if_required
will be moved to ironic.common.image_cache and renamed toclean_up_caches
. The method_cleanup_caches_if_required
currently uses a hardcoded list of caches to be cleaned for extra space. Instead of that, the newly proposed method will just use the listcache_cleanup_list
.PXEImageCache
will not have decorator@image_cache.cleanup
.
Alternatives¶
The code to cleanup can continue to exist in the pxe driver and pxe driver can import and maintain the hardcoded list of all the caches across the source tree. This is hard to maintain and not logical.
Another alternative is that the method can be moved to a common place, but the cleanup may be initiated on the caches that the module would know about. This would not be as efficient as the proposed solution, as proposed solution can consider more caches for cleaning up and making up the required space.
Data model impact¶
None.
REST API impact¶
None.
Driver API impact¶
None.
Nova driver impact¶
None.
Security impact¶
None.
Other end user impact¶
None.
Scalability impact¶
None.
Performance Impact¶
None.
Other deployer impact¶
None.
Developer impact¶
Developers wishing to introduce a new subclass of
ImageCache
can add the decorator@image_cache.cleanup
and assign anpriority
in interest of overall ironic.The subclass of ImageCache that wishes to be cleaned up should not take any parameters in the constructor.
Implementation¶
Assignee(s)¶
rameshg87
Work Items¶
Refactor
_cleanup_caches_if_required
from ironic.drivers.modules.pxe to ironic.common.image_cache.Modify the unit tests for fetch_images() method in ironic.tests.drivers.test_pxe
Dependencies¶
None.
Testing¶
Currently existing unit tests will be modified in accordance with the proposed behavior.
Documentation Impact¶
None.
References¶
None.