Author: brock
Date: Sun Nov 23 17:55:38 2014
New Revision: 1641234
URL: http://svn.apache.org/r1641234
Log:
HIVE-8917 - HIVE-5679 adds two thread safety problems (Sergey Shelukhin via
Brock)
Modified:
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/parser/ExpressionTree.java
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/parser/Filter.g
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
Modified:
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
URL:
http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java?rev=1641234&r1=1641233&r2=1641234&view=diff
==============================================================================
---
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
(original)
+++
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
Sun Nov 23 17:55:38 2014
@@ -229,11 +229,15 @@ public class HiveMetaStore extends Thrif
private static boolean isMetaStoreRemote = false;
/** A fixed date format to be used for hive partition column values. */
- public static final DateFormat PARTITION_DATE_FORMAT;
- static {
- PARTITION_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
- PARTITION_DATE_FORMAT.setLenient(false); // Without this, 2020-20-20
becomes 2021-08-20.
- }
+ public static final ThreadLocal<DateFormat> PARTITION_DATE_FORMAT =
+ new ThreadLocal<DateFormat>() {
+ @Override
+ protected DateFormat initialValue() {
+ DateFormat val = new SimpleDateFormat("yyyy-MM-dd");
+ val.setLenient(false); // Without this, 2020-20-20 becomes 2021-08-20.
+ return val;
+ };
+ };
/**
* default port on which to start the Hive server
Modified:
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
URL:
http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java?rev=1641234&r1=1641233&r2=1641234&view=diff
==============================================================================
---
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
(original)
+++
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
Sun Nov 23 17:55:38 2014
@@ -980,7 +980,7 @@ class MetaStoreDirectSql {
// TODO: Filter.g cannot parse a quoted date; try to parse date here
too.
try {
nodeValue = new java.sql.Date(
-
HiveMetaStore.PARTITION_DATE_FORMAT.parse((String)nodeValue).getTime());
+
HiveMetaStore.PARTITION_DATE_FORMAT.get().parse((String)nodeValue).getTime());
valType = FilterType.Date;
} catch (ParseException pe) { // do nothing, handled below - types
will mismatch
}
Modified:
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/parser/ExpressionTree.java
URL:
http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/parser/ExpressionTree.java?rev=1641234&r1=1641233&r2=1641234&view=diff
==============================================================================
---
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/parser/ExpressionTree.java
(original)
+++
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/parser/ExpressionTree.java
Sun Nov 23 17:55:38 2014
@@ -446,7 +446,7 @@ public class ExpressionTree {
// columns have been excluded above, so it will either compare w/string
or fail.
Object val = value;
if (value instanceof Date) {
- val = HiveMetaStore.PARTITION_DATE_FORMAT.format((Date)value);
+ val = HiveMetaStore.PARTITION_DATE_FORMAT.get().format((Date)value);
}
boolean isStringValue = val instanceof String;
if (!isStringValue && (!isIntegralSupported || !(val instanceof Long))) {
Modified:
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/parser/Filter.g
URL:
http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/parser/Filter.g?rev=1641234&r1=1641233&r2=1641234&view=diff
==============================================================================
---
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/parser/Filter.g
(original)
+++
hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/parser/Filter.g
Sun Nov 23 17:55:38 2014
@@ -46,11 +46,15 @@ import java.util.regex.Pattern;
public String errorMsg;
private static final Pattern datePattern =
Pattern.compile(".*(\\d\\d\\d\\d-\\d\\d-\\d\\d).*");
- private static final SimpleDateFormat dateFormat;
- static {
- dateFormat = new SimpleDateFormat("yyyy-MM-dd");
- dateFormat.setLenient(false);
- }
+ private static final ThreadLocal<SimpleDateFormat> dateFormat =
+ new ThreadLocal<SimpleDateFormat>() {
+ @Override
+ protected SimpleDateFormat initialValue() {
+ SimpleDateFormat val = new SimpleDateFormat("yyyy-MM-dd");
+ val.setLenient(false); // Without this, 2020-20-20 becomes 2021-08-20.
+ return val;
+ };
+ };
public static java.sql.Date ExtractDate (String input) {
Matcher m = datePattern.matcher(input);
@@ -58,7 +62,7 @@ import java.util.regex.Pattern;
return null;
}
try {
- return new java.sql.Date(dateFormat.parse(m.group(1)).getTime());
+ return new java.sql.Date(dateFormat.get().parse(m.group(1)).getTime());
} catch (ParseException pe) {
return null;
}
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java?rev=1641234&r1=1641233&r2=1641234&view=diff
==============================================================================
---
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
(original)
+++
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
Sun Nov 23 17:55:38 2014
@@ -1273,7 +1273,7 @@ public abstract class BaseSemanticAnalyz
} else {
throw new SemanticException("Unexpected date type " +
colValue.getClass());
}
- return HiveMetaStore.PARTITION_DATE_FORMAT.format(value);
+ return HiveMetaStore.PARTITION_DATE_FORMAT.get().format(value);
}
protected Database getDatabase(String dbName) throws SemanticException {