From 699f9b16c0fef721e855b87c3b37e8f9c7c08c28 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Thu, 16 Aug 2012 12:06:10 -0400 Subject: [PATCH] cc-4235: workaround for this terrible bug --- .../media-monitor2/media/monitor/listeners.py | 2 ++ .../media-monitor2/media/monitor/manager.py | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/python_apps/media-monitor2/media/monitor/listeners.py b/python_apps/media-monitor2/media/monitor/listeners.py index b41eff9be..48a4cd5bf 100644 --- a/python_apps/media-monitor2/media/monitor/listeners.py +++ b/python_apps/media-monitor2/media/monitor/listeners.py @@ -65,9 +65,11 @@ class BaseListener(object): class OrganizeListener(BaseListener, pyinotify.ProcessEvent, Loggable): def process_IN_CLOSE_WRITE(self, event): + self.logger.info("===> handling: '%s'" % str(event)) self.process_to_organize(event) # got cookie def process_IN_MOVED_TO(self, event): + self.logger.info("===> handling: '%s'" % str(event)) self.process_to_organize(event) def process_default(self, event): diff --git a/python_apps/media-monitor2/media/monitor/manager.py b/python_apps/media-monitor2/media/monitor/manager.py index 11dc6fa9a..283511dbd 100644 --- a/python_apps/media-monitor2/media/monitor/manager.py +++ b/python_apps/media-monitor2/media/monitor/manager.py @@ -1,4 +1,6 @@ import pyinotify +import threading +import time from pydispatch import dispatcher from os.path import normpath @@ -9,6 +11,17 @@ from media.monitor.handler import ProblemFileHandler from media.monitor.organizer import Organizer import media.monitor.pure as mmp + +class ManagerTimeout(threading.Thread,Loggable): + def __init__(self, manager): + threading.Thread.__init__(self) + self.manager = manager + def run(self): + while True: + time.sleep(3) + self.manager.flush_organize() + self.logger.info("Force flushed organize...") + class Manager(Loggable): """ An abstraction over media monitors core pyinotify functions. These @@ -23,6 +36,10 @@ class Manager(Loggable): self.watch_channel = 'watch' self.organize_channel = 'organize' self.watch_listener = StoreWatchListener(signal = self.watch_channel) + # TODO : change this to a weak ref + self.__timeout_thread = ManagerTimeout(self) + self.__timeout_thread.daemon = True + self.__timeout_thread.start() self.organize = { 'organize_path' : None, 'imported_path' : None, @@ -140,6 +157,10 @@ class Manager(Loggable): self.organize['organize_listener'].flush_events(new_path) self.__add_watch(new_path, self.organize['organize_listener']) + def flush_organize(self): + path = self.organize['organize_path'] + self.organize['organize_listener'].flush_events(path) + def get_imported_path(self): return self.organize['imported_path']