RANGER-2337: Context-Enrichers need to clean up completely when the policy-engine is destroyed
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerAbstractContextEnricher.java b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerAbstractContextEnricher.java
index a745112..ddc6df2 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerAbstractContextEnricher.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerAbstractContextEnricher.java
@@ -30,6 +30,8 @@
 import org.apache.ranger.plugin.model.RangerServiceDef;
 import org.apache.ranger.plugin.model.RangerServiceDef.RangerContextEnricherDef;
 import org.apache.ranger.plugin.policyengine.RangerAccessRequest;
+import org.apache.ranger.plugin.service.RangerAuthContext;
+import org.apache.ranger.plugin.service.RangerBasePlugin;
 
 
 public abstract class RangerAbstractContextEnricher implements RangerContextEnricher {
@@ -65,7 +67,14 @@
 		if(LOG.isDebugEnabled()) {
 			LOG.debug("==> RangerAbstractContextEnricher.init(" + enricherDef + ")");
 		}
-
+		Map<String, RangerBasePlugin> servicePluginMap = RangerBasePlugin.getServicePluginMap();
+		RangerBasePlugin plugin = servicePluginMap != null ? servicePluginMap.get(getServiceName()) : null;
+		if (plugin != null) {
+			RangerAuthContext currentAuthContext = plugin.getCurrentRangerAuthContext();
+			if (currentAuthContext != null) {
+				currentAuthContext.addOrReplaceRequestContextEnricher(this, null);
+			}
+		}
 		if(LOG.isDebugEnabled()) {
 			LOG.debug("<== RangerAbstractContextEnricher.init(" + enricherDef + ")");
 		}
@@ -78,11 +87,37 @@
 
 	@Override
 	public boolean preCleanup() {
+		if(LOG.isDebugEnabled()) {
+			LOG.debug("==> RangerAbstractContextEnricher.preCleanup(" + enricherDef + ")");
+		}
+		Map<String, RangerBasePlugin> servicePluginMap = RangerBasePlugin.getServicePluginMap();
+		RangerBasePlugin plugin = servicePluginMap != null ? servicePluginMap.get(getServiceName()) : null;
+		if (plugin != null) {
+			RangerAuthContext currentAuthContext = plugin.getCurrentRangerAuthContext();
+			if (currentAuthContext != null) {
+				currentAuthContext.cleanupRequestContextEnricher(this);
+			}
+		}
+		if(LOG.isDebugEnabled()) {
+			LOG.debug("<== RangerAbstractContextEnricher.preCleanup(" + enricherDef + ")");
+		}
+
 		return true;
 	}
 
 	@Override
 	public void cleanup() {
+		preCleanup();
+	}
+
+	@Override
+	protected void finalize() throws Throwable {
+		try {
+			cleanup();
+		}
+		finally {
+			super.finalize();
+		}
 	}
 
 	@Override
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 d671b73..2a0797c 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
@@ -314,6 +314,8 @@
 	public boolean preCleanup() {
 		boolean ret = true;
 
+		super.preCleanup();
+
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> RangerTagEnricher.preCleanup()");
 		}
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerAuthContext.java b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerAuthContext.java
index b898d29..b36a30f 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerAuthContext.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerAuthContext.java
@@ -81,6 +81,12 @@
         requestContextEnrichers.put(enricher, database);
     }
 
+    public void cleanupRequestContextEnricher(RangerContextEnricher enricher) {
+        if (requestContextEnrichers != null) {
+            requestContextEnrichers.remove(enricher);
+        }
+    }
+
     @Override
     public void setUseForwardedIPAddress(boolean useForwardedIPAddress) {
         policyEngine.setUseForwardedIPAddress(useForwardedIPAddress);