Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions dtable_events/app/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from dtable_events.tasks.instant_notices_sender import InstantNoticeSender
from dtable_events.tasks.email_notices_sender import EmailNoticesSender
from dtable_events.tasks.dtables_cleaner import DTablesCleaner
from dtable_events.tasks.seadb_databases_cleaner import SeaDBDatabasesCleaner
from dtable_events.tasks.dtable_updates_sender import DTableUpdatesSender
from dtable_events.tasks.dtable_real_time_rows_counter import DTableRealTimeRowsCounter
from dtable_events.tasks.ldap_syncer import LDAPSyncer
Expand Down Expand Up @@ -66,6 +67,7 @@ def __init__(self, task_mode):
self._instant_notices_sender = InstantNoticeSender()
self._email_notices_sender = EmailNoticesSender()
self._dtables_cleaner = DTablesCleaner()
self._seadb_databases_cleaner = SeaDBDatabasesCleaner()
self._dtable_updates_sender = DTableUpdatesSender()
self._dtable_notification_rules_scanner = DTableNofiticationRulesScanner()
self._ldap_syncer = LDAPSyncer()
Expand Down Expand Up @@ -105,6 +107,7 @@ def serve_forever(self):
self._instant_notices_sender.start() # default True
self._email_notices_sender.start() # default True
self._dtables_cleaner.start() # default True
self._seadb_databases_cleaner.start() # default True
self._dtable_updates_sender.start() # default True
self._dtable_notification_rules_scanner.start() # default True
self._ldap_syncer.start() # default False
Expand Down
73 changes: 73 additions & 0 deletions dtable_events/tasks/seadb_databases_cleaner.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import os
import logging
from threading import Thread, Event

from dtable_events.utils import get_python_executable, run
from dtable_events.app.config import dtable_web_dir, TRASH_CLEAN_AFTER_DAYS

__all__ = [
'SeaDBDatabasesCleaner',
]


class SeaDBDatabasesCleaner(object):

def __init__(self):
self._enabled = True
self._logfile = None
self._interval = 60 * 60 * 24
self._prepare_logfile()
self._parse_config()

def _prepare_logfile(self):
logdir = os.path.join(os.environ.get('LOG_DIR', ''))
self._logfile = os.path.join(logdir, 'seadb_databases_cleaner.log')

def _parse_config(self):
self._expire_seconds = 60 * 60 * 24 * TRASH_CLEAN_AFTER_DAYS

def start(self):
if not self.is_enabled():
logging.warning('Can not start seadb databases cleaner: it is not enabled!')
return

logging.info('Start seadb databases cleaner, interval = %s sec', self._interval)

SeaDBDatabasesCleanerTimer(self._interval, self._logfile, self._expire_seconds).start()

def is_enabled(self):
return self._enabled


class SeaDBDatabasesCleanerTimer(Thread):

def __init__(self, interval, logfile,
expire_seconds=30*60):
super(SeaDBDatabasesCleanerTimer, self).__init__()
self._interval = interval
self._logfile = logfile
self._expire_seconds = expire_seconds

self.finished = Event()

def run(self):
while not self.finished.is_set():
self.finished.wait(self._interval)
if not self.finished.is_set():
logging.info('Starts to clean trash seadb databases...')
try:
python_exec = get_python_executable()
manage_py = os.path.join(dtable_web_dir, 'manage.py')
cmd = [
python_exec,
manage_py,
'clean_trash_seadb_databases',
self._expire_seconds,

This comment was marked as low quality.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

复核更正:这里的 会将整数转换为字符串,不会抛出 TypeError; 可正常传给 Django 的 参数。因此原评论所述的阻塞问题不成立。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

复核更正:run() 中的 "%s" % arg 会把整数转换为字符串,不会抛出 TypeError;expire_seconds 可正常传给 Django 的 int 参数。因此原评论所述的阻塞问题不成立。

]
with open(self._logfile, 'a') as fp:
run(cmd, cwd=dtable_web_dir, output=fp)
except Exception as e:
logging.exception('error when cleaning trash seadb databases: %s', e)

def cancel(self):
self.finished.set()
Loading