This commit is contained in:
jonaswinkler
2021-01-19 14:43:55 +01:00
parent b4e8bb04b0
commit 280ba2fcc2
2 changed files with 64 additions and 7 deletions

View File

@@ -5,7 +5,6 @@ from time import sleep
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
from django.utils.text import slugify
from django_q.tasks import async_task
from watchdog.events import FileSystemEventHandler
from watchdog.observers.polling import PollingObserver
@@ -71,6 +70,31 @@ def _consume(filepath):
"Error while consuming document: {}".format(e))
def _test_inotify(directory):
if not INotify:
return False
test_file = os.path.join(directory, "__inotify_test_file__")
inotify = INotify()
descriptor = None
try:
inotify_flags = flags.CLOSE_WRITE | flags.MOVED_TO
descriptor = inotify.add_watch(directory, inotify_flags)
Path(test_file).touch()
events = inotify.read(timeout=1000)
return len(events) == 1
except Exception as e:
logger.warning(
f"Error while checking inotify availability: {str(e)}")
return False
finally:
if descriptor:
inotify.rm_watch(descriptor)
inotify.close()
if os.path.isfile(test_file):
os.unlink(test_file)
def _consume_wait_unmodified(file, num_tries=20, wait_time=1):
mtime = -1
current_try = 0
@@ -154,17 +178,25 @@ class Command(BaseCommand):
if options["oneshot"]:
return
if settings.CONSUMER_POLLING == 0 and INotify:
self.handle_inotify(directory, recursive)
if settings.CONSUMER_POLLING == 0:
if _test_inotify(directory):
self.handle_inotify(directory, recursive)
else:
logger.warning(
f"Inotify notifications are not available on {directory}, "
f"falling back to polling every 10 seconds")
self.handle_polling(
directory, recursive, 10)
else:
self.handle_polling(directory, recursive)
self.handle_polling(
directory, recursive, settings.CONSUMER_POLLING)
logger.debug("Consumer exiting.")
def handle_polling(self, directory, recursive):
def handle_polling(self, directory, recursive, timeout):
logging.getLogger(__name__).info(
f"Polling directory for changes: {directory}")
self.observer = PollingObserver(timeout=settings.CONSUMER_POLLING)
self.observer = PollingObserver(timeout=timeout)
self.observer.schedule(Handler(), directory, recursive=recursive)
self.observer.start()
try: