delayed scrubbing now works.
This commit is contained in:
parent
8dbb9b501f
commit
03e47cacfc
|
@ -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)
|
||||
|
|
|
@ -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). "
|
||||
|
|
Loading…
Reference in New Issue