Marta Kuczora created HIVE-19046:
------------------------------------
Summary: Refactor the common parts of the HiveMetastore
add_partition_core and add_partitions_pspec_core methods
Key: HIVE-19046
URL: https://issues.apache.org/jira/browse/HIVE-19046
Project: Hive
Issue Type: Improvement
Components: Metastore
Reporter: Marta Kuczora
Assignee: Marta Kuczora
This is a follow-up Jira of the
[HIVE-18696|https://issues.apache.org/jira/browse/HIVE-18696]
[review|https://reviews.apache.org/r/65716/].
The biggest part of these methods use the same code. It would make sense to
move this code part to a common method.
This code is almost the same in the two methods:
{code}
List<Future<Partition>> partFutures = Lists.newArrayList();
final Table table = tbl;
for (final Partition part : parts) {
if (!part.getTableName().equals(tblName) ||
!part.getDbName().equals(dbName)) {
throw new MetaException("Partition does not belong to target table "
+ dbName + "." + tblName + ": " + part);
}
boolean shouldAdd = startAddPartition(ms, part, ifNotExists);
if (!shouldAdd) {
existingParts.add(part);
LOG.info("Not adding partition " + part + " as it already exists");
continue;
}
final UserGroupInformation ugi;
try {
ugi = UserGroupInformation.getCurrentUser();
} catch (IOException e) {
throw new RuntimeException(e);
}
partFutures.add(threadPool.submit(new Callable<Partition>() {
@Override
public Partition call() throws Exception {
ugi.doAs(new PrivilegedExceptionAction<Object>() {
@Override
public Object run() throws Exception {
try {
boolean madeDir = createLocationForAddedPartition(table,
part);
if (addedPartitions.put(new PartValEqWrapper(part),
madeDir) != null) {
// Technically, for ifNotExists case, we could insert one
and discard the other
// because the first one now "exists", but it seems
better to report the problem
// upstream as such a command doesn't make sense.
throw new MetaException("Duplicate partitions in the
list: " + part);
}
initializeAddedPartition(table, part, madeDir);
} catch (MetaException e) {
throw new IOException(e.getMessage(), e);
}
return null;
}
});
return part;
}
}));
}
try {
for (Future<Partition> partFuture : partFutures) {
Partition part = partFuture.get();
if (part != null) {
newParts.add(part);
}
}
} catch (InterruptedException | ExecutionException e) {
// cancel other tasks
for (Future<Partition> partFuture : partFutures) {
partFuture.cancel(true);
}
throw new MetaException(e.getMessage());
}
{code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)