[ https://issues.apache.org/jira/browse/HIVE-26882?focusedWorklogId=835409&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-835409 ]
ASF GitHub Bot logged work on HIVE-26882: ----------------------------------------- Author: ASF GitHub Bot Created on: 22/Dec/22 22:57 Start Date: 22/Dec/22 22:57 Worklog Time Spent: 10m Work Description: szehon-ho commented on code in PR #3888: URL: https://github.com/apache/hive/pull/3888#discussion_r1055913042 ########## standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java: ########## @@ -6038,17 +6039,26 @@ public void alter_table_with_environment_context(final String dbname, throws InvalidOperationException, MetaException { String[] parsedDbName = parseDbName(dbname, conf); alter_table_core(parsedDbName[CAT_NAME], parsedDbName[DB_NAME], - name, newTable, envContext, null, null, null); + name, newTable, envContext, null, null, null, null, null); } private void alter_table_core(String catName, String dbname, String name, Table newTable, - EnvironmentContext envContext, String validWriteIdList, List<String> processorCapabilities, String processorId) + EnvironmentContext envContext, String validWriteIdList, List<String> processorCapabilities, + String processorId, String expectedPropertyKey, String expectedPropertyValue) Review Comment: Did you consider allowing a list of table properties here? ########## standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java: ########## @@ -187,6 +187,16 @@ public void alterTable(RawStore msdb, Warehouse wh, String catName, String dbnam TableName.getQualified(catName, dbname, name) + " doesn't exist"); } + String expectedKey = environmentContext != null && environmentContext.getProperties() != null ? + environmentContext.getProperties().get(hive_metastoreConstants.EXPECTED_PARAMETER_KEY) : null; + String expectedValue = environmentContext != null && environmentContext.getProperties() != null ? + environmentContext.getProperties().get(hive_metastoreConstants.EXPECTED_PARAMETER_VALUE) : null; + if (expectedKey != null && expectedValue != null + && !expectedValue.equals(oldt.getParameters().get(expectedKey))) { + throw new MetaException("The table has been modified. The parameter value for key '" + expectedKey + "' is '" Review Comment: For my understanding, this only works if a user has table lock while calling alter right? If user does not have lock, Hive has no internal lock to prevent two users from both getting their expected value and proceeding right? If so, maybe worth to add a javadoc on this method. Issue Time Tracking ------------------- Worklog Id: (was: 835409) Time Spent: 40m (was: 0.5h) > Allow transactional check of Table parameter before altering the Table > ---------------------------------------------------------------------- > > Key: HIVE-26882 > URL: https://issues.apache.org/jira/browse/HIVE-26882 > Project: Hive > Issue Type: Improvement > Components: Standalone Metastore > Reporter: Peter Vary > Priority: Major > Labels: pull-request-available > Time Spent: 40m > Remaining Estimate: 0h > > We should add the possibility to transactionally check if a Table parameter > is changed before altering the table in the HMS. > This would provide an alternative, less error-prone and faster way to commit > an Iceberg table, as the Iceberg table currently needs to: > - Create an exclusive lock > - Get the table metadata to check if the current snapshot is not changed > - Update the table metadata > - Release the lock > After the change these 4 HMS calls could be substituted with a single alter > table call. > Also we could avoid cases where the locks are left hanging by failed processes -- This message was sent by Atlassian Jira (v8.20.10#820010)