Repository: sentry
Updated Branches:
  refs/heads/master 74676535b -> 170b0c38b


SENTRY-2419: Log where sentry stands in the process of persisting the snpashot 
(Arjun Mishra reviewed by Na Li and Sergio Pena)

Change-Id: I0fa1af7ab45a3a27d9c9984fa96634f89f28316c


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

Branch: refs/heads/master
Commit: 170b0c38b5e9011cb739f1ebf01eb68424685ff9
Parents: 7467653
Author: amishra <amis...@cloudera.com>
Authored: Wed Oct 17 17:12:35 2018 -0500
Committer: amishra <amis...@cloudera.com>
Committed: Wed Oct 17 17:12:59 2018 -0500

----------------------------------------------------------------------
 .../api/service/thrift/SentryMetrics.java       |  6 +-
 .../db/service/persistent/HMSFollower.java      |  2 +-
 .../db/service/persistent/SentryStore.java      | 68 ++++++++++++++++++++
 .../persistent/SentryStoreInterface.java        | 10 +++
 .../thrift/TestSentryPolicyStoreProcessor.java  | 12 ++++
 5 files changed, 96 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sentry/blob/170b0c38/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/api/service/thrift/SentryMetrics.java
----------------------------------------------------------------------
diff --git 
a/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/api/service/thrift/SentryMetrics.java
 
b/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/api/service/thrift/SentryMetrics.java
index d34340c..214d78c 100644
--- 
a/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/api/service/thrift/SentryMetrics.java
+++ 
b/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/api/service/thrift/SentryMetrics.java
@@ -175,8 +175,12 @@ public final class SentryMetrics {
           sentryStore.getLastPathsSnapshotIdGauge());
       addGauge(SentryStore.class, "hms.perm.change.id",
           sentryStore.getPermChangeIdGauge());
-      addGauge(SentryStore.class, "hms.psth.change.id",
+      addGauge(SentryStore.class, "hms.path.change.id",
           sentryStore.getPathChangeIdGauge());
+      addGauge(SentryStore.class, "hms.authz_objects_count",
+          sentryStore.getAuthzObjectsCountGauge());
+      addGauge(SentryStore.class, "hms.authz_paths_count",
+          sentryStore.getAuthzPathsCountGauge());
       gaugesAdded = true;
     }
   }

http://git-wip-us.apache.org/repos/asf/sentry/blob/170b0c38/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/HMSFollower.java
----------------------------------------------------------------------
diff --git 
a/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/HMSFollower.java
 
