Incorrect initialization of thread local variable inside IOContext ( 
implementation is not threadsafe ) 
--------------------------------------------------------------------------------------------------------

                 Key: HIVE-1647
                 URL: https://issues.apache.org/jira/browse/HIVE-1647
             Project: Hadoop Hive
          Issue Type: Bug
          Components: Server Infrastructure
    Affects Versions: 0.5.0
            Reporter: Raman Grover
             Fix For: 0.3.1


Bug in org.apache.hadoop.hive.ql.io.IOContext
in relation to initialization of thread local variable.
 
public class IOContext {
 
  private static ThreadLocal<IOContext> threadLocal = new 
ThreadLocal<IOContext>(){ };
 
  static {
    if (threadLocal.get() == null) {
      threadLocal.set(new IOContext());
    }
  }
 
In a multi-threaded environment, the thread that gets to load the class first 
for the JVM (assuming threads share the classloader),
gets to initialize itself correctly by executing the code in the static block. 
Once the class is loaded, 
any subsequent threads would  have their respective threadlocal variable as 
null.  Since IOContext
is set during initialization of HiveRecordReader, In a scenario where multiple 
threads get to acquire
 an instance of HiveRecordReader, it would result in a NPE for all but the 
first thread that gets to load the class in the VM.
 
Is the above scenario of multiple threads initializing HiveRecordReader a 
typical one ?  or we could just provide the following fix...
 
  private static ThreadLocal<IOContext> threadLocal = new 
ThreadLocal<IOContext>(){
    protected synchronized IOContext initialValue() {
      return new IOContext();
    }  
  };


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to