KYLIN-2581 fix possible deadlock in Broadcaster

Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/fd671d16
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/fd671d16
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/fd671d16

Branch: refs/heads/KYLIN-2624
Commit: fd671d165aa59c734b2f273ffae6d1017dc61153
Parents: 320e56a
Author: Yang Li <liy...@apache.org>
Authored: Sun May 14 13:34:58 2017 +0800
Committer: Yang Li <liy...@apache.org>
Committed: Sun May 14 13:35:29 2017 +0800

----------------------------------------------------------------------
 .../kylin/metadata/cachesync/Broadcaster.java   | 66 ++++++++++----------
 1 file changed, 32 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/fd671d16/core-metadata/src/main/java/org/apache/kylin/metadata/cachesync/Broadcaster.java
----------------------------------------------------------------------
diff --git 
a/core-metadata/src/main/java/org/apache/kylin/metadata/cachesync/Broadcaster.java
 
b/core-metadata/src/main/java/org/apache/kylin/metadata/cachesync/Broadcaster.java
index 5b45d9e..1394f7b 100644
--- 
a/core-metadata/src/main/java/org/apache/kylin/metadata/cachesync/Broadcaster.java
+++ 
b/core-metadata/src/main/java/org/apache/kylin/metadata/cachesync/Broadcaster.java
@@ -142,7 +142,7 @@ public class Broadcaster {
     }
 
     public void registerListener(Listener listener, String... entities) {
-        synchronized (CACHE) {
+        synchronized (listenerMap) {
             // ignore re-registration
             List<Listener> all = listenerMap.get(SYNC_ALL);
             if (all != null && all.contains(listener)) {
@@ -181,43 +181,41 @@ public class Broadcaster {
     }
 
     public void notifyListener(String entity, Event event, String cacheKey) 
throws IOException {
-        synchronized (CACHE) {
-            List<Listener> list = listenerMap.get(entity);
-            if (list == null)
-                return;
+        List<Listener> list = listenerMap.get(entity);
+        if (list == null)
+            return;
 
-            logger.debug("Broadcasting metadata change: entity=" + entity + ", 
event=" + event + ", cacheKey=" + cacheKey + ", listeners=" + list);
+        logger.debug("Broadcasting metadata change: entity=" + entity + ", 
event=" + event + ", cacheKey=" + cacheKey + ", listeners=" + list);
 
-            // prevents concurrent modification exception
-            list = Lists.newArrayList(list);
-            switch (entity) {
-            case SYNC_ALL:
-                for (Listener l : list) {
-                    l.onClearAll(this);
-                }
-                clearCache(); // clear broadcaster too in the end
-                break;
-            case SYNC_PRJ_SCHEMA:
-                ProjectManager.getInstance(config).clearL2Cache();
-                for (Listener l : list) {
-                    l.onProjectSchemaChange(this, cacheKey);
-                }
-                break;
-            case SYNC_PRJ_DATA:
-                ProjectManager.getInstance(config).clearL2Cache(); // cube's 
first becoming ready leads to schema change too
-                for (Listener l : list) {
-                    l.onProjectDataChange(this, cacheKey);
-                }
-                break;
-            default:
-                for (Listener l : list) {
-                    l.onEntityChange(this, entity, event, cacheKey);
-                }
-                break;
+        // prevents concurrent modification exception
+        list = Lists.newArrayList(list);
+        switch (entity) {
+        case SYNC_ALL:
+            for (Listener l : list) {
+                l.onClearAll(this);
             }
-
-            logger.debug("Done broadcasting metadata change: entity=" + entity 
+ ", event=" + event + ", cacheKey=" + cacheKey);
+            clearCache(); // clear broadcaster too in the end
+            break;
+        case SYNC_PRJ_SCHEMA:
+            ProjectManager.getInstance(config).clearL2Cache();
+            for (Listener l : list) {
+                l.onProjectSchemaChange(this, cacheKey);
+            }
+            break;
+        case SYNC_PRJ_DATA:
+            ProjectManager.getInstance(config).clearL2Cache(); // cube's first 
becoming ready leads to schema change too
+            for (Listener l : list) {
+                l.onProjectDataChange(this, cacheKey);
+            }
+            break;
+        default:
+            for (Listener l : list) {
+                l.onEntityChange(this, entity, event, cacheKey);
+            }
+            break;
         }
+
+        logger.debug("Done broadcasting metadata change: entity=" + entity + 
", event=" + event + ", cacheKey=" + cacheKey);
     }
 
     /**

Reply via email to