You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by rm...@apache.org on 2017/08/03 17:52:21 UTC

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

Repository: ranger
Updated Branches:
  refs/heads/master 13620b264 -> b6c631dbd


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

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


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

Branch: refs/heads/master
Commit: b6c631dbdba2329b760eedeb58c983555648f504
Parents: 13620b2
Author: yzhou2001 <yz...@yahoo.com>
Authored: Fri Apr 7 14:40:54 2017 -0700
Committer: rmani <rm...@hortonworks.com>
Committed: Thu Aug 3 10:50:53 2017 -0700

----------------------------------------------------------------------
 .../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/b6c631db/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/b6c631db/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 e833d1e..5c4e066 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
@@ -32,6 +32,7 @@ import javax.security.auth.login.Configuration;
 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;
@@ -146,6 +147,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);
 		}