You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sentry.apache.org by ak...@apache.org on 2017/07/11 21:38:22 UTC
sentry git commit: SENTRY-1833: Expose current set of IDs as Sentry
metrics (Alex Kolbasov, reviewed by: Na Li, Vamsee Yarlagadda,
Kalyan Kalvagadda)
Repository: sentry
Updated Branches:
refs/heads/sentry-ha-redesign 747c22601 -> 037059774
SENTRY-1833: Expose current set of IDs as Sentry metrics (Alex Kolbasov, reviewed by: Na Li, Vamsee Yarlagadda, Kalyan Kalvagadda)
Project: http://git-wip-us.apache.org/repos/asf/sentry/repo
Commit: http://git-wip-us.apache.org/repos/asf/sentry/commit/03705977
Tree: http://git-wip-us.apache.org/repos/asf/sentry/tree/03705977
Diff: http://git-wip-us.apache.org/repos/asf/sentry/diff/03705977
Branch: refs/heads/sentry-ha-redesign
Commit: 03705977464e8ff596aa6652b798cada4c0a5a72
Parents: 747c226
Author: Alexander Kolbasov <ak...@cloudera.com>
Authored: Tue Jul 11 23:38:06 2017 +0200
Committer: Alexander Kolbasov <ak...@cloudera.com>
Committed: Tue Jul 11 23:38:06 2017 +0200
----------------------------------------------------------------------
.../db/service/persistent/SentryStore.java | 122 +++++++++++++++----
.../db/service/thrift/SentryMetrics.java | 9 +-
2 files changed, 104 insertions(+), 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/sentry/blob/03705977/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStore.java
----------------------------------------------------------------------
diff --git a/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStore.java b/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStore.java
index c6f3cc8..350c922 100644
--- a/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStore.java
+++ b/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStore.java
@@ -206,17 +206,16 @@ public class SentryStore {
prop.setProperty(ServerConfig.JAVAX_JDO_DRIVER_NAME, driverName);
/*
- * Oracle doesn't support "repeatable-read" isolation level, so we use
- * "serializable" instead. This should be handled by Datanucleus, but it
- * incorrectly states that "repeatable-read" is supported and Oracle barks
- * at run-time. This code is a hack, but until it is fixed in Datanucleus
- * we can't do much.
- *
- * JDBC URL always looks like jdbc:oracle:<drivertype>:@<database>
- * we look at the second component.
- *
- * The isolation property can be overwritten via configuration property.
- */
+ * Oracle doesn't support "repeatable-read" isolation level, so we use* "serializable" instead. This should be handled by Datanucleus, but it
+ * incorrectly states that "repeatable-read" is supported and Oracle barks
+ * at run-time. This code is a hack, but until it is fixed in Datanucleus
+ * we can't do much.
+ *
+ * JDBC URL always looks like jdbc:oracle:<drivertype>:@<database>
+ * we look at the second component.
+ *
+ * The isolation property can be overwritten via configuration property.
+ */
final String oracleDb = "oracle";
if (prop.getProperty(ServerConfig.DATANUCLEUS_ISOLATION_LEVEL, "").
equals(ServerConfig.DATANUCLEUS_REPEATABLE_READ) &&
@@ -290,20 +289,6 @@ public class SentryStore {
}
}
- private void rollbackTransaction(PersistenceManager pm) {
- if (pm == null || pm.isClosed()) {
- return;
- }
- Transaction currentTransaction = pm.currentTransaction();
- if (currentTransaction.isActive()) {
- try {
- currentTransaction.rollback();
- } finally {
- pm.close();
- }
- }
- }
-
/**
* Get a single role with the given name inside a transaction
* @param pm Persistence Manager instance
@@ -475,6 +460,71 @@ public class SentryStore {
}
/**
+ * @return ID of the path snapshot
+ */
+ public Gauge<Long> getLastPathsSnapshotIdGauge() {
+ return new Gauge<Long>() {
+ @Override
+ public Long getValue() {
+ try {
+ return getCurrentAuthzPathsSnapshotID();
+ } catch (Exception e) {
+ LOGGER.error("Can not read current paths snapshot ID", e);
+ return NOTIFICATION_UNKNOWN;
+ }
+ }
+ };
+ }
+
+ /**
+ * @return Permissions change ID
+ */
+ public Gauge<Long> getPermChangeIdGauge() {
+ return new Gauge<Long>() {
+ @Override
+ public Long getValue() {
+ try {
+ return tm.executeTransaction(
+ new TransactionBlock<Long>() {
+ @Override
+ public Long execute(PersistenceManager pm) throws Exception {
+ return getLastProcessedChangeIDCore(pm, MSentryPermChange.class);
+ }
+ }
+ );
+ } catch (Exception e) {
+ LOGGER.error("Can not read current permissions change ID", e);
+ return NOTIFICATION_UNKNOWN;
+ }
+ }
+ };
+ }
+
+ /**
+ * @return Path change id
+ */
+ public Gauge<Long> getPathChangeIdGauge() {
+ return new Gauge<Long>() {
+ @Override
+ public Long getValue() {
+ try {
+ return tm.executeTransaction(
+ new TransactionBlock<Long>() {
+ @Override
+ public Long execute(PersistenceManager pm) throws Exception {
+ return getLastProcessedChangeIDCore(pm, MSentryPathChange.class);
+ }
+ }
+ );
+ } catch (Exception e) {
+ LOGGER.error("Can not read current path change ID", e);
+ return NOTIFICATION_UNKNOWN;
+ }
+ }
+ };
+ }
+
+ /**
* Lets the test code know how many privs are in the db, so that we know
* if they are in fact being cleaned up when not being referenced any more.
* @return The number of rows in the db priv table.
@@ -2601,7 +2651,8 @@ public class SentryStore {
}
/**
- * Gets the last authorization path snapshot ID persisted.
+ * Get the last authorization path snapshot ID persisted.
+ * Always executed in the transaction context.
*
* @param pm The PersistenceManager object.
* @return the last persisted snapshot ID. It returns 0 if no rows are found.
@@ -2610,6 +2661,25 @@ public class SentryStore {
return getMaxPersistedIDCore(pm, MAuthzPathsSnapshotId.class, "authzSnapshotID", EMPTY_PATHS_SNAPSHOT_ID);
}
+
+ /**
+ * Get the last authorization path snapshot ID persisted.
+ * Always executed in the non-transaction context.
+ * This is used for metrics, so no retries are attempted.
+ *
+ * @return the last persisted snapshot ID. It returns 0 if no rows are found.
+ */
+ private long getCurrentAuthzPathsSnapshotID() throws Exception {
+ return tm.executeTransaction(
+ new TransactionBlock<Long>() {
+ @Override
+ public Long execute(PersistenceManager pm) throws Exception {
+ return getCurrentAuthzPathsSnapshotID(pm);
+ }
+ }
+ );
+ }
+
/**
* Adds the authzObj and with a set of paths into the authzObj -> [Paths] mapping.
* As well as persist the corresponding delta path change to MSentryPathChange
http://git-wip-us.apache.org/repos/asf/sentry/blob/03705977/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/service/thrift/SentryMetrics.java
----------------------------------------------------------------------
diff --git a/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/service/thrift/SentryMetrics.java b/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/service/thrift/SentryMetrics.java
index 9d42d2e..32a0664 100644
--- a/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/service/thrift/SentryMetrics.java
+++ b/sentry-provider/sentry-provider-db/src/main/java/org/apache/sentry/provider/db/service/thrift/SentryMetrics.java
@@ -145,7 +145,14 @@ public final class SentryMetrics {
sentryStore.getPrivilegeCountGauge());
addGauge(SentryStore.class, "group_count", sentryStore.getGroupCountGauge());
addGauge(SentryStore.class, "hms.waiters", sentryStore.getHMSWaitersCountGauge());
- addGauge(SentryStore.class, "hms.notification.id", sentryStore.getLastNotificationIdGauge());
+ addGauge(SentryStore.class, "hms.notification.id",
+ sentryStore.getLastNotificationIdGauge());
+ addGauge(SentryStore.class, "hms.snapshot.paths.id",
+ sentryStore.getLastPathsSnapshotIdGauge());
+ addGauge(SentryStore.class, "hms.perm.change.id",
+ sentryStore.getPermChangeIdGauge());
+ addGauge(SentryStore.class, "hms.psth.change.id",
+ sentryStore.getPathChangeIdGauge());
gaugesAdded = true;
}
}