You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ab...@apache.org on 2019/10/01 15:20:05 UTC

[ranger] branch master updated: RANGER-2510: Support for Incremental tag updates to improve performance - part 2

This is an automated email from the ASF dual-hosted git repository.

abhay pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new d484e2b  RANGER-2510: Support for Incremental tag updates to improve performance - part 2
d484e2b is described below

commit d484e2bad26cc024e36908691138f8c4ac133f47
Author: Abhay Kulkarni <ab...@apache.org>
AuthorDate: Tue Oct 1 08:19:54 2019 -0700

    RANGER-2510: Support for Incremental tag updates to improve performance - part 2
---
 .../plugin/contextenricher/RangerTagEnricher.java  | 427 +++++++++++----------
 .../org/apache/ranger/db/XXPolicyChangeLogDao.java |  28 +-
 .../apache/ranger/db/XXServiceVersionInfoDao.java  |  43 ++-
 .../org/apache/ranger/db/XXTagChangeLogDao.java    |  20 +-
 .../apache/ranger/entity/XXPolicyChangeLog.java    |  42 +-
 .../org/apache/ranger/entity/XXTagChangeLog.java   |  36 +-
 .../java/org/apache/ranger/rest/PublicAPIsv2.java  |  24 +-
 .../apache/ranger/service/RangerTagDefService.java |   9 -
 .../main/resources/META-INF/jpa_named_queries.xml  |   5 -
 .../ranger/service/TestRangerTagDefService.java    |   8 -
 10 files changed, 318 insertions(+), 324 deletions(-)

diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
index 3063885..7434ec9 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
@@ -263,9 +263,6 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher {
 			LOG.info("ServiceTags is null for service " + serviceName);
 			enrichedServiceTags = null;
 		} else  {
-			RangerServiceDefHelper serviceDefHelper = new RangerServiceDefHelper(serviceDef, false);
-			ResourceHierarchies    hierarchies      = new ResourceHierarchies();
-
 			RangerPerfTracer perf = null;
 
 			if(RangerPerfTracer.isPerfTraceEnabled(PERF_SET_SERVICETAGS_LOG)) {
@@ -273,50 +270,14 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher {
 			}
 
 			if (!serviceTags.getIsDelta()) {
-				if (LOG.isDebugEnabled()) {
-					LOG.debug("Received all service-tags");
-				}
-				if (CollectionUtils.isEmpty(serviceTags.getServiceResources())) {
-					LOG.info("There are no tagged resources for service " + serviceName);
-					enrichedServiceTags = null;
-				} else {
-
-					List<RangerServiceResourceMatcher> resourceMatchers = new ArrayList<>();
-					List<RangerServiceResource> serviceResources = serviceTags.getServiceResources();
-
-					for (RangerServiceResource serviceResource : serviceResources) {
-						RangerServiceResourceMatcher serviceResourceMatcher = createRangerServiceResourceMatcher(serviceResource, serviceDefHelper, hierarchies);
-						if (serviceResourceMatcher != null) {
-							resourceMatchers.add(serviceResourceMatcher);
-						} else {
-							LOG.error("Could not create service-resource-matcher for service-resource:[" + serviceResource + "]");
-						}
-					}
-
-					Map<String, RangerResourceTrie<RangerServiceResourceMatcher>> serviceResourceTrie = null;
-
-					if (!disableTrieLookupPrefilter) {
-						serviceResourceTrie = new HashMap<>();
-
-						for (RangerServiceDef.RangerResourceDef resourceDef : serviceDef.getResources()) {
-							serviceResourceTrie.put(resourceDef.getName(), new RangerResourceTrie<>(resourceDef, resourceMatchers));
-						}
-					}
-
-					enrichedServiceTags = new EnrichedServiceTags(serviceTags, resourceMatchers, serviceResourceTrie);
-				}
-
+				processServiceTags(serviceTags);
 			} else {
 				if (LOG.isDebugEnabled()) {
 					LOG.debug("Received service-tag deltas:" + serviceTags);
 				}
 
-				ServiceTags delta          = serviceTags;
 				ServiceTags oldServiceTags = enrichedServiceTags != null ? enrichedServiceTags.getServiceTags() : new ServiceTags();
-
-				ServiceTags                                                   newServiceTags         = rebuildOnlyIndex ? oldServiceTags : RangerServiceTagsDeltaUtil.applyDelta(oldServiceTags, delta);
-				List<RangerServiceResourceMatcher>                            newResourceMatchers    = enrichedServiceTags != null ? enrichedServiceTags.getServiceResourceMatchers() : new ArrayList<>();
-				Map<String, RangerResourceTrie<RangerServiceResourceMatcher>> newServiceResourceTrie = enrichedServiceTags != null ? enrichedServiceTags.getServiceResourceTrie() : new HashMap<>();
+				ServiceTags allServiceTags = rebuildOnlyIndex ? oldServiceTags : RangerServiceTagsDeltaUtil.applyDelta(oldServiceTags, serviceTags);
 
 				if (serviceTags.getTagsChangeExtent() == ServiceTags.TagsChangeExtent.NONE) {
 					if (LOG.isDebugEnabled()) {
@@ -324,128 +285,15 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher {
 					}
 				} else {
 					if (serviceTags.getTagsChangeExtent() != ServiceTags.TagsChangeExtent.TAGS) {
-						if (LOG.isDebugEnabled()) {
-							LOG.debug("Delta contains changes other than tag attribute changes, [" + serviceTags.getTagsChangeExtent() + "]");
-						}
-
-						newServiceResourceTrie = new HashMap<>();
-						newResourceMatchers    = new ArrayList<>();
-
-						if (enrichedServiceTags != null) {
-							newResourceMatchers.addAll(enrichedServiceTags.getServiceResourceMatchers());
-						}
-
-						Map<String, RangerResourceTrie<RangerServiceResourceMatcher>> serviceResourceTrie = enrichedServiceTags != null ? enrichedServiceTags.getServiceResourceTrie() : new HashMap<>();
-
-						for (Map.Entry<String, RangerResourceTrie<RangerServiceResourceMatcher>> entry : serviceResourceTrie.entrySet()) {
-							RangerResourceTrie<RangerServiceResourceMatcher> resourceTrie = new RangerResourceTrie<>(entry.getValue());
-							newServiceResourceTrie.put(entry.getKey(), resourceTrie);
-						}
-
-						List<RangerServiceResource> changedServiceResources = delta.getServiceResources();
-
-						for (RangerServiceResource serviceResource : changedServiceResources) {
-
-							if (enrichedServiceTags != null) {
-
-								if (LOG.isDebugEnabled()) {
-									LOG.debug("Removing service-resource:[" + serviceResource + "] from trie-map");
-								}
-
-								// Remove existing serviceResource from the copy
-
-								RangerAccessResourceImpl accessResource = new RangerAccessResourceImpl();
-
-								for (Map.Entry<String, RangerPolicy.RangerPolicyResource> entry : serviceResource.getResourceElements().entrySet()) {
-									accessResource.setValue(entry.getKey(), entry.getValue());
-								}
-								if (LOG.isDebugEnabled()) {
-									LOG.debug("RangerAccessResource:[" + accessResource + "] created to represent service-resource[" + serviceResource + "] to find evaluators from trie-map");
-								}
-
-								List<RangerServiceResourceMatcher> oldMatchers = getEvaluators(accessResource, enrichedServiceTags);
-
-								if (LOG.isDebugEnabled()) {
-									LOG.debug("Found [" + oldMatchers.size() + "] matchers for service-resource[" + serviceResource + "]");
-								}
-
-								for (RangerServiceResourceMatcher matcher : oldMatchers) {
-
-									for (String resourceDefName : serviceResource.getResourceElements().keySet()) {
-										RangerResourceTrie<RangerServiceResourceMatcher> trie = newServiceResourceTrie.get(resourceDefName);
-										if (trie != null) {
-											trie.delete(serviceResource.getResourceElements().get(resourceDefName), matcher);
-										} else {
-											LOG.error("Cannot find resourceDef with name:[" + resourceDefName + "]. Should NOT happen!!");
-											LOG.error("Setting tagVersion to -1 to ensure that in the next download all tags are downloaded");
-											newServiceTags.setTagVersion(-1L);
-										}
-									}
-								}
-
-								// Remove old resource matchers
-								newResourceMatchers.removeAll(oldMatchers);
-
-								if (LOG.isDebugEnabled()) {
-									LOG.debug("Found and removed [" + oldMatchers.size() + "] matchers for service-resource[" + serviceResource + "] from trie-map");
-								}
-							}
-
-							if (!StringUtils.isEmpty(serviceResource.getResourceSignature())) {
-
-								RangerServiceResourceMatcher resourceMatcher = createRangerServiceResourceMatcher(serviceResource, serviceDefHelper, hierarchies);
-
-								if (resourceMatcher != null) {
-									for (String resourceDefName : serviceResource.getResourceElements().keySet()) {
-
-										RangerResourceTrie<RangerServiceResourceMatcher> trie = newServiceResourceTrie.get(resourceDefName);
-
-										if (trie == null) {
-											List<RangerServiceDef.RangerResourceDef> resourceDefs = serviceDef.getResources();
-											RangerServiceDef.RangerResourceDef found = null;
-											for (RangerServiceDef.RangerResourceDef resourceDef : resourceDefs) {
-												if (StringUtils.equals(resourceDef.getName(), resourceDefName)) {
-													found = resourceDef;
-													break;
-												}
-											}
-											if (found != null) {
-												List<RangerServiceResourceMatcher> resourceMatchers = new ArrayList<>();
-												trie = new RangerResourceTrie<>(found, resourceMatchers);
-												newServiceResourceTrie.put(resourceDefName, trie);
-											}
-										}
-
-										if (trie != null) {
-											trie.add(serviceResource.getResourceElements().get(resourceDefName), resourceMatcher);
-											if (LOG.isDebugEnabled()) {
-												LOG.debug("Added resource-matcher for service-resource:[" + serviceResource + "]");
-											}
-										} else {
-											LOG.error("Could not create resource-matcher for resource: [" + serviceResource + "]. Should NOT happen!!");
-											LOG.error("Setting tagVersion to -1 to ensure that in the next download all tags are downloaded");
-											newServiceTags.setTagVersion(-1L);
-										}
-									}
-									newResourceMatchers.add(resourceMatcher);
-								} else {
-									LOG.error("Could not create resource-matcher for resource: [" + serviceResource + "]. Should NOT happen!!");
-									LOG.error("Setting tagVersion to -1 to ensure that in the next download all tags are downloaded");
-									newServiceTags.setTagVersion(-1L);
-								}
-							} else {
-								if (LOG.isDebugEnabled()) {
-									LOG.debug("Service-resource:[id=" + serviceResource.getId() + "] is deleted as its resource-signature is empty. No need to create it!");
-								}
-							}
-						}
+						processServiceTagDeltas(serviceTags, allServiceTags);
 					} else {
 						if (LOG.isDebugEnabled()) {
 							LOG.debug("Delta contains only tag attribute changes");
 						}
+						List<RangerServiceResourceMatcher>                            resourceMatchers    = enrichedServiceTags != null ? enrichedServiceTags.getServiceResourceMatchers() : new ArrayList<>();
+						Map<String, RangerResourceTrie<RangerServiceResourceMatcher>> serviceResourceTrie = enrichedServiceTags != null ? enrichedServiceTags.getServiceResourceTrie() : new HashMap<>();
+						enrichedServiceTags = new EnrichedServiceTags(allServiceTags, resourceMatchers, serviceResourceTrie);
 					}
-
-					enrichedServiceTags = new EnrichedServiceTags(newServiceTags, newResourceMatchers, newServiceResourceTrie);
 				}
 			}
 			RangerPerfTracer.logAlways(perf);
@@ -499,6 +347,10 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher {
 	public boolean compare(RangerTagEnricher other) {
 		boolean ret;
 
+		if (enrichedServiceTags == null || other == null || other.enrichedServiceTags == null) {
+			return false;
+		}
+
 		if (enrichedServiceTags.getServiceResourceTrie() != null && other.enrichedServiceTags.getServiceResourceTrie() != null) {
 			ret = enrichedServiceTags.getServiceResourceTrie().size() == other.enrichedServiceTags.getServiceResourceTrie().size();
 
@@ -543,65 +395,192 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher {
 		return ret;
 	}
 
-	private Set<RangerTagForEval> findMatchingTags(final RangerAccessRequest request, EnrichedServiceTags dataStore) {
+	private void processServiceTags(ServiceTags serviceTags) {
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("==> RangerTagEnricher.findMatchingTags(" + request + ")");
+			LOG.debug("Processing all service-tags");
 		}
 
-		// To minimize chance for race condition between Tag-Refresher thread and access-evaluation thread
-		final EnrichedServiceTags enrichedServiceTags = dataStore != null ? dataStore : this.enrichedServiceTags;
-
-		Set<RangerTagForEval> ret = null;
+		boolean isInError = false;
 
-		RangerAccessResource resource = request.getResource();
-
-		if ((resource == null || resource.getKeys() == null || resource.getKeys().isEmpty()) && request.isAccessTypeAny()) {
-			ret = enrichedServiceTags.getTagsForEmptyResourceAndAnyAccess();
+		if (CollectionUtils.isEmpty(serviceTags.getServiceResources())) {
+			LOG.info("There are no tagged resources for service " + serviceName);
+			enrichedServiceTags = null;
 		} else {
 
-			final List<RangerServiceResourceMatcher> serviceResourceMatchers = getEvaluators(resource, enrichedServiceTags);
+			RangerServiceDefHelper serviceDefHelper = new RangerServiceDefHelper(serviceDef, false);
+			ResourceHierarchies    hierarchies      = new ResourceHierarchies();
 
-			if (CollectionUtils.isNotEmpty(serviceResourceMatchers)) {
+			List<RangerServiceResourceMatcher> resourceMatchers = new ArrayList<>();
+			List<RangerServiceResource>        serviceResources = serviceTags.getServiceResources();
 
-				for (RangerServiceResourceMatcher resourceMatcher : serviceResourceMatchers) {
+			for (RangerServiceResource serviceResource : serviceResources) {
+				RangerServiceResourceMatcher serviceResourceMatcher = createRangerServiceResourceMatcher(serviceResource, serviceDefHelper, hierarchies);
+				if (serviceResourceMatcher != null) {
+					resourceMatchers.add(serviceResourceMatcher);
+				} else {
+					LOG.error("Could not create service-resource-matcher for service-resource:[" + serviceResource + "]");
+					isInError = true;
+					break;
+				}
+			}
 
-					final RangerPolicyResourceMatcher.MatchType matchType = resourceMatcher.getMatchType(resource, request.getContext());
+			if (isInError) {
+				serviceTags.setTagVersion(-1L);
+				LOG.error("Error in processing tag-deltas. Will continue to use old tags");
+			} else {
+				Map<String, RangerResourceTrie<RangerServiceResourceMatcher>> serviceResourceTrie = null;
 
-					final boolean isMatched;
+				if (!disableTrieLookupPrefilter) {
+					serviceResourceTrie = new HashMap<>();
 
-					if (request.isAccessTypeAny()) {
-						isMatched = matchType != RangerPolicyResourceMatcher.MatchType.NONE;
-					} else if (request.getResourceMatchingScope() == RangerAccessRequest.ResourceMatchingScope.SELF_OR_DESCENDANTS) {
-						isMatched = matchType != RangerPolicyResourceMatcher.MatchType.NONE;
-					} else {
-						isMatched = matchType == RangerPolicyResourceMatcher.MatchType.SELF || matchType == RangerPolicyResourceMatcher.MatchType.ANCESTOR;
+					for (RangerServiceDef.RangerResourceDef resourceDef : serviceDef.getResources()) {
+						serviceResourceTrie.put(resourceDef.getName(), new RangerResourceTrie<>(resourceDef, resourceMatchers));
 					}
+				}
+				enrichedServiceTags = new EnrichedServiceTags(serviceTags, resourceMatchers, serviceResourceTrie);
+			}
+		}
+	}
 
-					if (isMatched) {
-						if (ret == null) {
-							ret = new HashSet<>();
+	private void processServiceTagDeltas(ServiceTags deltas, ServiceTags allServiceTags) {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("Delta contains changes other than tag attribute changes, [" + deltas.getTagsChangeExtent() + "]");
+		}
+
+		boolean isInError = false;
+
+		RangerServiceDefHelper serviceDefHelper = new RangerServiceDefHelper(serviceDef, false);
+		ResourceHierarchies    hierarchies      = new ResourceHierarchies();
+
+		List<RangerServiceResourceMatcher>                            resourceMatchers    = new ArrayList<>();
+		Map<String, RangerResourceTrie<RangerServiceResourceMatcher>> serviceResourceTrie = new HashMap<>();
+
+		if (enrichedServiceTags != null) {
+			resourceMatchers.addAll(enrichedServiceTags.getServiceResourceMatchers());
+			for (Map.Entry<String, RangerResourceTrie<RangerServiceResourceMatcher>> entry : enrichedServiceTags.getServiceResourceTrie().entrySet()) {
+				RangerResourceTrie<RangerServiceResourceMatcher> resourceTrie = new RangerResourceTrie<>(entry.getValue());
+				serviceResourceTrie.put(entry.getKey(), resourceTrie);
+			}
+		}
+
+		List<RangerServiceResource> changedServiceResources = deltas.getServiceResources();
+
+		for (RangerServiceResource serviceResource : changedServiceResources) {
+
+			if (removeOldServiceResource(serviceResource, resourceMatchers, serviceResourceTrie)) {
+
+				if (!StringUtils.isEmpty(serviceResource.getResourceSignature())) {
+
+					RangerServiceResourceMatcher resourceMatcher = createRangerServiceResourceMatcher(serviceResource, serviceDefHelper, hierarchies);
+
+					if (resourceMatcher != null) {
+						for (String resourceDefName : serviceResource.getResourceElements().keySet()) {
+
+							RangerResourceTrie<RangerServiceResourceMatcher> trie = serviceResourceTrie.get(resourceDefName);
+
+							if (trie == null) {
+								List<RangerServiceDef.RangerResourceDef> resourceDefs = serviceDef.getResources();
+								RangerServiceDef.RangerResourceDef found = null;
+								for (RangerServiceDef.RangerResourceDef resourceDef : resourceDefs) {
+									if (StringUtils.equals(resourceDef.getName(), resourceDefName)) {
+										found = resourceDef;
+										break;
+									}
+								}
+								if (found != null) {
+									trie = new RangerResourceTrie<>(found, new ArrayList<>());
+									serviceResourceTrie.put(resourceDefName, trie);
+								}
+							}
+
+							if (trie != null) {
+								trie.add(serviceResource.getResourceElements().get(resourceDefName), resourceMatcher);
+								if (LOG.isDebugEnabled()) {
+									LOG.debug("Added resource-matcher for service-resource:[" + serviceResource + "]");
+								}
+							} else {
+								LOG.error("Could not create resource-matcher for resource: [" + serviceResource + "]. Should NOT happen!!");
+								LOG.error("Setting tagVersion to -1 to ensure that in the next download all tags are downloaded");
+								isInError = true;
+							}
 						}
-						ret.addAll(getTagsForServiceResource(enrichedServiceTags.getServiceTags(), resourceMatcher.getServiceResource(), matchType));
+						resourceMatchers.add(resourceMatcher);
+					} else {
+						LOG.error("Could not create resource-matcher for resource: [" + serviceResource + "]. Should NOT happen!!");
+						LOG.error("Setting tagVersion to -1 to ensure that in the next download all tags are downloaded");
+						isInError = true;
+					}
+				} else {
+					if (LOG.isDebugEnabled()) {
+						LOG.debug("Service-resource:[id=" + serviceResource.getId() + "] is deleted as its resource-signature is empty. No need to create it!");
 					}
-
 				}
+			} else {
+				isInError = true;
+			}
+			if (isInError) {
+				break;
 			}
 		}
+		if (isInError) {
+			LOG.error("Error in processing tag-deltas. Will continue to use old tags");
+			deltas.setTagVersion(-1L);
+		} else {
+			enrichedServiceTags = new EnrichedServiceTags(allServiceTags, resourceMatchers, serviceResourceTrie);
+		}
+
+	}
+
+	private boolean removeOldServiceResource(RangerServiceResource serviceResource, List<RangerServiceResourceMatcher> resourceMatchers, Map<String, RangerResourceTrie<RangerServiceResourceMatcher>> resourceTries) {
+		boolean ret = true;
+
+		if (enrichedServiceTags != null) {
 
-		if (CollectionUtils.isEmpty(ret)) {
 			if (LOG.isDebugEnabled()) {
-				LOG.debug("RangerTagEnricher.findMatchingTags(" + resource + ") - No tags Found ");
+				LOG.debug("Removing service-resource:[" + serviceResource + "] from trie-map");
+			}
+
+			// Remove existing serviceResource from the copy
+
+			RangerAccessResourceImpl accessResource = new RangerAccessResourceImpl();
+
+			for (Map.Entry<String, RangerPolicy.RangerPolicyResource> entry : serviceResource.getResourceElements().entrySet()) {
+				accessResource.setValue(entry.getKey(), entry.getValue());
 			}
-		} else {
 			if (LOG.isDebugEnabled()) {
-				LOG.debug("RangerTagEnricher.findMatchingTags(" + resource + ") - " + ret.size() + " tags Found ");
+				LOG.debug("RangerAccessResource:[" + accessResource + "] created to represent service-resource[" + serviceResource + "] to find evaluators from trie-map");
 			}
-		}
 
-		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== RangerTagEnricher.findMatchingTags(" + request + ")");
-		}
+			List<RangerServiceResourceMatcher> oldMatchers = getEvaluators(accessResource, enrichedServiceTags);
 
+			if (LOG.isDebugEnabled()) {
+				LOG.debug("Found [" + oldMatchers.size() + "] matchers for service-resource[" + serviceResource + "]");
+			}
+
+			for (RangerServiceResourceMatcher matcher : oldMatchers) {
+
+				for (String resourceDefName : serviceResource.getResourceElements().keySet()) {
+					RangerResourceTrie<RangerServiceResourceMatcher> trie = resourceTries.get(resourceDefName);
+					if (trie != null) {
+						trie.delete(serviceResource.getResourceElements().get(resourceDefName), matcher);
+					} else {
+						LOG.error("Cannot find resourceDef with name:[" + resourceDefName + "]. Should NOT happen!!");
+						LOG.error("Setting tagVersion to -1 to ensure that in the next download all tags are downloaded");
+						ret = false;
+						break;
+					}
+				}
+			}
+
+			// Remove old resource matchers
+			if (ret) {
+				resourceMatchers.removeAll(oldMatchers);
+
+				if (LOG.isDebugEnabled()) {
+					LOG.debug("Found and removed [" + oldMatchers.size() + "] matchers for service-resource[" + serviceResource + "] from trie-map");
+				}
+			}
+		}
 		return ret;
 	}
 
@@ -677,6 +656,68 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher {
 		}
 	}
 
+	private Set<RangerTagForEval> findMatchingTags(final RangerAccessRequest request, EnrichedServiceTags dataStore) {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> RangerTagEnricher.findMatchingTags(" + request + ")");
+		}
+
+		// To minimize chance for race condition between Tag-Refresher thread and access-evaluation thread
+		final EnrichedServiceTags enrichedServiceTags = dataStore != null ? dataStore : this.enrichedServiceTags;
+
+		Set<RangerTagForEval> ret = null;
+
+		RangerAccessResource resource = request.getResource();
+
+		if ((resource == null || resource.getKeys() == null || resource.getKeys().isEmpty()) && request.isAccessTypeAny()) {
+			ret = enrichedServiceTags.getTagsForEmptyResourceAndAnyAccess();
+		} else {
+
+			final List<RangerServiceResourceMatcher> serviceResourceMatchers = getEvaluators(resource, enrichedServiceTags);
+
+			if (CollectionUtils.isNotEmpty(serviceResourceMatchers)) {
+
+				for (RangerServiceResourceMatcher resourceMatcher : serviceResourceMatchers) {
+
+					final RangerPolicyResourceMatcher.MatchType matchType = resourceMatcher.getMatchType(resource, request.getContext());
+
+					final boolean isMatched;
+
+					if (request.isAccessTypeAny()) {
+						isMatched = matchType != RangerPolicyResourceMatcher.MatchType.NONE;
+					} else if (request.getResourceMatchingScope() == RangerAccessRequest.ResourceMatchingScope.SELF_OR_DESCENDANTS) {
+						isMatched = matchType != RangerPolicyResourceMatcher.MatchType.NONE;
+					} else {
+						isMatched = matchType == RangerPolicyResourceMatcher.MatchType.SELF || matchType == RangerPolicyResourceMatcher.MatchType.ANCESTOR;
+					}
+
+					if (isMatched) {
+						if (ret == null) {
+							ret = new HashSet<>();
+						}
+						ret.addAll(getTagsForServiceResource(enrichedServiceTags.getServiceTags(), resourceMatcher.getServiceResource(), matchType));
+					}
+
+				}
+			}
+		}
+
+		if (CollectionUtils.isEmpty(ret)) {
+			if (LOG.isDebugEnabled()) {
+				LOG.debug("RangerTagEnricher.findMatchingTags(" + resource + ") - No tags Found ");
+			}
+		} else {
+			if (LOG.isDebugEnabled()) {
+				LOG.debug("RangerTagEnricher.findMatchingTags(" + resource + ") - " + ret.size() + " tags Found ");
+			}
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== RangerTagEnricher.findMatchingTags(" + request + ")");
+		}
+
+		return ret;
+	}
+
 	private List<RangerServiceResourceMatcher> getEvaluators(RangerAccessResource resource, EnrichedServiceTags enrichedServiceTags) {
 		if(LOG.isDebugEnabled()) {
 			LOG.debug("==> RangerTagEnricher.getEvaluators(" + (resource != null ? resource.getAsString() : null) + ")");
@@ -901,7 +942,7 @@ public class RangerTagEnricher extends RangerAbstractContextEnricher {
 
 					if (serviceTags != null) {
 						tagEnricher.setServiceTags(serviceTags);
-						if (serviceTags.getIsDelta()) {
+						if (serviceTags.getIsDelta() && serviceTags.getTagVersion() != -1L) {
 							saveToCache(tagEnricher.enrichedServiceTags.serviceTags);
 						}
 						LOG.info("RangerTagRefresher.populateTags() - Updated tags-cache to new version of tags, lastKnownVersion=" + lastKnownVersion + "; newVersion="
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXPolicyChangeLogDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXPolicyChangeLogDao.java
index 7055391..0a1d1c1 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXPolicyChangeLogDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXPolicyChangeLogDao.java
@@ -41,6 +41,14 @@ public class XXPolicyChangeLogDao extends BaseDao<XXPolicyChangeLog> {
 
     private static final Log LOG = LogFactory.getLog(XXPolicyChangeLogDao.class);
 
+    private static final int POLICY_CHANGE_LOG_RECORD_ID_COLUMN_NUMBER             = 0;
+    private static final int POLICY_CHANGE_LOG_RECORD_CHANGE_TYPE_COLUMN_NUMBER    = 1;
+    private static final int POLICY_CHANGE_LOG_RECORD_POLICY_VERSION_COLUMN_NUMBER = 2;
+    private static final int POLICY_CHANGE_LOG_RECORD_SERVICE_TYPE_COLUMN_NUMBER   = 3;
+    private static final int POLICY_CHANGE_LOG_RECORD_POLICY_TYPE_COLUMN_NUMBER    = 4;
+    private static final int POLICY_CHANGE_LOG_RECORD_POLICY_ID_COLUMN_NUMBER      = 5;
+    private static final int POLICY_CHANGE_LOG_RECORD_ZONE_NAME_COLUMN_NUMBER      = 6;
+
     /**
      * Default Constructor
      */
@@ -57,14 +65,14 @@ public class XXPolicyChangeLogDao extends BaseDao<XXPolicyChangeLog> {
                     .setParameter("serviceId", serviceId)
                     .getResultList();
 
-            // Ensure that some record has the same version as the base-version from where the records are fetched
+            // Ensure that first record has the same version as the base-version from where the records are fetched
             if (CollectionUtils.isNotEmpty(logs)) {
                 Iterator<Object[]> iter = logs.iterator();
                 boolean foundAndRemoved = false;
 
                 while (iter.hasNext()) {
                     Object[] record = iter.next();
-                    Long recordVersion = (Long) record[2];
+                    Long recordVersion = (Long) record[POLICY_CHANGE_LOG_RECORD_POLICY_VERSION_COLUMN_NUMBER];
                     if (version.equals(recordVersion)) {
                         iter.remove();
                         foundAndRemoved = true;
@@ -124,10 +132,10 @@ public class XXPolicyChangeLogDao extends BaseDao<XXPolicyChangeLog> {
 
                 RangerPolicy policy;
 
-                Long    logRecordId      = (Long) log[0];
-                Integer policyChangeType = (Integer) log[1];
-                String  serviceType      = (String) log[3];
-                Long    policyId         = (Long) log[5];
+                Long    logRecordId      = (Long) log[POLICY_CHANGE_LOG_RECORD_ID_COLUMN_NUMBER];
+                Integer policyChangeType = (Integer) log[POLICY_CHANGE_LOG_RECORD_CHANGE_TYPE_COLUMN_NUMBER];
+                String  serviceType      = (String) log[POLICY_CHANGE_LOG_RECORD_SERVICE_TYPE_COLUMN_NUMBER];
+                Long    policyId         = (Long) log[POLICY_CHANGE_LOG_RECORD_POLICY_ID_COLUMN_NUMBER];
 
                 if (policyId != null) {
                     XXPolicy xxPolicy = daoManager.getXXPolicy().getById(policyId);
@@ -148,16 +156,16 @@ public class XXPolicyChangeLogDao extends BaseDao<XXPolicyChangeLog> {
                         // Create a dummy policy as the policy cannot be found - probably already deleted
                         policy = new RangerPolicy();
                         policy.setId(policyId);
-                        policy.setVersion((Long) log[2]);
-                        policy.setPolicyType((Integer) log[4]);
-                        policy.setZoneName((String) log[6]);
+                        policy.setVersion((Long) log[POLICY_CHANGE_LOG_RECORD_POLICY_VERSION_COLUMN_NUMBER]);
+                        policy.setPolicyType((Integer) log[POLICY_CHANGE_LOG_RECORD_POLICY_TYPE_COLUMN_NUMBER]);
+                        policy.setZoneName((String) log[POLICY_CHANGE_LOG_RECORD_ZONE_NAME_COLUMN_NUMBER]);
                     }
                     policy.setServiceType(serviceType);
 
                     ret.add(new RangerPolicyDelta(logRecordId, policyChangeType, policy));
                 } else {
                     if (LOG.isDebugEnabled()) {
-                        LOG.debug("policyId is null! log-record-id:[" + logRecordId + ", service-type:[" + log[3] + "], policy-change-type:[" + log[1] + "]");
+                        LOG.debug("policyId is null! log-record-id:[" + logRecordId + ", service-type:[" + log[POLICY_CHANGE_LOG_RECORD_SERVICE_TYPE_COLUMN_NUMBER] + "], policy-change-type:[" + log[POLICY_CHANGE_LOG_RECORD_CHANGE_TYPE_COLUMN_NUMBER] + "]");
                     }
                     ret.clear();
                     ret.add(new RangerPolicyDelta(logRecordId, policyChangeType, null));
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
index 9f6f024..b18f8f2 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXServiceVersionInfoDao.java
@@ -22,6 +22,8 @@ import java.util.List;
 import javax.persistence.NoResultException;
 
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.ranger.biz.ServiceDBStore;
 import org.apache.ranger.common.db.BaseDao;
 import org.apache.ranger.entity.XXServiceVersionInfo;
@@ -33,6 +35,8 @@ import org.springframework.stereotype.Service;
 @Service
 public class XXServiceVersionInfoDao extends BaseDao<XXServiceVersionInfo> {
 
+	private static final Log LOG = LogFactory.getLog(XXServiceVersionInfoDao.class);
+
 	/**
 	 * Default Constructor
 	 */
@@ -74,6 +78,7 @@ public class XXServiceVersionInfoDao extends BaseDao<XXServiceVersionInfo> {
 
 	public void updateServiceVersionInfoForTagResourceMapCreate(Long resourceId, Long tagId) {
 		if (resourceId == null || tagId == null) {
+			LOG.warn("Unexpected null value for resourceId and/or tagId");
 			return;
 		}
 
@@ -82,12 +87,12 @@ public class XXServiceVersionInfoDao extends BaseDao<XXServiceVersionInfo> {
 
 			updateTagVersionAndTagUpdateTime(serviceVersionInfos, resourceId, tagId);
 		} catch (NoResultException e) {
-			return;
 		}
 	}
 
 	public void updateServiceVersionInfoForTagResourceMapDelete(Long resourceId, Long tagId) {
 		if (resourceId == null || tagId == null) {
+			LOG.warn("Unexpected null value for resourceId and/or tagId");
 			return;
 		}
 
@@ -96,11 +101,11 @@ public class XXServiceVersionInfoDao extends BaseDao<XXServiceVersionInfo> {
 
 			updateTagVersionAndTagUpdateTime(serviceVersionInfos, resourceId, tagId);
 		} catch (NoResultException e) {
-			return;
 		}
 	}
 	public void updateServiceVersionInfoForServiceResourceUpdate(Long resourceId) {
 		if (resourceId == null) {
+			LOG.warn("Unexpected null value for resourceId");
 			return;
 		}
 
@@ -111,12 +116,12 @@ public class XXServiceVersionInfoDao extends BaseDao<XXServiceVersionInfo> {
 
 			updateTagVersionAndTagUpdateTime(serviceVersionInfos, resourceId, tagId);
 		} catch (NoResultException e) {
-			return;
 		}
 	}
 
 	public void updateServiceVersionInfoForTagUpdate(Long tagId) {
 		if (tagId == null) {
+			LOG.warn("Unexpected null value for tagId");
 			return;
 		}
 
@@ -126,13 +131,6 @@ public class XXServiceVersionInfoDao extends BaseDao<XXServiceVersionInfo> {
 
 			updateTagVersionAndTagUpdateTime(serviceVersionInfos, resourceId, tagId);
 		} catch (NoResultException e) {
-			return;
-		}
-	}
-
-	public void updateServiceVersionInfoForTagDefUpdate(Long tagDefId) {
-		if (tagDefId != null) {
-			return;
 		}
 	}
 
@@ -140,23 +138,26 @@ public class XXServiceVersionInfoDao extends BaseDao<XXServiceVersionInfo> {
 
 		if(CollectionUtils.isNotEmpty(serviceVersionInfos) || (resourceId == null && tagId == null)) {
 
-			for (XXServiceVersionInfo serviceVersionInfo : serviceVersionInfos) {
+			final ServiceDBStore.VERSION_TYPE versionType = ServiceDBStore.VERSION_TYPE.TAG_VERSION;
+			final ServiceTags.TagsChangeType  tagChangeType;
 
-				final Long                        serviceId   = serviceVersionInfo.getServiceId();
-				final ServiceDBStore.VERSION_TYPE versionType = ServiceDBStore.VERSION_TYPE.TAG_VERSION;
-				final ServiceTags.TagsChangeType  tagChangeType;
+			if (tagId == null) {
+				tagChangeType = ServiceTags.TagsChangeType.SERVICE_RESOURCE_UPDATE;
+			} else if (resourceId == null) {
+				tagChangeType = ServiceTags.TagsChangeType.TAG_UPDATE;
+			} else {
+				tagChangeType = ServiceTags.TagsChangeType.TAG_RESOURCE_MAP_UPDATE;
+			}
 
-				if (tagId == null) {
-					tagChangeType = ServiceTags.TagsChangeType.SERVICE_RESOURCE_UPDATE;
-				} else if (resourceId == null) {
-					tagChangeType = ServiceTags.TagsChangeType.TAG_UPDATE;
-				} else {
-					tagChangeType = ServiceTags.TagsChangeType.TAG_RESOURCE_MAP_UPDATE;
-				}
+			for (XXServiceVersionInfo serviceVersionInfo : serviceVersionInfos) {
 
+				final Long     serviceId             = serviceVersionInfo.getServiceId();
 				final Runnable serviceVersionUpdater = new ServiceDBStore.ServiceVersionUpdater(daoManager, serviceId, versionType, tagChangeType, resourceId, tagId);
+
 				daoManager.getRangerTransactionSynchronizationAdapter().executeOnTransactionCommit(serviceVersionUpdater);
 			}
+		} else {
+			LOG.warn("Unexpected empty list of serviceVersionInfos and/or null value for resourceId and tagId");
 		}
 
 	}
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXTagChangeLogDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXTagChangeLogDao.java
index ef65e9a..2ca2200 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXTagChangeLogDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXTagChangeLogDao.java
@@ -37,6 +37,12 @@ public class XXTagChangeLogDao extends BaseDao<XXTagChangeLog> {
 
     private static final Log LOG = LogFactory.getLog(XXTagChangeLogDao.class);
 
+    private static final int TAG_CHANGE_LOG_RECORD_ID_COLUMN_NUMBER                  = 0;
+    private static final int TAG_CHANGE_LOG_RECORD_CHANGE_TYPE_COLUMN_NUMBER         = 1;
+    private static final int TAG_CHANGE_LOG_RECORD_VERSION_ID_COLUMN_NUMBER          = 2;
+    private static final int TAG_CHANGE_LOG_RECORD_SERVICE_RESOURCE_ID_COLUMN_NUMBER = 3;
+    private static final int TAG_CHANGE_LOG_RECORD_TAG_ID_COLUMN_NUMBER              = 4;
+
     /**
      * Default Constructor
      */
@@ -52,14 +58,14 @@ public class XXTagChangeLogDao extends BaseDao<XXTagChangeLog> {
                     .setParameter("version", version)
                     .setParameter("serviceId", serviceId)
                     .getResultList();
-            // Ensure that some record has the same version as the base-version from where the records are fetched
+            // Ensure that first record has the same version as the base-version from where the records are fetched
             if (CollectionUtils.isNotEmpty(logs)) {
                 Iterator<Object[]> iter = logs.iterator();
                 boolean foundAndRemoved = false;
 
                 while (iter.hasNext()) {
                     Object[] record = iter.next();
-                    Long recordVersion = (Long) record[2];
+                    Long recordVersion = (Long) record[TAG_CHANGE_LOG_RECORD_VERSION_ID_COLUMN_NUMBER];
                     if (version.equals(recordVersion)) {
                         iter.remove();
                         foundAndRemoved = true;
@@ -103,11 +109,11 @@ public class XXTagChangeLogDao extends BaseDao<XXTagChangeLog> {
 
             for (Object[] log : queryResult) {
 
-                Long logRecordId = (Long) log[0];
-                Integer tagChangeType = (Integer) log[1];
-                Long serviceTagsVersion = (Long) log[2];
-                Long serviceResourceId = (Long) log[3];
-                Long tagId = (Long) log[4];
+                Long logRecordId        = (Long) log[TAG_CHANGE_LOG_RECORD_ID_COLUMN_NUMBER];
+                Integer tagChangeType   = (Integer) log[TAG_CHANGE_LOG_RECORD_CHANGE_TYPE_COLUMN_NUMBER];
+                Long serviceTagsVersion = (Long) log[TAG_CHANGE_LOG_RECORD_VERSION_ID_COLUMN_NUMBER];
+                Long serviceResourceId  = (Long) log[TAG_CHANGE_LOG_RECORD_SERVICE_RESOURCE_ID_COLUMN_NUMBER];
+                Long tagId              = (Long) log[TAG_CHANGE_LOG_RECORD_TAG_ID_COLUMN_NUMBER];
 
                 ret.add(new XXTagChangeLog(logRecordId, tagChangeType, serviceTagsVersion, serviceResourceId, tagId));
             }
diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXPolicyChangeLog.java b/security-admin/src/main/java/org/apache/ranger/entity/XXPolicyChangeLog.java
index df87f70..bc48d4a 100644
--- a/security-admin/src/main/java/org/apache/ranger/entity/XXPolicyChangeLog.java
+++ b/security-admin/src/main/java/org/apache/ranger/entity/XXPolicyChangeLog.java
@@ -20,6 +20,7 @@
 package org.apache.ranger.entity;
 
 import java.util.Date;
+import java.util.Objects;
 
 import javax.persistence.Cacheable;
 import javax.persistence.Entity;
@@ -188,45 +189,12 @@ public class XXPolicyChangeLog implements java.io.Serializable {
             return false;
         if (getClass() != obj.getClass())
             return false;
+
         XXPolicyChangeLog other = (XXPolicyChangeLog) obj;
-        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
-            return false;
-        }
-        if ((this.serviceId == null && other.serviceId != null) || (this.serviceId != null && !this.serviceId.equals(other.serviceId))) {
-            return false;
-        }
-        if ((this.policyVersion == null && other.policyVersion != null) || (this.policyVersion != null && !this.policyVersion.equals(other.policyVersion))) {
-            return false;
-        }
-        if ((this.createTime == null && other.createTime != null) || (this.createTime != null && !this.createTime.equals(other.createTime))) {
-            return false;
-        }
-        if ((this.changeType == null && other.changeType != null) || (this.changeType != null && !this.changeType.equals(other.changeType))) {
-            return false;
-        }
-		if ((this.serviceType == null && other.serviceType != null) || (this.serviceType != null && !this.serviceType.equals(other.serviceType))) {
-			return false;
-		}
-		if ((this.policyType == null && other.policyType != null) || (this.policyType != null && !this.policyType.equals(other.policyType))) {
-			return false;
-		}
-        if ((this.zoneName == null && other.zoneName != null) || (this.zoneName != null && !this.zoneName.equals(other.zoneName))) {
-            return false;
-        }
-		if ((this.policyId == null && other.policyId != null) || (this.policyId != null && !this.policyId.equals(other.policyId))) {
-			return false;
-		}
-		return true;
-    }
 
-    public static boolean equals(Object object1, Object object2) {
-        if (object1 == object2) {
-            return true;
-        }
-        if ((object1 == null) || (object2 == null)) {
-            return false;
-        }
-        return object1.equals(object2);
+        return Objects.equals(this.id, other.id) && Objects.equals(this.serviceId, other.serviceId) && Objects.equals(this.policyVersion, other.policyVersion)
+                && Objects.equals(this.createTime, other.createTime) && Objects.equals(this.changeType, other.changeType) && Objects.equals(this.serviceType, other.serviceType)
+                && Objects.equals(this.policyType, other.policyType) && Objects.equals(this.zoneName, other.zoneName) && Objects.equals(this.policyId, other.policyId);
     }
 
 }
diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXTagChangeLog.java b/security-admin/src/main/java/org/apache/ranger/entity/XXTagChangeLog.java
index c3eb144..9f1002c 100644
--- a/security-admin/src/main/java/org/apache/ranger/entity/XXTagChangeLog.java
+++ b/security-admin/src/main/java/org/apache/ranger/entity/XXTagChangeLog.java
@@ -20,6 +20,7 @@
 package org.apache.ranger.entity;
 
 import java.util.Date;
+import java.util.Objects;
 
 import javax.persistence.Cacheable;
 import javax.persistence.Entity;
@@ -179,39 +180,12 @@ public class XXTagChangeLog implements java.io.Serializable {
             return false;
         if (getClass() != obj.getClass())
             return false;
+
         XXTagChangeLog other = (XXTagChangeLog) obj;
-        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
-            return false;
-        }
-        if ((this.createTime == null && other.createTime != null) || (this.createTime != null && !this.createTime.equals(other.createTime))) {
-            return false;
-        }
-        if ((this.serviceId == null && other.serviceId != null) || (this.serviceId != null && !this.serviceId.equals(other.serviceId))) {
-            return false;
-        }
-        if ((this.changeType == null && other.changeType != null) || (this.changeType != null && !this.changeType.equals(other.changeType))) {
-            return false;
-        }
-        if ((this.serviceTagsVersion == null && other.serviceTagsVersion != null) || (this.serviceTagsVersion != null && !this.serviceTagsVersion.equals(other.serviceTagsVersion))) {
-            return false;
-        }
-        if ((this.serviceResourceId == null && other.serviceResourceId != null) || (this.serviceResourceId != null && !this.serviceResourceId.equals(other.serviceResourceId))) {
-            return false;
-        }
-        if ((this.tagId == null && other.tagId != null) || (this.tagId != null && !this.tagId.equals(other.tagId))) {
-            return false;
-        }
-        return true;
-    }
 
-    public static boolean equals(Object object1, Object object2) {
-        if (object1 == object2) {
-            return true;
-        }
-        if ((object1 == null) || (object2 == null)) {
-            return false;
-        }
-        return object1.equals(object2);
+        return Objects.equals(this.id, other.id) && Objects.equals(this.createTime, other.createTime) && Objects.equals(this.serviceId, other.serviceId)
+                && Objects.equals(this.changeType, other.changeType) && Objects.equals(this.serviceTagsVersion, other.serviceTagsVersion)
+                && Objects.equals(this.serviceResourceId, other.serviceResourceId) && Objects.equals(this.tagId, other.tagId);
     }
 
 }
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java b/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java
index c33841d..f329d17 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java
@@ -62,6 +62,9 @@ public class PublicAPIsv2 {
 	ServiceREST serviceREST;
 
 	@Autowired
+	TagREST tagREST;
+
+	@Autowired
 	SecurityZoneREST securityZoneRest;
 
 	@Autowired
@@ -527,15 +530,30 @@ public class PublicAPIsv2 {
 	@DELETE
 	@Path("/api/server/policydeltas")
 	@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-	public void deletePolicyDeltas(@DefaultValue("7") @QueryParam("days") Integer olderThan, @DefaultValue("false") @QueryParam("reloadServicePoliciesCache") Boolean reloadServicePoliciesCache, @Context HttpServletRequest request) {
+	public void deletePolicyDeltas(@DefaultValue("7") @QueryParam("days") Integer olderThan, @Context HttpServletRequest request) {
 		if (logger.isDebugEnabled()) {
-			logger.debug("==> PublicAPIsv2.deletePolicyDeltas(" + olderThan + ", " + reloadServicePoliciesCache + ")");
+			logger.debug("==> PublicAPIsv2.deletePolicyDeltas(" + olderThan + ")");
 		}
 
 		serviceREST.deletePolicyDeltas(olderThan, request);
 
 		if (logger.isDebugEnabled()) {
-			logger.debug("<== PublicAPIsv2.deletePolicyDeltas(" + olderThan + ", " + reloadServicePoliciesCache + ")");
+			logger.debug("<== PublicAPIsv2.deletePolicyDeltas(" + olderThan + ")");
+		}
+	}
+
+	@DELETE
+	@Path("/api/server/tagdeltas")
+	@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+	public void deleteTagDeltas(@DefaultValue("7") @QueryParam("days") Integer olderThan, @Context HttpServletRequest request) {
+		if (logger.isDebugEnabled()) {
+			logger.debug("==> PublicAPIsv2.deleteTagDeltas(" + olderThan + ")");
+		}
+
+		tagREST.deleteTagDeltas(olderThan, request);
+
+		if (logger.isDebugEnabled()) {
+			logger.debug("<== PublicAPIsv2.deleteTagDeltas(" + olderThan + ")");
 		}
 	}
 
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
index d4350b6..8f67799 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
@@ -52,15 +52,6 @@ public class RangerTagDefService extends RangerTagDefServiceBase<XXTagDef, Range
 
 	}
 
-	@Override
-	public RangerTagDef postUpdate(XXTagDef tagDef) {
-		RangerTagDef ret = super.postUpdate(tagDef);
-
-		daoMgr.getXXServiceVersionInfo().updateServiceVersionInfoForTagDefUpdate(tagDef.getId());
-
-		return ret;
-	}
-
 	public RangerTagDef getPopulatedViewObject(XXTagDef xObj) {
 		return populateViewBean(xObj);
 	}
diff --git a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
index 9714fa9..ab8e675 100755
--- a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
+++ b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
@@ -1563,11 +1563,6 @@
 
 
 	<!-- XXTagChangeLog -->
-	<named-query name="XXTagChangeLog.findByServiceId">
-		<query>
-			select obj from XXTagChangeLog obj where obj.serviceId = :serviceId
-		</query>
-	</named-query>
 	<named-query name="XXTagChangeLog.findSinceVersion">
 		<query>
 			select obj.id, obj.changeType, obj.serviceTagsVersion, obj.serviceResourceId, obj.tagId from
diff --git a/security-admin/src/test/java/org/apache/ranger/service/TestRangerTagDefService.java b/security-admin/src/test/java/org/apache/ranger/service/TestRangerTagDefService.java
index 160a53c..c031c94 100644
--- a/security-admin/src/test/java/org/apache/ranger/service/TestRangerTagDefService.java
+++ b/security-admin/src/test/java/org/apache/ranger/service/TestRangerTagDefService.java
@@ -21,7 +21,6 @@ import java.util.Date;
 import java.util.List;
 
 import org.apache.ranger.db.RangerDaoManager;
-import org.apache.ranger.db.XXServiceVersionInfoDao;
 import org.apache.ranger.db.XXTagDefDao;
 import org.apache.ranger.entity.XXTagAttributeDef;
 import org.apache.ranger.entity.XXTagDef;
@@ -79,18 +78,11 @@ public class TestRangerTagDefService {
 		xxTagAttributeDef.setId(id);
 		xxTagAttributeDef.setName(name);
 		tagAttrDefList.add(xxTagAttributeDef);
-		
-		XXServiceVersionInfoDao xxServiceVersionInfoDao = Mockito.mock(XXServiceVersionInfoDao.class);
 
-		Mockito.when(daoMgr.getXXServiceVersionInfo()).thenReturn(xxServiceVersionInfoDao);
-		Mockito.doNothing().when(xxServiceVersionInfoDao).updateServiceVersionInfoForTagDefUpdate(tagDef.getId());
-		
 		RangerTagDef result = rangerTagDefService.postUpdate(tagDef);
 		Assert.assertEquals(result.getId(), tagAttrDefList.get(0).getId());
 		Assert.assertEquals(result.getName(), tagAttrDefList.get(0).getName());
 
-		Mockito.verify(daoMgr).getXXServiceVersionInfo();
-		Mockito.verify(xxServiceVersionInfoDao).updateServiceVersionInfoForTagDefUpdate(tagDef.getId());
 	}
 		
 	@Test