diff --git standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java index 213dd9eb5e..ad7a9f058f 100644 --- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java +++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java @@ -61,6 +61,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -732,6 +733,27 @@ public Partition alterPartition(RawStore msdb, Warehouse wh, String catName, Str environmentContext, null, -1, null); } + private List getExistingPartitions(final RawStore msdb, + final List new_parts, final Table tbl, final String catName, + final String dbname, final String name) + throws MetaException, NoSuchObjectException, InvalidOperationException { + + // Get list of partition values + List partValues = new LinkedList<>(); + for (Partition tmpPart : new_parts) { + partValues.add(Warehouse.makePartName(tbl.getPartitionKeys(), tmpPart.getValues())); + } + + // Get existing partitions from store + List oldParts = msdb.getPartitionsByNames(catName, dbname, name, partValues); + if (new_parts.size() != oldParts.size()) { + throw new InvalidOperationException("Alter partition operation failed: " + + "new parts size " + new_parts.size() + + " not matching with old parts size " + oldParts.size()); + } + return oldParts; + } + @Override public List alterPartitions(final RawStore msdb, Warehouse wh, final String catName, final String dbname, final String name, @@ -740,7 +762,8 @@ public Partition alterPartition(RawStore msdb, Warehouse wh, String catName, Str String writeIdList, long writeId, IHMSHandler handler) throws InvalidOperationException, InvalidObjectException, AlreadyExistsException, MetaException { - List oldParts = new ArrayList<>(); + LOG.info("Starting alterPartitions"); + List oldParts = null; List> partValsList = new ArrayList<>(); List transactionalListeners = null; if (handler != null) { @@ -761,6 +784,15 @@ public Partition alterPartition(RawStore msdb, Warehouse wh, String catName, Str blockPartitionLocationChangesOnReplSource(msdb.getDatabase(catName, dbname), tbl, environmentContext); + oldParts = getExistingPartitions(msdb, new_parts, tbl, + catName, dbname, name); + LOG.info("Got existing partitions"); + + Map oldPartMap = new HashMap<>(); + for (Partition oldPart : oldParts) { + oldPartMap.put(oldPart.getValues().toString(), oldPart); + } + for (Partition tmpPart: new_parts) { // Set DDL time to now if not specified if (tmpPart.getParameters() == null || @@ -770,8 +802,7 @@ public Partition alterPartition(RawStore msdb, Warehouse wh, String catName, Str .currentTimeMillis() / 1000)); } - Partition oldTmpPart = msdb.getPartition(catName, dbname, name, tmpPart.getValues()); - oldParts.add(oldTmpPart); + Partition oldTmpPart = oldPartMap.get(tmpPart.getValues().toString()); partValsList.add(tmpPart.getValues()); if (MetaStoreServerUtils.requireCalStats(oldTmpPart, tmpPart, tbl, environmentContext)) { @@ -791,6 +822,7 @@ public Partition alterPartition(RawStore msdb, Warehouse wh, String catName, Str } } + LOG.info("update partitions"); msdb.alterPartitions(catName, dbname, name, partValsList, new_parts, writeId, writeIdList); Iterator oldPartsIt = oldParts.iterator(); for (Partition newPart : new_parts) { @@ -818,6 +850,7 @@ public Partition alterPartition(RawStore msdb, Warehouse wh, String catName, Str } } + LOG.info("Finished alterPartitions"); return oldParts; } diff --git standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java index 862a9c8b3b..428b103b83 100644 --- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java +++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java @@ -4270,12 +4270,21 @@ public void updateCreationMetadata(String catName, String dbname, String tablena * @param newPart Partition object containing new information */ private Partition alterPartitionNoTxn(String catName, String dbname, String name, - List part_vals, Partition newPart, String validWriteIds, Ref oldCd) + List part_vals, Partition newPart, String validWriteIds, Ref oldCd) + throws InvalidObjectException, MetaException { + MTable table = this.getMTable(newPart.getCatName(), newPart.getDbName(), newPart.getTableName()); + return alterPartitionNoTxn(catName, dbname, name, part_vals, newPart, + validWriteIds, oldCd, table); + } + + private Partition alterPartitionNoTxn(String catName, String dbname, + String name, List part_vals, Partition newPart, + String validWriteIds, + Ref oldCd, MTable table) throws InvalidObjectException, MetaException { catName = normalizeIdentifier(catName); name = normalizeIdentifier(name); dbname = normalizeIdentifier(dbname); - MTable table = this.getMTable(newPart.getCatName(), newPart.getDbName(), newPart.getTableName()); MPartition oldp = getMPartition(catName, dbname, name, part_vals); MPartition newp = convertToMPart(newPart, table, false); MColumnDescriptor oldCD = null;