Clean up expired messages for SQLAlchemy driver
Change-Id: I1d14258528bdea89399d491d45e5e1dfd1b06b50 Closes-Bug: #1331228
This commit is contained in:
@@ -13,8 +13,10 @@
|
|||||||
# the License.
|
# the License.
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
|
import uuid
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
from sqlalchemy.sql import func as sfunc
|
||||||
|
|
||||||
from zaqar.queues.storage import pooling
|
from zaqar.queues.storage import pooling
|
||||||
from zaqar.queues.storage import sqlalchemy
|
from zaqar.queues.storage import sqlalchemy
|
||||||
@@ -64,6 +66,49 @@ class SqlalchemyMessageTests(base.MessageControllerTest):
|
|||||||
driver_class = sqlalchemy.DataDriver
|
driver_class = sqlalchemy.DataDriver
|
||||||
controller_class = controllers.MessageController
|
controller_class = controllers.MessageController
|
||||||
|
|
||||||
|
def test_expired_messages_be_deleted(self):
|
||||||
|
messages = [{'body': 3.14, 'ttl': 0}, {'body': 0.618, 'ttl': 600}]
|
||||||
|
client_uuid = uuid.uuid4()
|
||||||
|
|
||||||
|
[msgid_expired, msgid] = self.controller.post(self.queue_name,
|
||||||
|
messages,
|
||||||
|
project=self.project,
|
||||||
|
client_uuid=client_uuid)
|
||||||
|
mid = utils.msgid_decode(msgid_expired)
|
||||||
|
|
||||||
|
def _get(count=False):
|
||||||
|
j = sa.join(tables.Messages, tables.Queues,
|
||||||
|
tables.Messages.c.qid == tables.Queues.c.id)
|
||||||
|
|
||||||
|
sel = sa.sql.select([tables.Messages.c.body,
|
||||||
|
tables.Messages.c.ttl,
|
||||||
|
tables.Messages.c.created])
|
||||||
|
|
||||||
|
if count:
|
||||||
|
sel = sa.sql.select([sfunc.count(tables.Messages.c.id)])
|
||||||
|
|
||||||
|
sel = sel.select_from(j)
|
||||||
|
and_stmt = [tables.Messages.c.id == mid,
|
||||||
|
tables.Queues.c.name == self.queue_name,
|
||||||
|
tables.Queues.c.project == self.project]
|
||||||
|
|
||||||
|
sel = sel.where(sa.and_(*and_stmt))
|
||||||
|
|
||||||
|
return self.driver.get(sel)
|
||||||
|
|
||||||
|
[count] = _get(count=True)
|
||||||
|
self.assertEqual(count, 1)
|
||||||
|
|
||||||
|
# Expired messages will be removed from db until next Post
|
||||||
|
message = [{'body': 3.14, 'ttl': 300}]
|
||||||
|
self.controller.post(self.queue_name,
|
||||||
|
message,
|
||||||
|
project=self.project,
|
||||||
|
client_uuid=client_uuid)
|
||||||
|
|
||||||
|
with testing.expect(utils.NoResult):
|
||||||
|
_get()
|
||||||
|
|
||||||
|
|
||||||
class SqlalchemyClaimTests(base.ClaimControllerTest):
|
class SqlalchemyClaimTests(base.ClaimControllerTest):
|
||||||
driver_class = sqlalchemy.DataDriver
|
driver_class = sqlalchemy.DataDriver
|
||||||
|
@@ -215,13 +215,13 @@ class MessageController(storage.Message):
|
|||||||
with self.driver.trans() as trans:
|
with self.driver.trans() as trans:
|
||||||
qid = utils.get_qid(self.driver, queue, project)
|
qid = utils.get_qid(self.driver, queue, project)
|
||||||
|
|
||||||
# TODO(kgriffs): Need to port this to sqla! Bug #1331228
|
# Delete the expired messages
|
||||||
#
|
and_stmt = sa.and_(tables.Messages.c.ttl <=
|
||||||
# cleanup all expired messages in this queue
|
sfunc.now() - tables.Messages.c.created,
|
||||||
# self.driver.run('''
|
tables.Messages.c.qid == qid)
|
||||||
# delete from Messages
|
statement = tables.Messages.delete().where(and_stmt)
|
||||||
# where ttl <= julianday() * 86400.0 - created
|
|
||||||
# and qid = ?''', qid)
|
trans.execute(statement)
|
||||||
|
|
||||||
# executemany() sets lastrowid to None, so no matter we manually
|
# executemany() sets lastrowid to None, so no matter we manually
|
||||||
# generate the IDs or not, we still need to query for it.
|
# generate the IDs or not, we still need to query for it.
|
||||||
|
Reference in New Issue
Block a user