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 {


Reply via email to