Repository: kylin Updated Branches: refs/heads/master f11f184b0 -> ef7d29083
minor, wipe query cache when update table ACL. Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/2e845c21 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/2e845c21 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/2e845c21 Branch: refs/heads/master Commit: 2e845c21343e4143bfa5a3d6bb54842808c57275 Parents: 0a8bdc2 Author: tttMelody <245915...@qq.com> Authored: Fri Sep 22 18:57:41 2017 +0800 Committer: Jiatao Tao <245915...@qq.com> Committed: Sun Sep 24 17:47:04 2017 +0800 ---------------------------------------------------------------------- .../kylin/metadata/acl/TableACLManager.java | 1 + .../kylin/metadata/cachesync/Broadcaster.java | 15 +++++++++++++++ .../org/apache/kylin/rest/request/SQLRequest.java | 18 ++++++++++++++++-- .../apache/kylin/rest/service/CacheService.java | 5 +++++ .../apache/kylin/rest/service/QueryService.java | 9 +++++++++ 5 files changed, 46 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/2e845c21/core-metadata/src/main/java/org/apache/kylin/metadata/acl/TableACLManager.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/acl/TableACLManager.java b/core-metadata/src/main/java/org/apache/kylin/metadata/acl/TableACLManager.java index 4804cef..4812e1c 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/acl/TableACLManager.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/acl/TableACLManager.java @@ -100,6 +100,7 @@ public class TableACLManager { @Override public void onEntityChange(Broadcaster broadcaster, String entity, Broadcaster.Event event, String cacheKey) throws IOException { reloadTableACL(cacheKey); + broadcaster.notifyProjectACLUpdate(cacheKey); } } http://git-wip-us.apache.org/repos/asf/kylin/blob/2e845c21/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 532ae74..ef19379 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 @@ -65,6 +65,7 @@ public class Broadcaster { public static final String SYNC_ALL = "all"; // the special entity to indicate clear all public static final String SYNC_PRJ_SCHEMA = "project_schema"; // the special entity to indicate project schema has change, e.g. table/model/cube_desc update public static final String SYNC_PRJ_DATA = "project_data"; // the special entity to indicate project data has change, e.g. cube/raw_table update + public static final String SYNC_PRJ_ACL = "project_acl"; // the special entity to indicate query ACL has change, e.g. table_acl/learn_kylin update // static cached instances private static final ConcurrentMap<KylinConfig, Broadcaster> CACHE = new ConcurrentHashMap<KylinConfig, Broadcaster>(); @@ -199,6 +200,7 @@ public class Broadcaster { addListener(lmap, SYNC_ALL, listener); addListener(lmap, SYNC_PRJ_SCHEMA, listener); addListener(lmap, SYNC_PRJ_DATA, listener); + addListener(lmap, SYNC_PRJ_ACL, listener); } } @@ -223,6 +225,10 @@ public class Broadcaster { notifyListener(SYNC_PRJ_DATA, Event.UPDATE, project); } + public void notifyProjectACLUpdate(String project) throws IOException { + notifyListener(SYNC_PRJ_ACL, Event.UPDATE, project); + } + public void notifyListener(String entity, Event event, String cacheKey) throws IOException { notifyListener(entity, event, cacheKey, true); } @@ -268,6 +274,12 @@ public class Broadcaster { l.onProjectDataChange(this, cacheKey); } break; + case SYNC_PRJ_ACL: + ProjectManager.getInstance(config).clearL2Cache(); + for (Listener l : list) { + l.onProjectQueryACLChange(this, cacheKey); + } + break; default: for (Listener l : list) { l.onEntityChange(this, entity, event, cacheKey); @@ -332,6 +344,9 @@ public class Broadcaster { public void onProjectDataChange(Broadcaster broadcaster, String project) throws IOException { } + public void onProjectQueryACLChange(Broadcaster broadcaster, String project) throws IOException { + } + public void onEntityChange(Broadcaster broadcaster, String entity, Event event, String cacheKey) throws IOException { } http://git-wip-us.apache.org/repos/asf/kylin/blob/2e845c21/server-base/src/main/java/org/apache/kylin/rest/request/SQLRequest.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/request/SQLRequest.java b/server-base/src/main/java/org/apache/kylin/rest/request/SQLRequest.java index 54900ba..a98aba7 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/request/SQLRequest.java +++ b/server-base/src/main/java/org/apache/kylin/rest/request/SQLRequest.java @@ -32,6 +32,7 @@ public class SQLRequest implements Serializable { private String sql; private String project; + private String username = ""; private Integer offset = 0; private Integer limit = 0; private boolean acceptPartial = false; @@ -59,6 +60,14 @@ public class SQLRequest implements Serializable { this.project = project; } + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + public String getSql() { return sql; } @@ -95,8 +104,13 @@ public class SQLRequest implements Serializable { if (cacheKey != null) return cacheKey; - cacheKey = Lists.newArrayList(sql.replaceAll("\\s+", ""), project, offset, limit, acceptPartial, - backdoorToggles); + cacheKey = Lists.newArrayList(sql.replaceAll("\\s+", "") // + , project // + , offset // + , limit // + , acceptPartial // + , backdoorToggles // + , username); return cacheKey; } http://git-wip-us.apache.org/repos/asf/kylin/blob/2e845c21/server-base/src/main/java/org/apache/kylin/rest/service/CacheService.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/CacheService.java b/server-base/src/main/java/org/apache/kylin/rest/service/CacheService.java index 536b338..f19290f 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/CacheService.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/CacheService.java @@ -71,6 +71,11 @@ public class CacheService extends BasicService implements InitializingBean { } @Override + public void onProjectQueryACLChange(Broadcaster broadcaster, String project) throws IOException { + cleanDataCache(project); + } + + @Override public void onEntityChange(Broadcaster broadcaster, String entity, Event event, String cacheKey) throws IOException { if ("cube".equals(entity) && event == Event.UPDATE) { final String cubeName = cacheKey; http://git-wip-us.apache.org/repos/asf/kylin/blob/2e845c21/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java index 4cf8556..33dd4e8 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java @@ -373,6 +373,7 @@ public class QueryService extends BasicService { public SQLResponse doQueryWithCache(SQLRequest sqlRequest) { Message msg = MsgPicker.getMsg(); + sqlRequest.setUsername(getUserName()); KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv(); String serverMode = kylinConfig.getServerMode(); @@ -485,6 +486,14 @@ public class QueryService extends BasicService { } } + private String getUserName() { + String username = SecurityContextHolder.getContext().getAuthentication().getName(); + if (StringUtils.isEmpty(username)) { + username = ""; + } + return username; + } + public SQLResponse searchQueryInCache(SQLRequest sqlRequest) { SQLResponse response = null; Cache exceptionCache = cacheManager.getCache(EXCEPTION_QUERY_CACHE);