This is an automated email from the ASF dual-hosted git repository. hahao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sentry.git
The following commit(s) were added to refs/heads/master by this push: new 6b070c5 SENTRY-2471: Table rename should sync Sentry privilege even without location information (Hao Hao, reviewed by Na Li) 6b070c5 is described below commit 6b070c55341a4a62ae2619d51ce87892056a7351 Author: Hao Hao <hao....@cloudera.com> AuthorDate: Sun Dec 9 16:53:05 2018 -0800 SENTRY-2471: Table rename should sync Sentry privilege even without location information (Hao Hao, reviewed by Na Li) --- .../service/persistent/NotificationProcessor.java | 51 ++++++++++++---------- .../persistent/TestNotificationProcessor.java | 45 +++++++++++++++++++ 2 files changed, 73 insertions(+), 23 deletions(-) diff --git a/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/NotificationProcessor.java b/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/NotificationProcessor.java index 377c673..bbfed62 100644 --- a/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/NotificationProcessor.java +++ b/sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/service/persistent/NotificationProcessor.java @@ -378,34 +378,18 @@ final class NotificationProcessor { String oldTableName = alterTableMessage.getTable(); String newDbName = event.getDbName(); String newTableName = event.getTableName(); - String oldLocation = alterTableMessage.getOldLocation(); - String newLocation = alterTableMessage.getNewLocation(); - if ((oldDbName == null) - || (oldTableName == null) - || (newDbName == null) - || (newTableName == null) - || (oldLocation == null) - || (newLocation == null)) { + if ((oldDbName == null) || + (oldTableName == null) || + (newDbName == null) || + (newTableName == null)) { LOGGER.warn(String.format("Alter table notification ignored since event " - + "has incomplete information. oldDbName = %s, oldTableName = %s, oldLocation = %s, " - + "newDbName = %s, newTableName = %s, newLocation = %s", + + "has incomplete information. oldDbName = %s, oldTableName = %s, " + + "newDbName = %s, newTableName = %s", StringUtils.defaultIfBlank(oldDbName, "null"), StringUtils.defaultIfBlank(oldTableName, "null"), - StringUtils.defaultIfBlank(oldLocation, "null"), StringUtils.defaultIfBlank(newDbName, "null"), - StringUtils.defaultIfBlank(newTableName, "null"), - StringUtils.defaultIfBlank(newLocation, "null"))); - return false; - } - - if ((oldDbName.equals(newDbName)) - && (oldTableName.equals(newTableName)) - && (oldLocation.equals(newLocation))) { - LOGGER.debug(String.format("Alter table notification ignored as neither name nor " - + "location has changed: oldAuthzObj = %s, oldLocation = %s, newAuthzObj = %s, " - + "newLocation = %s", oldDbName + "." + oldTableName, oldLocation, - newDbName + "." + newTableName, newLocation)); + StringUtils.defaultIfBlank(newTableName, "null"))); return false; } @@ -425,6 +409,27 @@ final class NotificationProcessor { if (!hdfsSyncEnabled) { return false; } + + String oldLocation = alterTableMessage.getOldLocation(); + String newLocation = alterTableMessage.getNewLocation(); + if (oldLocation == null || newLocation == null) { + LOGGER.warn(String.format("HMS path update ignored since event has incomplete " + + "path information. oldLocation = %s, newLocation = %s", + StringUtils.defaultIfBlank(oldLocation, "null"), + StringUtils.defaultIfBlank(newLocation, "null"))); + return false; + } + + if ((oldDbName.equals(newDbName)) && + (oldTableName.equals(newTableName)) && + (oldLocation.equals(newLocation))) { + LOGGER.debug(String.format("Alter table notification ignored as neither name nor " + + "location has changed: oldAuthzObj = %s, oldLocation = %s, newAuthzObj = %s, " + + "newLocation = %s", oldDbName + "." + oldTableName, oldLocation, + newDbName + "." + newTableName, newLocation)); + return false; + } + String oldAuthzObj = oldDbName + "." + oldTableName; String newAuthzObj = newDbName + "." + newTableName; renameAuthzPath(oldAuthzObj, newAuthzObj, oldLocation, newLocation, event); diff --git a/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/provider/db/service/persistent/TestNotificationProcessor.java b/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/provider/db/service/persistent/TestNotificationProcessor.java index 18e5ddf..dda1c46 100644 --- a/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/provider/db/service/persistent/TestNotificationProcessor.java +++ b/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/provider/db/service/persistent/TestNotificationProcessor.java @@ -340,6 +340,51 @@ public class TestNotificationProcessor { } @Test + // Makes sure that appropriate sentry store methods are invoked when process events that rename + // tables without location information. + public void testRenameTableWithoutLocation() throws Exception { + String dbName = "db1"; + String tableName = "table1"; + + String newDbName = "db1"; + String newTableName = "table2"; + + Configuration authConf = new Configuration(); + // enable HDFS sync, so perm and path changes will be saved into DB + authConf.set(ServiceConstants.ServerConfig.PROCESSOR_FACTORIES, "org.apache.sentry.hdfs.SentryHDFSServiceProcessorFactory"); + authConf.set(ServiceConstants.ServerConfig.SENTRY_POLICY_STORE_PLUGINS, "org.apache.sentry.hdfs.SentryPlugin"); + + notificationProcessor = new NotificationProcessor(sentryStore, + hiveInstance, authConf); + + // Create notification event + StorageDescriptor sd = new StorageDescriptor(); + NotificationEvent notificationEvent = new NotificationEvent(1, 0, + EventMessage.EventType.ALTER_TABLE.toString(), + messageFactory.buildAlterTableMessage( + new Table(tableName, dbName, null, 0, 0, 0, sd, null, null, null, null, null), + new Table(newTableName, newDbName, null, 0, 0, 0, sd, null, null, null, null, null)) + .toString()); + notificationEvent.setDbName(newDbName); + notificationEvent.setTableName(newTableName); + + notificationProcessor.processNotificationEvent(notificationEvent); + + TSentryAuthorizable authorizable = new TSentryAuthorizable(hiveInstance); + authorizable.setServer(hiveInstance); + authorizable.setDb(dbName); + authorizable.setTable(tableName); + + TSentryAuthorizable newAuthorizable = new TSentryAuthorizable(hiveInstance); + authorizable.setServer(hiveInstance); + newAuthorizable.setDb(newDbName); + newAuthorizable.setTable(newTableName); + + verify(sentryStore, times(1)).renamePrivilege(authorizable, newAuthorizable, + NotificationProcessor.getPermUpdatableOnRename(authorizable, newAuthorizable)); + } + + @Test /* Makes sure that appropriate sentry store methods are invoked when alter tables event is processed.