periodic_tasks.py 2.53 KB
Newer Older
1 2 3 4
from storage.models import DataStore
import os
from manager.mancelery import celery
import logging
5
from storage.tasks import remote_tasks
6 7 8 9 10

logger = logging.getLogger(__name__)


@celery.task
11 12
def garbage_collector(timeout=15):
    """ Garbage collector for disk images.
13 14 15
    Moves 1 day old deleted images to trash folder.
    If there is not enough free space on datastore (default 10%)
    deletes oldest images from trash.
16

17 18
    :param timeout: Seconds before TimeOut exception
    :type timeoit: int
19
    """
20 21
    for ds in DataStore.objects.all():
        file_list = os.listdir(ds.path)
22
        disk_list = ds.get_deletable_disks()
23
        queue_name = ds.get_remote_queue_name('storage')
24
        for i in set(file_list).intersection(disk_list):
25 26 27 28 29 30 31 32 33 34
            logger.info("Image: %s at Datastore: %s moved to trash folder." %
                        (i, ds.path))
            remote_tasks.move_to_trash.apply_async(
                args=[ds.path, i], queue=queue_name).get(timeout=timeout)
        try:
            remote_tasks.make_free_space.apply_async(
                args=[ds.path], queue=queue_name).get(timeout=timeout)
        except Exception as e:
            logger.warning(str(e))

35

36 37
@celery.task
def list_orphan_disks(timeout=15):
38 39 40 41 42
    """List disk image files without Disk object in the database.
    Exclude cloud-xxxxxxxx.dump format images.

    :param timeout: Seconds before TimeOut exception
    :type timeoit: int
43 44
    """
    import re
45
    for ds in DataStore.objects.all():
46 47 48
        queue_name = ds.get_remote_queue_name('storage')
        file_list = remote_tasks.list_files.apply_async(
            args=[ds.path], queue=queue_name).get(timeout=timeout)
49 50
        disk_list = [disk.filename for disk in ds.disk_set.all()]
        for i in set(file_list).difference(disk_list):
51 52
            if not re.match('cloud-[0-9]*\.dump', i):
                logging.warning("Orphan disk: %s" % i)
53

54 55 56

@celery.task
def list_missing_disks(timeout=15):
57 58 59 60
    """List Disk objects without disk image files.

    :param timeout: Seconds before TimeOut exception
    :type timeoit: int
61
    """
62
    for ds in DataStore.objects.all():
63 64 65
        queue_name = ds.get_remote_queue_name('storage')
        file_list = remote_tasks.list_files.apply_async(
            args=[ds.path], queue=queue_name).get(timeout=timeout)
66
        disk_list = [disk.filename for disk in
67
                     ds.disk_set.filter(destroyed__isnull=True)]
68
        for i in set(disk_list).difference(file_list):
69 70
            logging.critical("Image: %s is missing from %s datastore."
                             % (i, ds.path))