You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by pr...@apache.org on 2018/09/26 15:42:48 UTC

[6/9] ranger git commit: RANGER-1502: Solr shutdown does not cause the audit log file to be flushed and closed

RANGER-1502: Solr shutdown does not cause the audit log file to be flushed and closed

Signed-off-by: rmani <rm...@hortonworks.com>

(cherry picked from commit b6c631dbdba2329b760eedeb58c983555648f504)


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

Branch: refs/heads/ranger-0.7
Commit: 302c20a595b93c5af7824f56b7b922fa494d5986
Parents: 73b8c6e
Author: yzhou2001 <yz...@yahoo.com>
Authored: Sat Apr 8 03:10:54 2017 +0530
Committer: Pradeep <pr...@apache.org>
Committed: Wed Sep 26 20:55:29 2018 +0530

----------------------------------------------------------------------
 .../audit/provider/AuditProviderFactory.java     | 19 ++++++++++++++++++-
 .../solr/authorizer/RangerSolrAuthorizer.java    |  6 ++++++
 2 files changed, 24 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ranger/blob/302c20a5/agents-audit/src/main/java/org/apache/ranger/audit/provider/AuditProviderFactory.java
----------------------------------------------------------------------
diff --git a/agents-audit/src/main/java/org/apache/ranger/audit/provider/AuditProviderFactory.java b/agents-audit/src/main/java/org/apache/ranger/audit/provider/AuditProviderFactory.java
index b37011e..43107ba 100644
--- a/agents-audit/src/main/java/org/apache/ranger/audit/provider/AuditProviderFactory.java
+++ b/agents-audit/src/main/java/org/apache/ranger/audit/provider/AuditProviderFactory.java
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -73,6 +74,7 @@ public class AuditProviderFactory {
 	private AuditHandler mProvider = null;
 	private String componentAppType = "";
 	private boolean mInitDone = false;
+	private JVMShutdownHook jvmShutdownHook = null;
 
 	private AuditProviderFactory() {
 		LOG.info("AuditProviderFactory: creating..");
@@ -106,6 +108,16 @@ public class AuditProviderFactory {
 		return mInitDone;
 	}
 
+	/**
+	 * call shutdown hook to provide a way to
+	 * shutdown gracefully in addition to the ShutdownHook mechanism
+	 */
+	public void shutdown() {
+		if (isInitDone() && jvmShutdownHook != null) {
+			jvmShutdownHook.run();
+		}
+	}
+
 	public synchronized void init(Properties props, String appType) {
 		LOG.info("AuditProviderFactory: initializing..");
 
@@ -463,7 +475,7 @@ public class AuditProviderFactory {
 
 	private void installJvmSutdownHook(Properties props) {
 		int shutdownHookMaxWaitSeconds = MiscUtil.getIntProperty(props, AUDIT_SHUTDOWN_HOOK_MAX_WAIT_SEC, AUDIT_SHUTDOWN_HOOK_MAX_WAIT_SEC_DEFAULT);
-		JVMShutdownHook jvmShutdownHook = new JVMShutdownHook(mProvider, shutdownHookMaxWaitSeconds);
+		jvmShutdownHook = new JVMShutdownHook(mProvider, shutdownHookMaxWaitSeconds);
 		ShutdownHookManager.get().addShutdownHook(jvmShutdownHook, RANGER_AUDIT_SHUTDOWN_HOOK_PRIORITY);
 	}
 
@@ -503,6 +515,7 @@ public class AuditProviderFactory {
 		final Semaphore doneCleanup = new Semaphore(0);
 		final Thread cleanupThread;
 		final int maxWait;
+		final AtomicBoolean done = new AtomicBoolean(false);
 
 		public JVMShutdownHook(AuditHandler provider, int maxWait) {
 			this.maxWait = maxWait;
@@ -513,6 +526,10 @@ public class AuditProviderFactory {
 		}
 
 		public void run() {
+			if (!done.compareAndSet(false, true)) {
+				LOG.info("==> JVMShutdownHook.run() already done by another thread");
+				return;
+			}
 			LOG.info("==> JVMShutdownHook.run()");
 			LOG.info("JVMShutdownHook: Signalling async audit cleanup to start.");
 			startCleanup.release();

http://git-wip-us.apache.org/repos/asf/ranger/blob/302c20a5/plugin-solr/src/main/java/org/apache/ranger/authorization/solr/authorizer/RangerSolrAuthorizer.java
----------------------------------------------------------------------
diff --git a/plugin-solr/src/main/java/org/apache/ranger/authorization/solr/authorizer/RangerSolrAuthorizer.java b/plugin-solr/src/main/java/org/apache/ranger/authorization/solr/authorizer/RangerSolrAuthorizer.java
index 78b4ac4..068ac27 100644
--- a/plugin-solr/src/main/java/org/apache/ranger/authorization/solr/authorizer/RangerSolrAuthorizer.java
+++ b/plugin-solr/src/main/java/org/apache/ranger/authorization/solr/authorizer/RangerSolrAuthorizer.java
@@ -34,6 +34,7 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.ranger.audit.provider.AuditProviderFactory;
 import org.apache.ranger.audit.provider.MiscUtil;
 import org.apache.ranger.authorization.hadoop.config.RangerConfiguration;
 import org.apache.ranger.plugin.audit.RangerMultiResourceAuditHandler;
@@ -148,6 +149,11 @@ public class RangerSolrAuthorizer implements AuthorizationPlugin {
 		logger.info("close() called");
 		try {
 			solrPlugin.cleanup();
+			/* Solr shutdown is not graceful so that JVM shutdown hooks
+			 * are not always invoked and the audit store are not flushed. So
+			 * we are forcing a cleanup here.
+			 */
+			AuditProviderFactory.getInstance().shutdown();
 		} catch (Throwable t) {
 			logger.error("Error cleaning up Ranger plugin. Ignoring error", t);
 		}