Просмотр исходного кода

Improved cache invalidation and fixed incorrect event subscription in snapshots

Nuwan Goonasekera 7 лет назад
Родитель
Сommit
0d3345cf94
2 измененных файлов с 14 добавлено и 5 удалено
  1. 13 4
      cloudbridge/cloud/base/events.py
  2. 1 1
      cloudbridge/cloud/providers/azure/services.py

+ 13 - 4
cloudbridge/cloud/base/events.py

@@ -151,20 +151,29 @@ class SimpleEventDispatcher(EventDispatcher):
             raise HandlerException(message)
         return cache_list
 
+    def _invalidate_cache(self, event_pattern=None):
+        if not event_pattern:
+            # invalidate entire cache
+            self.__handler_cache = {}
+        else:
+            # Smarter invalidation by only deleting events that
+            # are affected by the pattern
+            for key in list(self.__handler_cache.keys()):
+                if re.search(fnmatch.translate(event_pattern), key):
+                    del self.__handler_cache[key]
+
     def subscribe(self, event_handler):
         event_handler.dispatcher = self
         handler_list = self.__events.get(event_handler.event_pattern, [])
         handler_list.append(event_handler)
         self.__events[event_handler.event_pattern] = handler_list
-        # invalidate cache
-        self.__handler_cache = {}
+        self._invalidate_cache(event_pattern=event_handler.event_pattern)
 
     def unsubscribe(self, event_handler):
         handler_list = self.__events.get(event_handler.event_pattern, [])
         handler_list.remove(event_handler)
         event_handler.dispatcher = None
-        # invalidate cache
-        self.__handler_cache = {}
+        self._invalidate_cache(event_pattern=event_handler.event_pattern)
 
     def observe(self, event_pattern, priority, callback):
         handler = ObservingEventHandler(event_pattern, priority, callback)

+ 1 - 1
cloudbridge/cloud/providers/azure/services.py

@@ -422,7 +422,7 @@ class AzureSnapshotService(BaseSnapshotService):
                                                                 params)
         return AzureSnapshot(self.provider, azure_snap)
 
-    @implement(event_pattern="provider.storage.volumes.delete",
+    @implement(event_pattern="provider.storage.snapshots.delete",
                priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
     def _delete(self, snapshot):
         snap_id = (snapshot.id if isinstance(snapshot, AzureSnapshot)