You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sentry.apache.org by an...@apache.org on 2016/07/28 21:39:13 UTC
sentry git commit: SENTRY-1415: Provide a hook to stop the active
sentry sevice. (Rahul Sharma, reviewed by Anne Yu).
Repository: sentry
Updated Branches:
refs/heads/sentry-ha-redesign 2ce6bb275 -> 39c473c1f
SENTRY-1415: Provide a hook to stop the active sentry sevice. (Rahul Sharma, reviewed by Anne Yu).
Project: http://git-wip-us.apache.org/repos/asf/sentry/repo
Commit: http://git-wip-us.apache.org/repos/asf/sentry/commit/39c473c1
Tree: http://git-wip-us.apache.org/repos/asf/sentry/tree/39c473c1
Diff: http://git-wip-us.apache.org/repos/asf/sentry/diff/39c473c1
Branch: refs/heads/sentry-ha-redesign
Commit: 39c473c1f47ae73a131bc3ab607d4400a4aabe54
Parents: 2ce6bb2
Author: Anne Yu <an...@cloudera.com>
Authored: Thu Jul 28 15:11:59 2016 -0700
Committer: Anne Yu <an...@cloudera.com>
Committed: Thu Jul 28 15:13:23 2016 -0700
----------------------------------------------------------------------
.../apache/sentry/service/thrift/Activator.java | 9 +++
.../sentry/service/thrift/LeaderStatus.java | 20 +++++
.../sentry/service/thrift/SentryService.java | 35 +++++++++
.../db/service/thrift/TestActivator.java | 53 +++++++++++++
.../sentry/tests/e2e/ha/TestFailover.java | 81 ++++++++++++++++++++
5 files changed, 198 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/sentry/blob/39c473c1/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/Activator.java
----------------------------------------------------------------------
diff --git a/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/Activator.java b/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/Activator.java
index 730dbb1..a261d8d 100644
--- a/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/Activator.java
+++ b/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/Activator.java
@@ -22,6 +22,7 @@ import java.io.Closeable;
import java.io.IOException;
import java.util.Properties;
+import com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.conf.Configuration;
import org.apache.sentry.core.common.exception.SentryStandbyException;
import org.apache.sentry.provider.db.service.persistent.Fencer;
@@ -83,6 +84,14 @@ public class Activator implements Closeable {
this.pmf.close();
}
+ /**
+ * Deactivates this activator.
+ */
+ @VisibleForTesting
+ public void deactivate() throws IOException {
+ leaderStatus.becomeStandby();
+ }
+
private class TransitionHandler implements LeaderStatus.Listener {
@Override
public void becomeActive() throws Exception {
http://git-wip-us.apache.org/repos/asf/sentry/blob/39c473c1/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/LeaderStatus.java
----------------------------------------------------------------------
diff --git a/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/LeaderStatus.java b/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/LeaderStatus.java
index e32e1db..02ff7ff 100644
--- a/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/LeaderStatus.java
+++ b/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/LeaderStatus.java
@@ -16,6 +16,7 @@
*/
package org.apache.sentry.service.thrift;
+import com.google.common.annotations.VisibleForTesting;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
@@ -137,6 +138,25 @@ final class LeaderStatus implements Closeable {
}
}
+ /**
+ * Called by tests to force deactivate(standby) a daemon,
+ * so that another daemon becomes active.
+ * @throws IOException
+ */
+ @VisibleForTesting
+ public void becomeStandby() throws IOException {
+ if (leaderStatusAdaptor != null) {
+ leaderStatusAdaptor.deactivate();
+ } else {
+ try {
+ listener.becomeStandby();
+ } catch (Throwable t) {
+ LOG.error("becomeStandby: " + incarnationId +
+ " threw an unexpected exception", t);
+ }
+ }
+ }
+
@Override
public void close() throws IOException {
if (closed.compareAndSet(false, true)) {
http://git-wip-us.apache.org/repos/asf/sentry/blob/39c473c1/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/SentryService.java
----------------------------------------------------------------------
diff --git a/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/SentryService.java b/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/SentryService.java
index 51dde0e..e93e5b4 100644
--- a/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/SentryService.java
+++ b/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/service/thrift/SentryService.java
@@ -38,6 +38,7 @@ import java.util.concurrent.ThreadFactory;
import javax.security.auth.Subject;
import com.codahale.metrics.Gauge;
+import com.google.common.annotations.VisibleForTesting;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
@@ -324,6 +325,37 @@ public class SentryService implements Callable {
LOGGER.info("Stopped...");
}
+ /**
+ * If the current daemon is active, make it standby.
+ */
+ @VisibleForTesting
+ public synchronized void becomeStandby() throws Exception{
+ try {
+ if(act.isActive()) {
+ LOGGER.info("Server with incarnation id: " + act.getIncarnationId() +
+ " becoming standby");
+ act.deactivate();
+ }
+ } catch (Exception e) {
+ LOGGER.error("Error while deactivating the active sentry daemon", e);
+ }
+ }
+
+ /**
+ * If the current daemon is active, shutdown the server.
+ */
+ @VisibleForTesting
+ public synchronized void shutdownActive() throws Exception{
+ try {
+ if(act.isActive()) {
+ LOGGER.info("Stopping active server with incarnation id: " + act.getIncarnationId());
+ stop();
+ }
+ } catch (Exception e) {
+ LOGGER.error("Error while stopping the active sentry daemon", e);
+ }
+ }
+
// wait for the service thread to finish execution
public synchronized void waitOnFuture() throws ExecutionException, InterruptedException {
LOGGER.info("Waiting on future.get()");
@@ -442,6 +474,9 @@ public class SentryService implements Callable {
return thriftServer.getEventHandler();
}
+ @VisibleForTesting
+ public Activator getActivator() {return act;}
+
public Gauge<Boolean> getIsActiveGauge() {
return new Gauge<Boolean>() {
@Override
http://git-wip-us.apache.org/repos/asf/sentry/blob/39c473c1/sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/service/thrift/TestActivator.java
----------------------------------------------------------------------
diff --git a/sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/service/thrift/TestActivator.java b/sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/service/thrift/TestActivator.java
new file mode 100644
index 0000000..60cfc73
--- /dev/null
+++ b/sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/service/thrift/TestActivator.java
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sentry.provider.db.service.thrift;
+
+import org.apache.sentry.service.thrift.SentryServiceIntegrationBase;
+import org.junit.*;
+
+public class TestActivator extends SentryServiceIntegrationBase {
+
+ @BeforeClass
+ public static void setup() throws Exception {
+ kerberos = false;
+ beforeSetup();
+ setupConf();
+ startSentryService();
+ afterSetup();
+ }
+
+ @Override
+ @Before
+ public void before() throws Exception {
+
+ }
+
+ @Test
+ public void testStopActive() throws Exception {
+ Assert.assertEquals(Boolean.TRUE,server.getActivator().isActive());
+ //stop the current service.
+ server.becomeStandby();
+ Assert.assertEquals(Boolean.FALSE,server.getActivator().isActive());
+ }
+
+ @Override
+ @After
+ public void after() {
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/sentry/blob/39c473c1/sentry-tests/sentry-tests-hive/src/test/java/org/apache/sentry/tests/e2e/ha/TestFailover.java
----------------------------------------------------------------------
diff --git a/sentry-tests/sentry-tests-hive/src/test/java/org/apache/sentry/tests/e2e/ha/TestFailover.java b/sentry-tests/sentry-tests-hive/src/test/java/org/apache/sentry/tests/e2e/ha/TestFailover.java
new file mode 100644
index 0000000..57d579c
--- /dev/null
+++ b/sentry-tests/sentry-tests-hive/src/test/java/org/apache/sentry/tests/e2e/ha/TestFailover.java
@@ -0,0 +1,81 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sentry.tests.e2e.ha;
+
+import org.apache.sentry.tests.e2e.hive.AbstractTestWithStaticConfiguration;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+
+/**
+ * End2End tests with Sentry service HA enabled.
+ */
+public class TestFailover extends AbstractTestWithStaticConfiguration {
+
+ @BeforeClass
+ public static void setupTestStaticConfiguration() throws Exception {
+ useSentryService = true;
+ enableSentryHA = true;
+ clearDbPerTest = false;
+ AbstractTestWithStaticConfiguration.setupTestStaticConfiguration();
+ }
+
+
+ /**
+ * Test service failover. Run Sentry operations with shutting down one or more
+ * of the services.
+ * @throws Exception
+ */
+ @Test
+ public void testFailover() throws Exception {
+ int active = 0;
+ int passive = 1;
+ int maxTries = 10;
+ //get the active service
+ if (getSentrySrv().get(1).getActivator().isActive()) {
+ active = 1;
+ passive = 0;
+ }
+
+ Assert.assertEquals(Boolean.TRUE,getSentrySrv().get(active).getActivator().isActive());
+ Assert.assertEquals(Boolean.FALSE,getSentrySrv().get(passive).getActivator().isActive());
+
+ //stop the active service
+ getSentrySrv().get(active).becomeStandby();
+
+ for(int i = 0; i < maxTries ; i++) {
+ if(!getSentrySrv().get(active).getActivator().isActive()) {
+ break;
+ }
+ Thread.sleep(100);
+ }
+ //assert the active is now standby
+ Assert.assertEquals(Boolean.FALSE,getSentrySrv().get(active).getActivator().isActive());
+ //wait for the passive to become active
+ for(int i = 0; i < maxTries ; i++) {
+ if(getSentrySrv().get(passive).getActivator().isActive()) {
+ break;
+ }
+ Thread.sleep(100);
+ }
+ //assert that the previously passive service is now active
+ Assert.assertEquals(Boolean.TRUE,getSentrySrv().get(passive).getActivator().isActive());
+ }
+
+}