b/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/HMSFollower.java
index b6dca7a..e5cb5b0 100644
--- 
a/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/HMSFollower.java
+++ 
b/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/HMSFollower.java
@@ -419,7 +419,7 @@ public class HMSFollower implements Runnable, 
AutoCloseable, PubSub.Subscriber {
       }
       try {
         if (hdfsSyncEnabled) {
-          String logMessage = String.format("Persisting full snapshot for 
notification Id = %d", snapshotInfo.getId());
+          String logMessage = String.format("Persisting full snapshot for 
notification Id = %d. Number of authorization objects = %d", 
snapshotInfo.getId(), snapshotInfo.getPathImage().size());
           LOGGER.info(logMessage);
           
System.out.println(SentryServiceUtil.getCurrentTimeStampWithMessage(logMessage));
           sentryStore.persistFullPathsImage(snapshotInfo.getPathImage(), 
snapshotInfo.getId());

http://git-wip-us.apache.org/repos/asf/sentry/blob/170b0c38/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStore.java
----------------------------------------------------------------------
diff --git 
a/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStore.java
 
b/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStore.java
index 7a736ca..29f83a8 100644
--- 
a/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStore.java
+++ 
b/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStore.java
@@ -189,6 +189,9 @@ public class SentryStore implements SentryStoreInterface {
    */
   private final CounterWait counterWait;
 
+  // 5 min interval
+  private final long printSnapshotPersistTimeInterval = 300000;
+
   private final boolean ownerPrivilegeWithGrant;
   public static Properties getDataNucleusProperties(Configuration conf)
           throws SentrySiteConfigurationException, IOException {
@@ -475,6 +478,34 @@ public class SentryStore implements SentryStoreInterface {
   }
 
   /**
+   * @return Number of authz objects persisted
+   */
+  public Gauge<Long> getAuthzObjectsCountGauge() {
+    return () -> {
+      try {
+        return getCount(MAuthzPathsMapping.class);
+      } catch (Exception e) {
+        LOGGER.error("Cannot read AUTHZ_PATHS_MAPPING table", e);
+        return NOTIFICATION_UNKNOWN;
+      }
+    };
+  }
+
+  /**
+   * @return Number of authz paths persisted
+   */
+  public Gauge<Long> getAuthzPathsCountGauge() {
+    return () -> {
+      try {
+        return getCount(MPath.class);
+      } catch (Exception e) {
+        LOGGER.error("Cannot read AUTHZ_PATH table", e);
+        return NOTIFICATION_UNKNOWN;
+      }
+    };
+  }
+
+  /**
    * @return number of threads waiting for HMS notifications to be processed
    */
   public Gauge<Integer> getHMSWaitersCountGauge() {
@@ -3390,6 +3421,14 @@ public class SentryStore implements SentryStoreInterface 
{
       final long notificationID) throws Exception {
     tm.executeTransactionWithRetry(
             pm -> {
+
+              int totalNumberOfObjectsToPersist = authzPaths.size();
+              int totalNumberOfPathsToPersist = 
authzPaths.values().stream().mapToInt(Collection::size).sum();
+              int objectsPersistedCount = 0, pathsPersistedCount = 0;
+
+              logPersistingFullSnapshotState(totalNumberOfObjectsToPersist,
+                  totalNumberOfPathsToPersist, objectsPersistedCount, 
pathsPersistedCount);
+
               pm.setDetachAllOnCommit(false); // No need to detach objects
               deleteNotificationsSince(pm, notificationID + 1);
 
@@ -3401,13 +3440,42 @@ public class SentryStore implements 
SentryStoreInterface {
               long nextSnapshotID = snapshotID + 1;
               pm.makePersistent(new MAuthzPathsSnapshotId(nextSnapshotID));
               LOGGER.info("Attempting to commit new HMS snapshot with ID = 
{}", nextSnapshotID);
+
+              long lastProgressTime = System.currentTimeMillis();
+
               for (Map.Entry<String, Collection<String>> authzPath : 
authzPaths.entrySet()) {
                 pm.makePersistent(new MAuthzPathsMapping(nextSnapshotID, 
authzPath.getKey(), authzPath.getValue()));
+
+                objectsPersistedCount++;
+                pathsPersistedCount = pathsPersistedCount + 
authzPath.getValue().size();
+
+                long currentTime = System.currentTimeMillis();
+                if ((currentTime - lastProgressTime) > 
printSnapshotPersistTimeInterval) {
+
+                  logPersistingFullSnapshotState(totalNumberOfObjectsToPersist,
+                      totalNumberOfPathsToPersist, objectsPersistedCount, 
pathsPersistedCount);
+
+                  lastProgressTime = currentTime;
+                }
               }
               return null;
             });
   }
 
+  public void logPersistingFullSnapshotState(int totalNumberOfObjectsToPersist,
+      int totalNumberOfPathsToPersist, int objectsPersistedCount, int 
pathsPersistedCount) {
+
+    LOGGER.info(String.format("Persisting HMS Paths on Snapshot: "
+            + "authz_objs_persisted=%d(%.2f%%) 
authz_paths_persisted=%d(%.2f%%) "
+            + "authz_objs_total=%d authz_paths_total=%d",
+        objectsPersistedCount,
+        totalNumberOfObjectsToPersist > 0 ? 100 * ((double) 
objectsPersistedCount
+            / totalNumberOfObjectsToPersist) : 0,
+        pathsPersistedCount, totalNumberOfPathsToPersist > 0 ? 100 * ((double) 
pathsPersistedCount
+            / totalNumberOfPathsToPersist) : 0,
+        totalNumberOfObjectsToPersist, totalNumberOfPathsToPersist));
+  }
+
   /**
    * Get the last authorization path snapshot ID persisted.
    * Always executed in the transaction context.

http://git-wip-us.apache.org/repos/asf/sentry/blob/170b0c38/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStoreInterface.java
----------------------------------------------------------------------
diff --git 
a/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStoreInterface.java
 
b/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStoreInterface.java
index 3a68eb6..6217719 100644
--- 
a/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStoreInterface.java
+++ 
b/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/SentryStoreInterface.java
@@ -473,6 +473,16 @@ public interface SentryStoreInterface {
   Gauge<Long> getPathChangeIdGauge();
 
   /**
+   * @return Number of objects persisted
+   */
+  Gauge<Long> getAuthzObjectsCountGauge();
+
+  /**
+   * @return Number of objects persisted
+   */
+  Gauge<Long> getAuthzPathsCountGauge();
+
+  /**
    * Assign a given role to a set of groups. As well as persist the 
corresponding
    * permission change to MSentryPermChange table in a single transaction.
    *

http://git-wip-us.apache.org/repos/asf/sentry/blob/170b0c38/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/api/service/thrift/TestSentryPolicyStoreProcessor.java
----------------------------------------------------------------------
diff --git 
a/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/api/service/thrift/TestSentryPolicyStoreProcessor.java
 
b/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/api/service/thrift/TestSentryPolicyStoreProcessor.java
index 059621a..16ff79e 100644
--- 
a/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/api/service/thrift/TestSentryPolicyStoreProcessor.java
+++ 
b/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/api/service/thrift/TestSentryPolicyStoreProcessor.java
@@ -137,6 +137,18 @@ public class TestSentryPolicyStoreProcessor {
         return 0L;
       }
     });
+    Mockito.when(sentryStore.getAuthzObjectsCountGauge()).thenReturn(new 
Gauge< Long >() {
+      @Override
+      public Long getValue() {
+        return 0L;
+      }
+    });
+    Mockito.when(sentryStore.getAuthzPathsCountGauge()).thenReturn(new Gauge< 
Long >() {
+      @Override
+      public Long getValue() {
+        return 0L;
+      }
+    });
 
     Mockito.doAnswer((invocation) -> {
       long id = (long) invocation.getArguments()[0];

Reply via email to