This is an automated email from the ASF dual-hosted git repository.
dkuzmenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new 6dc569da2eb HIVE-28239: Fix bug on
HMSHandler#checkLimitNumberOfPartitions (Wechar Yu, reviewed by Denys Kuzmenko)
6dc569da2eb is described below
commit 6dc569da2eb570fda76d2edb95704c6ba15a7924
Author: Wechar Yu <[email protected]>
AuthorDate: Tue May 21 21:54:03 2024 +0800
HIVE-28239: Fix bug on HMSHandler#checkLimitNumberOfPartitions (Wechar Yu,
reviewed by Denys Kuzmenko)
Closes #5246
---
.../apache/hadoop/hive/metastore/HMSHandler.java | 49 +++++++++-------------
.../hive/metastore/client/TestListPartitions.java | 28 ++++++++++---
2 files changed, 42 insertions(+), 35 deletions(-)
diff --git
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
index c77daf96fac..486830fd0bb 100644
---
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
+++
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java
@@ -5562,44 +5562,36 @@ public class HMSHandler extends FacebookBase implements
IHMSHandler {
private void checkLimitNumberOfPartitionsByFilter(String catName, String
dbName,
String tblName, String
filterString,
- int maxParts) throws
TException {
- if (isPartitionLimitEnabled()) {
+ int requestMax) throws
TException {
+ if (exceedsPartitionFetchLimit(requestMax)) {
checkLimitNumberOfPartitions(tblName,
get_num_partitions_by_filter(prependCatalogToDbName(
- catName, dbName, conf), tblName, filterString), maxParts);
+ catName, dbName, conf), tblName, filterString));
}
}
private void checkLimitNumberOfPartitionsByPs(String catName, String dbName,
String tblName,
- List<String> partVals, int
maxParts)
+ List<String> partVals, int
requestMax)
throws TException {
- if (isPartitionLimitEnabled()) {
+ if (exceedsPartitionFetchLimit(requestMax)) {
checkLimitNumberOfPartitions(tblName, getNumPartitionsByPs(catName,
dbName, tblName,
- partVals), maxParts);
+ partVals));
}
}
- private boolean isPartitionLimitEnabled() {
- int partitionLimit = MetastoreConf.getIntVar(conf,
ConfVars.LIMIT_PARTITION_REQUEST);
- return partitionLimit > -1;
- }
-
- // Check request partition limit iff:
+ // Check input count exceeding partition limit iff:
// 1. partition limit is enabled.
- // 2. request size is greater than the limit.
- private boolean needCheckPartitionLimit(int requestSize) {
+ // 2. input count is greater than the limit.
+ private boolean exceedsPartitionFetchLimit(int count) {
int partitionLimit = MetastoreConf.getIntVar(conf,
ConfVars.LIMIT_PARTITION_REQUEST);
- return partitionLimit > -1 && (requestSize < 0 || requestSize >
partitionLimit);
+ return partitionLimit > -1 && (count < 0 || count > partitionLimit);
}
- private void checkLimitNumberOfPartitions(String tblName, int numPartitions,
int maxToFetch) throws MetaException {
- if (isPartitionLimitEnabled()) {
+ private void checkLimitNumberOfPartitions(String tblName, int numPartitions)
throws MetaException {
+ if (exceedsPartitionFetchLimit(numPartitions)) {
int partitionLimit = MetastoreConf.getIntVar(conf,
ConfVars.LIMIT_PARTITION_REQUEST);
- int partitionRequest = (maxToFetch < 0) ? numPartitions : maxToFetch;
- if (partitionRequest > partitionLimit) {
- String configName = ConfVars.LIMIT_PARTITION_REQUEST.toString();
- throw new
MetaException(String.format(PARTITION_NUMBER_EXCEED_LIMIT_MSG, partitionRequest,
- tblName, partitionLimit, configName));
- }
+ String configName = ConfVars.LIMIT_PARTITION_REQUEST.toString();
+ throw new MetaException(String.format(PARTITION_NUMBER_EXCEED_LIMIT_MSG,
numPartitions,
+ tblName, partitionLimit, configName));
}
}
@@ -7225,13 +7217,12 @@ public class HMSHandler extends FacebookBase implements
IHMSHandler {
RawStore rs = getMS();
try {
authorizeTableForPartitionMetadata(catName, dbName, tblName);
- if (needCheckPartitionLimit(args.getMax())) {
+ if (exceedsPartitionFetchLimit(args.getMax())) {
// Since partition limit is configured, we need fetch at most (limit +
1) partition names
- int requestMax = args.getMax();
int max = MetastoreConf.getIntVar(conf,
ConfVars.LIMIT_PARTITION_REQUEST) + 1;
args = new
GetPartitionsArgs.GetPartitionsArgsBuilder(args).max(max).build();
List<String> partNames = rs.listPartitionNamesByFilter(catName,
dbName, tblName, args);
- checkLimitNumberOfPartitions(tblName, partNames.size(), requestMax);
+ checkLimitNumberOfPartitions(tblName, partNames.size());
ret = rs.getPartitionsByNames(catName, dbName, tblName,
new
GetPartitionsArgs.GetPartitionsArgsBuilder(args).partNames(partNames).build());
} else {
@@ -7358,11 +7349,11 @@ public class HMSHandler extends FacebookBase implements
IHMSHandler {
List<Partition> partitions = new LinkedList<>();
boolean hasUnknownPartitions = false;
RawStore rs = getMS();
- if (needCheckPartitionLimit(args.getMax())) {
+ if (exceedsPartitionFetchLimit(args.getMax())) {
// Since partition limit is configured, we need fetch at most (limit +
1) partition names
int max = MetastoreConf.getIntVar(conf,
ConfVars.LIMIT_PARTITION_REQUEST) + 1;
List<String> partNames = rs.listPartitionNames(catName, dbName, tblName,
args.getDefaultPartName(), args.getExpr(), null, max);
- checkLimitNumberOfPartitions(tblName, partNames.size(), args.getMax());
+ checkLimitNumberOfPartitions(tblName, partNames.size());
partitions = rs.getPartitionsByNames(catName, dbName, tblName,
new
GetPartitionsArgs.GetPartitionsArgsBuilder(args).partNames(partNames).build());
} else {
@@ -7462,7 +7453,7 @@ public class HMSHandler extends FacebookBase implements
IHMSHandler {
fireReadTablePreEvent(parsedCatName, parsedDbName, tblName);
- checkLimitNumberOfPartitions(tblName, args.getPartNames().size(), -1);
+ checkLimitNumberOfPartitions(tblName, args.getPartNames().size());
ret = getMS().getPartitionsByNames(parsedCatName, parsedDbName, tblName,
args);
ret = FilterUtils.filterPartitionsIfEnabled(isServerFilterEnabled,
filterHook, ret);
table = getTable(parsedCatName, parsedDbName, tblName);
diff --git
a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestListPartitions.java
b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestListPartitions.java
index 91ba1c311f3..abaf28217ca 100644
---
a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestListPartitions.java
+++
b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/client/TestListPartitions.java
@@ -203,6 +203,22 @@ public class TestListPartitions extends
MetaStoreClientTest {
return new ReturnTable(t, testValues);
}
+ private ReturnTable createTableNParts(IMetaStoreClient client, boolean
authOn, int nParts)
+ throws Exception {
+ Table t = createTestTable(client, DB_NAME, TABLE_NAME,
Lists.newArrayList("yyyy", "mm", "dd"),
+ authOn);
+ List<List<String>> testValues = new ArrayList<>(nParts);
+ for (int i = 0; i < nParts; i++) {
+ testValues.add(Lists.newArrayList("2017", "01", String.valueOf(i)));
+ }
+
+ for(List<String> vals : testValues) {
+ addPartition(client, t, vals);
+ }
+
+ return new ReturnTable(t, testValues);
+ }
+
protected ReturnTable createTable4PartColsParts(IMetaStoreClient client)
throws
Exception {
return createTable4PartColsPartsGeneric(client, false);
@@ -324,7 +340,7 @@ public class TestListPartitions extends MetaStoreClientTest
{
@Test(expected = MetaException.class)
@ConditionalIgnoreOnSessionHiveMetastoreClient
public void testListPartitionsAllHighMaxParts() throws Exception {
- createTable3PartCols1Part(client);
+ createTableNParts(client, false, 101);
List<Partition> partitions = client.listPartitions(DB_NAME, TABLE_NAME,
(short)101);
assertTrue(partitions.isEmpty());
}
@@ -496,7 +512,7 @@ public class TestListPartitions extends MetaStoreClientTest
{
@Test(expected = MetaException.class)
@ConditionalIgnoreOnSessionHiveMetastoreClient
public void testListPartitionSpecsHighMaxParts() throws Exception {
- createTable4PartColsParts(client);
+ createTableNParts(client, false, 101);
client.listPartitionSpecs(DB_NAME, TABLE_NAME, 101);
}
@@ -562,7 +578,7 @@ public class TestListPartitions extends MetaStoreClientTest
{
@Test(expected = MetaException.class)
@ConditionalIgnoreOnSessionHiveMetastoreClient
public void testListPartitionsWithAuthHighMaxParts() throws Exception {
- createTable4PartColsParts(client);
+ createTableNParts(client, false, 101);
client.listPartitionsWithAuthInfo(DB_NAME, TABLE_NAME, (short)101, "",
Lists.newArrayList());
}
@@ -754,7 +770,7 @@ public class TestListPartitions extends MetaStoreClientTest
{
@Test(expected = MetaException.class)
@ConditionalIgnoreOnSessionHiveMetastoreClient
public void testListPartitionsWithAuthByValuesHighMaxParts() throws
Exception {
- createTable4PartColsParts(client);
+ createTableNParts(client, false, 101);
client.listPartitionsWithAuthInfo(DB_NAME, TABLE_NAME, Lists
.newArrayList("2017"), (short) 101, "", Lists.newArrayList());
}
@@ -982,7 +998,7 @@ public class TestListPartitions extends MetaStoreClientTest
{
@Test(expected = MetaException.class)
@ConditionalIgnoreOnSessionHiveMetastoreClient
public void testListPartitionsByFilterHighMaxParts() throws Exception {
- createTable4PartColsParts(client);
+ createTableNParts(client, false, 101);
client.listPartitionsByFilter(DB_NAME, TABLE_NAME, "yyyy=\"2017\"",
(short)101);
}
@@ -1095,7 +1111,7 @@ public class TestListPartitions extends
MetaStoreClientTest {
@Test(expected = MetaException.class)
@ConditionalIgnoreOnSessionHiveMetastoreClient
public void testListPartitionSpecsByFilterHighMaxParts() throws Exception {
- createTable4PartColsParts(client);
+ createTableNParts(client, false, 101);
client.listPartitionSpecsByFilter(DB_NAME, TABLE_NAME, "yyyy=\"2017\"",
101);
}