delayed scrubbing now works.

This commit is contained in:
Jason Kölker 2011-06-10 15:51:50 -05:00
parent 8dbb9b501f
commit 03e47cacfc
2 changed files with 18 additions and 9 deletions

View File

@ -143,10 +143,10 @@ def image_get_all_pending_delete(context, delete_time=None, limit=None):
filter(models.Image.status == 'pending_delete')
if delete_time:
query.filter(models.Image.deleted_at <= delete_time)
query = query.filter(models.Image.deleted_at <= delete_time)
query.order_by(desc(models.Image.deleted_at)).\
order_by(desc(models.Image.id))
query = query.order_by(desc(models.Image.deleted_at)).\
order_by(desc(models.Image.id))
if limit:
query = query.limit(limit)

View File

@ -19,18 +19,20 @@ import datetime
import eventlet
import logging
from glance import exception
from glance import registry
from glance import store
from glance.common import config
from glance.common import exception
from glance.registry.db import api as db_api
logger = logging.getLogger('glance.store.scrub')
logger = logging.getLogger('glance.store.scrubber')
class Server(object):
def __init__(self, wakeup_time=300, threads=1000):
logger.info("Starting Server: " +
"wakeup_time=%s threads=%s" % (wakeup_time, threads))
self.wakeup_time = wakeup_time
self.event = eventlet.event.Event()
self.pool = eventlet.greenpool.GreenPool(threads)
@ -42,30 +44,37 @@ class Server(object):
try:
self.event.wait()
except KeyboardInterrupt:
pass
logger.info("Server Shutdown on KeyboardInterrupt")
def _run(self, application):
self.pool.spawn_n(application.scrubi, self.event, self.pool)
eventlet.spawn_after(wakeup_time, self._run, application)
logger.debug("Runing application")
self.pool.spawn_n(application.run, self.event, self.pool)
eventlet.spawn_after(self.wakeup_time, self._run, application)
logger.debug("Next run scheduled in %s seconds" % self.wakeup_time)
class Scrubber(object):
def __init__(self, options):
logger.info("Initializing scrubber with options: %s" % options)
self.options = options
scrub_time = config.get_option(options, 'scrub_time', type='int',
default=0)
scrub_time = int(self.options.get('scrub_time', 0))
logger.info("Scrub interval set to %s seconds" % scrub_time)
self.scrub_time = datetime.timedelta(seconds=scrub_time)
db_api.configure_db(options)
def scrub(self, event, pool):
def run(self, event, pool):
delete_time = datetime.datetime.utcnow() - self.scrub_time
logger.info("Getting images deleted before %s" % delete_time)
pending = db_api.image_get_all_pending_delete(None, delete_time)
logger.info("Deleting %s images" % len(pending))
delete_work = [(p['id'], p['location']) for p in pending]
pool.starmap(self._delete, delete_work)
def _delete(self, id, location):
try:
logger.debug("Deleting %s" % location)
store.delete_from_backend(location)
except (store.UnsupportedBackend, exception.NotFound):
msg = "Failed to delete image from store (%s). "