Repository: kylin Updated Branches: refs/heads/2.0.x 55efa3a22 -> 374ce86f8
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/374ce86f Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/374ce86f Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/374ce86f Branch: refs/heads/2.0.x Commit: 374ce86f8963e7baf7a0f3e8718cb484b663b517 Parents: 55efa3a 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:34:58 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/374ce86f/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); } /**